From 219827bde876d6c1940b5107aee2ea4165efb047 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Sun, 6 Oct 2019 12:55:01 +0300 Subject: [PATCH] rebuilt opus & opusfile from latest sources. --- VisualC/external/include/opus/opus.h | 81 +- VisualC/external/include/opus/opus_defines.h | 204 +- .../external/include/opus/opus_multistream.h | 14 +- .../external/include/opus/opus_projection.h | 568 ++ VisualC/external/include/opus/opus_types.h | 27 +- VisualC/external/lib/x64/LICENSE.opus.txt | 2 +- VisualC/external/lib/x64/libopus-0.dll | Bin 124928 -> 328704 bytes VisualC/external/lib/x64/libopusfile-0.dll | Bin 46592 -> 46592 bytes VisualC/external/lib/x86/LICENSE.opus.txt | 2 +- VisualC/external/lib/x86/libopus-0.dll | Bin 114688 -> 316928 bytes VisualC/external/lib/x86/libopusfile-0.dll | Bin 49664 -> 49664 bytes .../Opus.framework/Versions/A/Headers/opus.h | 81 +- .../Versions/A/Headers/opus_defines.h | 204 +- .../Versions/A/Headers/opus_multistream.h | 14 +- .../Versions/A/Headers/opus_projection.h | 568 ++ .../Versions/A/Headers/opus_types.h | 27 +- .../Frameworks/Opus.framework/Versions/A/Opus | Bin 276536 -> 860340 bytes .../Versions/A/Resources/Info.plist | 6 +- .../Versions/A/Resources/LICENSE.opus.txt | 2 +- .../OpusFile.framework/Versions/A/OpusFile | Bin 103152 -> 120724 bytes .../Versions/A/Resources/Info.plist | 6 +- .../opus-1.0.3/001-opus.git-9c7193e4.patch | 115 - .../opus-1.0.3/002-opus.git-a88d8365.patch | 28 - .../opus-1.0.3/003-opus.git-25b27a9c.patch | 78 - .../opus-1.0.3/004-opus.git-3499e78b.patch | 169 - .../opus-1.0.3/005-opus.git-70a3d641.patch | 49 - .../opus-1.0.3/006-opus.git-6e961737.patch | 32 - .../030-opus-1.0.3-decoder-only.diff | 716 -- .../050-opus-1.0.3-misc-port0.patch | 33 - .../051-opus-1.0.3-misc-port1.patch | 22 - external/opus-1.0.3/INSTALL | 1 - external/opus-1.0.3/Makefile.am | 193 - external/opus-1.0.3/Makefile.darwin | 70 - external/opus-1.0.3/Makefile.in | 2648 -------- external/opus-1.0.3/celt/bands.c | 1337 ---- external/opus-1.0.3/celt/celt.c | 2921 --------- external/opus-1.0.3/celt/celt.h | 117 - external/opus-1.0.3/celt/celt.vcxproj | 237 - external/opus-1.0.3/celt/celt.vcxproj.filters | 141 - external/opus-1.0.3/celt/celt_lpc.c | 188 - external/opus-1.0.3/celt/cwrs.c | 647 -- external/opus-1.0.3/celt/kiss_fft.c | 722 --- external/opus-1.0.3/celt/static_modes_fixed.h | 595 -- external/opus-1.0.3/celt/static_modes_float.h | 599 -- external/opus-1.0.3/celt_headers.mk | 31 - external/opus-1.0.3/celt_sources.mk | 17 - external/opus-1.0.3/configure.ac | 301 - external/opus-1.0.3/doc/Doxyfile.in | 1724 ----- external/opus-1.0.3/doc/footer.html | 20 - external/opus-1.0.3/missing | 331 - external/opus-1.0.3/opus.sln | 140 - external/opus-1.0.3/opus_headers.mk | 4 - external/opus-1.0.3/opus_sources.mk | 6 - external/opus-1.0.3/package_version | 1 - external/opus-1.0.3/silk/VQ_WMat_EC.c | 111 - external/opus-1.0.3/silk/control_SNR.c | 76 - external/opus-1.0.3/silk/fixed/find_LTP_FIX.c | 244 - .../opus-1.0.3/silk/fixed/prefilter_FIX.c | 204 - .../opus-1.0.3/silk/fixed/silk_fixed.vcxproj | 186 - .../silk/fixed/silk_fixed.vcxproj.filters | 111 - external/opus-1.0.3/silk/fixed/solve_LS_FIX.c | 245 - external/opus-1.0.3/silk/float/find_LTP_FLP.c | 132 - .../opus-1.0.3/silk/float/prefilter_FLP.c | 206 - .../opus-1.0.3/silk/float/silk_float.vcxproj | 242 - .../silk/float/silk_float.vcxproj.filters | 129 - external/opus-1.0.3/silk/float/solve_LS_FLP.c | 207 - external/opus-1.0.3/silk/quant_LTP_gains.c | 107 - external/opus-1.0.3/silk/silk_common.vcxproj | 307 - .../silk/silk_common.vcxproj.filters | 315 - external/opus-1.0.3/silk_headers.mk | 26 - external/opus-1.0.3/src/opus.vcxproj | 218 - external/opus-1.0.3/src/opus.vcxproj.filters | 75 - external/opus-1.0.3/src/opus_demo.vcxproj | 101 - .../opus-1.0.3/src/opus_demo.vcxproj.filters | 75 - external/opus-1.0.3/src/opus_encoder.c | 1618 ----- external/opus-1.0.3/src/opus_multistream.c | 1278 ---- external/opus-1.0.3/src/opus_private.h | 85 - external/opus-1.0.3/src/repacketizer.c | 208 - external/opus-1.0.3/tests/run_vectors.sh | 129 - .../opus-1.0.3/tests/test_opus_api.vcxproj | 81 - .../opus-1.0.3/tests/test_opus_decode.vcxproj | 81 - .../opus-1.0.3/tests/test_opus_encode.vcxproj | 81 - external/opus-1.0.3/version.mk | 2 - external/opus-1.0.3/win32/genversion.bat | 46 - .../opus-1.3.1/0000-opus.git-86e5f5ea.patch | 63 + .../opus-1.3.1/0001-opus.git-ad8fe90d.patch | 26 + .../opus-1.3.1/0002-opus.git-812ae3fb.patch | 86 + .../opus-1.3.1/0003-opus.git-cd529edb.patch | 47 + external/opus-1.3.1/0010-misc-win32.diff | 73 + external/{opus-1.0.3 => opus-1.3.1}/AUTHORS | 0 external/opus-1.3.1/CMakeLists.txt | 411 ++ external/{opus-1.0.3 => opus-1.3.1}/COPYING | 2 +- external/{opus-1.0.3 => opus-1.3.1}/ChangeLog | 0 external/opus-1.3.1/INSTALL | 368 ++ external/opus-1.3.1/Makefile.am | 352 + external/opus-1.3.1/Makefile.in | 3459 ++++++++++ external/opus-1.3.1/Makefile.mips | 161 + .../{opus-1.0.3 => opus-1.3.1}/Makefile.unix | 52 +- external/{opus-1.0.3 => opus-1.3.1}/NEWS | 0 external/opus-1.3.1/OpusConfig.cmake.in | 19 + external/{opus-1.0.3 => opus-1.3.1}/README | 53 +- .../{opus-1.0.3 => opus-1.3.1}/aclocal.m4 | 750 ++- .../celt/_kiss_fft_guts.h | 31 +- .../{opus-1.0.3 => opus-1.3.1}/celt/arch.h | 107 +- external/opus-1.3.1/celt/arm/arm2gnu.pl | 353 + external/opus-1.3.1/celt/arm/arm_celt_map.c | 160 + external/opus-1.3.1/celt/arm/armcpu.c | 185 + external/opus-1.3.1/celt/arm/armcpu.h | 77 + .../celt/arm/armopts.s.in} | 29 +- external/opus-1.3.1/celt/arm/celt_fft_ne10.c | 173 + external/opus-1.3.1/celt/arm/celt_mdct_ne10.c | 258 + external/opus-1.3.1/celt/arm/celt_neon_intr.c | 211 + .../celt/arm/celt_pitch_xcorr_arm.s | 551 ++ external/opus-1.3.1/celt/arm/fft_arm.h | 71 + .../celt/arm/fixed_arm64.h} | 26 +- external/opus-1.3.1/celt/arm/fixed_armv4.h | 80 + external/opus-1.3.1/celt/arm/fixed_armv5e.h | 151 + external/opus-1.3.1/celt/arm/kiss_fft_armv4.h | 121 + .../opus-1.3.1/celt/arm/kiss_fft_armv5e.h | 118 + external/opus-1.3.1/celt/arm/mdct_arm.h | 59 + external/opus-1.3.1/celt/arm/pitch_arm.h | 160 + .../opus-1.3.1/celt/arm/pitch_neon_intr.c | 290 + external/opus-1.3.1/celt/bands.c | 1672 +++++ .../{opus-1.0.3 => opus-1.3.1}/celt/bands.h | 58 +- external/opus-1.3.1/celt/celt.c | 316 + external/opus-1.3.1/celt/celt.h | 251 + external/opus-1.3.1/celt/celt_decoder.c | 1372 ++++ external/opus-1.3.1/celt/celt_encoder.c | 2607 ++++++++ external/opus-1.3.1/celt/celt_lpc.c | 296 + .../celt/celt_lpc.h | 21 +- external/opus-1.3.1/celt/cpu_support.h | 70 + external/opus-1.3.1/celt/cwrs.c | 715 ++ .../{opus-1.0.3 => opus-1.3.1}/celt/cwrs.h | 2 +- .../celt/ecintrin.h | 2 +- .../{opus-1.0.3 => opus-1.3.1}/celt/entcode.c | 60 + .../{opus-1.0.3 => opus-1.3.1}/celt/entcode.h | 44 +- .../{opus-1.0.3 => opus-1.3.1}/celt/entdec.c | 4 +- .../{opus-1.0.3 => opus-1.3.1}/celt/entdec.h | 2 +- .../{opus-1.0.3 => opus-1.3.1}/celt/entenc.c | 4 +- .../{opus-1.0.3 => opus-1.3.1}/celt/entenc.h | 2 +- .../celt/fixed_debug.h | 92 +- .../celt/fixed_generic.h | 55 +- .../celt/float_cast.h | 25 +- external/opus-1.3.1/celt/kiss_fft.c | 604 ++ .../celt/kiss_fft.h | 75 +- .../{opus-1.0.3 => opus-1.3.1}/celt/laplace.c | 2 - .../{opus-1.0.3 => opus-1.3.1}/celt/laplace.h | 0 .../{opus-1.0.3 => opus-1.3.1}/celt/mathops.c | 11 +- .../{opus-1.0.3 => opus-1.3.1}/celt/mathops.h | 123 +- .../{opus-1.0.3 => opus-1.3.1}/celt/mdct.c | 275 +- .../{opus-1.0.3 => opus-1.3.1}/celt/mdct.h | 56 +- .../celt/mfrngcod.h | 0 external/opus-1.3.1/celt/mips/celt_mipsr1.h | 152 + .../celt/mips/fixed_generic_mipsr1.h | 126 + .../opus-1.3.1/celt/mips/kiss_fft_mipsr1.h | 167 + external/opus-1.3.1/celt/mips/mdct_mipsr1.h | 288 + external/opus-1.3.1/celt/mips/pitch_mipsr1.h | 161 + external/opus-1.3.1/celt/mips/vq_mipsr1.h | 116 + .../{opus-1.0.3 => opus-1.3.1}/celt/modes.c | 18 +- .../{opus-1.0.3 => opus-1.3.1}/celt/modes.h | 8 - .../celt/opus_custom_demo.c | 0 .../celt/os_support.h | 15 +- .../{opus-1.0.3 => opus-1.3.1}/celt/pitch.c | 265 +- external/opus-1.3.1/celt/pitch.h | 192 + .../celt/quant_bands.c | 63 +- .../celt/quant_bands.h | 8 +- .../{opus-1.0.3 => opus-1.3.1}/celt/rate.c | 41 +- .../{opus-1.0.3 => opus-1.3.1}/celt/rate.h | 12 +- .../celt/stack_alloc.h | 41 +- external/opus-1.3.1/celt/static_modes_fixed.h | 892 +++ .../celt/static_modes_fixed_arm_ne10.h | 388 ++ external/opus-1.3.1/celt/static_modes_float.h | 888 +++ .../celt/static_modes_float_arm_ne10.h | 404 ++ .../celt/tests/test_unit_cwrs32.c | 110 +- .../celt/tests/test_unit_dft.c | 81 +- .../celt/tests/test_unit_entropy.c | 9 +- .../celt/tests/test_unit_laplace.c | 3 +- .../celt/tests/test_unit_mathops.c | 13 +- .../celt/tests/test_unit_mdct.c | 110 +- .../celt/tests/test_unit_rotation.c | 12 +- .../celt/tests/test_unit_types.c | 0 external/{opus-1.0.3 => opus-1.3.1}/celt/vq.c | 177 +- external/{opus-1.0.3 => opus-1.3.1}/celt/vq.h | 32 +- external/opus-1.3.1/celt/x86/celt_lpc_sse.h | 66 + .../opus-1.3.1/celt/x86/celt_lpc_sse4_1.c | 89 + external/opus-1.3.1/celt/x86/pitch_sse.c | 185 + external/opus-1.3.1/celt/x86/pitch_sse.h | 192 + external/opus-1.3.1/celt/x86/pitch_sse2.c | 95 + external/opus-1.3.1/celt/x86/pitch_sse4_1.c | 195 + external/opus-1.3.1/celt/x86/vq_sse.h | 50 + external/opus-1.3.1/celt/x86/vq_sse2.c | 217 + external/opus-1.3.1/celt/x86/x86_celt_map.c | 167 + external/opus-1.3.1/celt/x86/x86cpu.c | 157 + external/opus-1.3.1/celt/x86/x86cpu.h | 95 + external/opus-1.3.1/celt_headers.mk | 53 + external/opus-1.3.1/celt_sources.mk | 50 + .../{opusfile-0.10 => opus-1.3.1}/compile | 9 +- .../config.guess | 38 +- external/opus-1.3.1/config.h.cmake.in | 1 + .../{opus-1.0.3 => opus-1.3.1}/config.h.in | 110 +- .../{opusfile-0.10 => opus-1.3.1}/config.sub | 25 +- external/{opus-1.0.3 => opus-1.3.1}/configure | 5755 ++++++++++++----- external/opus-1.3.1/configure.ac | 933 +++ .../{opusfile-0.10 => opus-1.3.1}/depcomp | 6 +- external/opus-1.3.1/doc/Doxyfile.in | 335 + .../doc/Makefile.am | 4 +- .../doc/Makefile.in | 162 +- external/opus-1.3.1/doc/TODO | 7 + .../doc/customdoxygen.css | 551 +- external/opus-1.3.1/doc/footer.html | 28 + .../doc/header.html | 0 .../doc/opus_logo.svg | 20 +- external/opus-1.3.1/doc/trivial_example.c | 160 + .../{opus-1.0.3 => opus-1.3.1}/include/opus.h | 81 +- .../include/opus_custom.h | 89 +- .../include/opus_defines.h | 204 +- .../include/opus_multistream.h | 14 +- external/opus-1.3.1/include/opus_projection.h | 568 ++ .../include/opus_types.h | 27 +- .../{opusfile-0.10 => opus-1.3.1}/install-sh | 4 +- external/{opus-1.0.3 => opus-1.3.1}/ltmain.sh | 5528 ++++++++++------ .../opus-1.3.1/m4/as-gcc-inline-assembly.m4 | 98 + .../opus-1.3.1/m4/ax_add_fortify_source.m4 | 53 + .../{opus-1.0.3 => opus-1.3.1}/m4/libtool.m4 | 2549 ++++---- .../m4/ltoptions.m4 | 0 .../m4/ltsugar.m4 | 0 .../m4/ltversion.m4 | 0 .../m4/lt~obsolete.m4 | 0 external/opus-1.3.1/m4/opus-intrinsics.m4 | 29 + .../{opusfile-0.10 => opus-1.3.1}/missing | 6 +- .../opus-uninstalled.pc.in | 2 +- external/{opus-1.0.3 => opus-1.3.1}/opus.m4 | 0 .../{opus-1.0.3 => opus-1.3.1}/opus.pc.in | 4 +- external/opus-1.3.1/opus_buildtype.cmake | 23 + external/opus-1.3.1/opus_config.cmake | 43 + external/opus-1.3.1/opus_functions.cmake | 262 + external/opus-1.3.1/opus_headers.mk | 9 + external/opus-1.3.1/opus_sources.cmake | 38 + external/opus-1.3.1/opus_sources.mk | 16 + external/opus-1.3.1/package_version | 1 + .../{opus-1.0.3 => opus-1.3.1}/silk/A2NLSF.c | 37 +- .../{opus-1.0.3 => opus-1.3.1}/silk/API.h | 11 +- .../{opus-1.0.3 => opus-1.3.1}/silk/CNG.c | 91 +- .../silk/HP_variable_cutoff.c | 4 +- .../{opus-1.0.3 => opus-1.3.1}/silk/Inlines.h | 16 +- .../silk/LPC_analysis_filter.c | 40 +- external/opus-1.3.1/silk/LPC_fit.c | 81 + .../silk/LPC_inv_pred_gain.c | 101 +- .../silk/LP_variable_cutoff.c | 8 +- .../silk/MacroCount.h | 170 +- .../silk/MacroDebug.h | 117 +- .../{opus-1.0.3 => opus-1.3.1}/silk/NLSF2A.c | 65 +- .../{opus-1.0.3 => opus-1.3.1}/silk/NLSF_VQ.c | 48 +- .../silk/NLSF_VQ_weights_laroia.c | 8 +- .../silk/NLSF_decode.c | 26 +- .../silk/NLSF_del_dec_quant.c | 62 +- .../silk/NLSF_encode.c | 58 +- .../silk/NLSF_stabilize.c | 4 +- .../silk/NLSF_unpack.c | 4 +- .../{opus-1.0.3 => opus-1.3.1}/silk/NSQ.c | 160 +- external/opus-1.3.1/silk/NSQ.h | 101 + .../silk/NSQ_del_dec.c | 178 +- .../{opus-1.0.3 => opus-1.3.1}/silk/PLC.c | 93 +- .../{opus-1.0.3 => opus-1.3.1}/silk/PLC.h | 7 +- .../silk/SigProc_FIX.h | 134 +- .../{opus-1.0.3 => opus-1.3.1}/silk/VAD.c | 88 +- external/opus-1.3.1/silk/VQ_WMat_EC.c | 131 + .../silk/ana_filt_bank_1.c | 4 +- .../silk/arm/LPC_inv_pred_gain_arm.h | 57 + .../silk/arm/LPC_inv_pred_gain_neon_intr.c | 288 + .../opus-1.3.1/silk/arm/NSQ_del_dec_arm.h | 100 + .../silk/arm/NSQ_del_dec_neon_intr.c | 1124 ++++ external/opus-1.3.1/silk/arm/NSQ_neon.c | 112 + external/opus-1.3.1/silk/arm/NSQ_neon.h | 114 + .../silk/arm/SigProc_FIX_armv4.h} | 43 +- .../silk/arm/SigProc_FIX_armv5e.h} | 82 +- external/opus-1.3.1/silk/arm/arm_silk_map.c | 123 + external/opus-1.3.1/silk/arm/biquad_alt_arm.h | 68 + .../silk/arm/biquad_alt_neon_intr.c | 156 + external/opus-1.3.1/silk/arm/macros_arm64.h | 39 + external/opus-1.3.1/silk/arm/macros_armv4.h | 110 + external/opus-1.3.1/silk/arm/macros_armv5e.h | 220 + .../silk/biquad_alt.c | 57 +- .../silk/bwexpander.c | 6 +- .../silk/bwexpander_32.c | 4 +- .../silk/check_control_input.c | 26 +- .../silk/code_signs.c | 10 +- .../{opus-1.0.3 => opus-1.3.1}/silk/control.h | 15 +- external/opus-1.3.1/silk/control_SNR.c | 113 + .../silk/control_audio_bandwidth.c | 20 +- .../silk/control_codec.c | 152 +- .../{opus-1.0.3 => opus-1.3.1}/silk/debug.c | 11 +- .../{opus-1.0.3 => opus-1.3.1}/silk/debug.h | 30 +- .../{opus-1.0.3 => opus-1.3.1}/silk/dec_API.c | 54 +- .../silk/decode_core.c | 17 +- .../silk/decode_frame.c | 26 +- .../silk/decode_indices.c | 6 +- .../silk/decode_parameters.c | 8 +- .../silk/decode_pitch.c | 8 +- .../silk/decode_pulses.c | 16 +- .../silk/decoder_set_fs.c | 12 +- .../{opus-1.0.3 => opus-1.3.1}/silk/define.h | 23 +- .../{opus-1.0.3 => opus-1.3.1}/silk/enc_API.c | 95 +- .../silk/encode_indices.c | 10 +- .../silk/encode_pulses.c | 27 +- .../{opus-1.0.3 => opus-1.3.1}/silk/errors.h | 4 +- .../silk/fixed/LTP_analysis_filter_FIX.c | 23 +- .../silk/fixed/LTP_scale_ctrl_FIX.c | 4 +- .../silk/fixed/apply_sine_window_FIX.c | 12 +- .../arm/warped_autocorrelation_FIX_arm.h | 68 + .../warped_autocorrelation_FIX_neon_intr.c | 265 + .../silk/fixed/autocorr_FIX.c | 42 +- .../silk/fixed/burg_modified_FIX.c | 83 +- .../silk/fixed/corrMatrix_FIX.c | 50 +- .../silk/fixed/encode_frame_FIX.c | 178 +- .../silk/fixed/find_LPC_FIX.c | 22 +- external/opus-1.3.1/silk/fixed/find_LTP_FIX.c | 99 + .../silk/fixed/find_pitch_lags_FIX.c | 54 +- .../silk/fixed/find_pred_coefs_FIX.c | 49 +- .../silk/fixed/k2a_FIX.c | 17 +- .../silk/fixed/k2a_Q16_FIX.c | 19 +- .../silk/fixed/main_FIX.h | 84 +- .../mips/noise_shape_analysis_FIX_mipsr1.h} | 136 +- .../mips/warped_autocorrelation_FIX_mipsr1.h | 165 + .../silk/fixed/noise_shape_analysis_FIX.c | 407 ++ .../silk/fixed/pitch_analysis_core_FIX.c | 522 +- .../silk/fixed/process_gains_FIX.c | 4 +- .../silk/fixed/regularize_correlations_FIX.c | 4 +- .../silk/fixed/residual_energy16_FIX.c | 12 +- .../silk/fixed/residual_energy_FIX.c | 17 +- .../silk/fixed/schur64_FIX.c | 11 +- .../silk/fixed/schur_FIX.c | 19 +- .../silk/fixed/structs_FIX.h | 26 +- .../silk/fixed/vector_ops_FIX.c | 45 +- .../silk/fixed/warped_autocorrelation_FIX.c | 16 +- .../silk/fixed/x86/burg_modified_FIX_sse4_1.c | 377 ++ .../silk/fixed/x86/vector_ops_FIX_sse4_1.c | 88 + .../silk/float/LPC_analysis_filter_FLP.c | 18 +- .../silk/float/LPC_inv_pred_gain_FLP.c | 41 +- .../silk/float/LTP_analysis_filter_FLP.c | 4 +- .../silk/float/LTP_scale_ctrl_FLP.c | 4 +- .../silk/float/SigProc_FLP.h | 24 +- .../silk/float/apply_sine_window_FLP.c | 8 +- .../silk/float/autocorrelation_FLP.c | 4 +- .../silk/float/burg_modified_FLP.c | 6 +- .../silk/float/bwexpander_FLP.c | 4 +- .../silk/float/corrMatrix_FLP.c | 4 +- .../silk/float/encode_frame_FLP.c | 125 +- .../silk/float/energy_FLP.c | 9 +- .../silk/float/find_LPC_FLP.c | 8 +- external/opus-1.3.1/silk/float/find_LTP_FLP.c | 64 + .../silk/float/find_pitch_lags_FLP.c | 11 +- .../silk/float/find_pred_coefs_FLP.c | 20 +- .../silk/float/inner_product_FLP.c | 9 +- .../silk/float/k2a_FLP.c | 19 +- .../silk/float/main_FLP.h | 67 +- .../silk/float/noise_shape_analysis_FLP.c | 157 +- .../silk/float/pitch_analysis_core_FLP.c | 168 +- .../silk/float/process_gains_FLP.c | 4 +- .../silk/float/regularize_correlations_FLP.c | 4 +- .../silk/float/residual_energy_FLP.c | 6 +- .../silk/float/scale_copy_vector_FLP.c | 4 +- .../silk/float/scale_vector_FLP.c | 4 +- .../silk/float/schur_FLP.c | 20 +- .../silk/float/sort_FLP.c | 10 +- .../silk/float/structs_FLP.h | 26 +- .../silk/float/warped_autocorrelation_FLP.c | 10 +- .../silk/float/wrappers_FLP.c | 55 +- .../silk/gain_quant.c | 5 +- .../silk/init_decoder.c | 5 +- .../silk/init_encoder.c | 10 +- .../silk/inner_prod_aligned.c | 4 +- .../silk/interpolate.c | 8 +- .../{opus-1.0.3 => opus-1.3.1}/silk/lin2log.c | 6 +- .../{opus-1.0.3 => opus-1.3.1}/silk/log2lin.c | 8 +- .../{opus-1.0.3 => opus-1.3.1}/silk/macros.h | 108 +- .../{opus-1.0.3 => opus-1.3.1}/silk/main.h | 118 +- .../opus-1.3.1/silk/mips/NSQ_del_dec_mipsr1.h | 410 ++ external/opus-1.3.1/silk/mips/macros_mipsr1.h | 92 + .../opus-1.3.1/silk/mips/sigproc_fix_mipsr1.h | 60 + .../silk/pitch_est_defines.h | 4 +- .../silk/pitch_est_tables.c | 4 +- .../silk/process_NLSFs.c | 18 +- external/opus-1.3.1/silk/quant_LTP_gains.c | 132 + .../silk/resampler.c | 14 +- .../silk/resampler_down2.c | 12 +- .../silk/resampler_down2_3.c | 11 +- .../silk/resampler_private.h | 4 +- .../silk/resampler_private_AR2.c | 4 +- .../silk/resampler_private_IIR_FIR.c | 6 +- .../silk/resampler_private_down_FIR.c | 15 +- .../silk/resampler_private_up2_HQ.c | 4 +- .../silk/resampler_rom.c | 58 +- .../silk/resampler_rom.h | 4 +- .../silk/resampler_structs.h | 4 +- .../silk/shell_coder.c | 23 +- .../silk/sigm_Q15.c | 4 +- .../{opus-1.0.3 => opus-1.3.1}/silk/sort.c | 20 +- .../silk/stereo_LR_to_MS.c | 30 +- .../silk/stereo_MS_to_LR.c | 4 +- .../silk/stereo_decode_pred.c | 4 +- .../silk/stereo_encode_pred.c | 10 +- .../silk/stereo_find_predictor.c | 4 +- .../silk/stereo_quant_pred.c | 4 +- .../{opus-1.0.3 => opus-1.3.1}/silk/structs.h | 13 +- .../silk/sum_sqr_shift.c | 55 +- .../silk/table_LSF_cos.c | 4 +- .../{opus-1.0.3 => opus-1.3.1}/silk/tables.h | 18 +- .../silk/tables_LTP.c | 30 +- .../silk/tables_NLSF_CB_NB_MB.c | 40 +- .../silk/tables_NLSF_CB_WB.c | 40 +- .../silk/tables_gain.c | 4 +- .../silk/tables_other.c | 18 +- .../silk/tables_pitch_lag.c | 4 +- .../silk/tables_pulses_per_block.c | 4 +- .../silk/tests/test_unit_LPC_inv_pred_gain.c | 129 + .../silk/tuning_parameters.h | 33 +- .../{opus-1.0.3 => opus-1.3.1}/silk/typedef.h | 7 +- .../opus-1.3.1/silk/x86/NSQ_del_dec_sse4_1.c | 859 +++ external/opus-1.3.1/silk/x86/NSQ_sse4_1.c | 719 ++ .../opus-1.3.1/silk/x86/SigProc_FIX_sse.h | 94 + external/opus-1.3.1/silk/x86/VAD_sse4_1.c | 277 + .../opus-1.3.1/silk/x86/VQ_WMat_EC_sse4_1.c | 142 + external/opus-1.3.1/silk/x86/main_sse.h | 248 + external/opus-1.3.1/silk/x86/x86_silk_map.c | 164 + external/opus-1.3.1/silk_headers.mk | 44 + .../silk_sources.mk | 87 +- external/opus-1.3.1/src/analysis.c | 981 +++ external/opus-1.3.1/src/analysis.h | 103 + external/opus-1.3.1/src/mapping_matrix.c | 378 ++ external/opus-1.3.1/src/mapping_matrix.h | 133 + external/opus-1.3.1/src/mlp.c | 144 + external/opus-1.3.1/src/mlp.h | 60 + external/opus-1.3.1/src/mlp_data.c | 672 ++ external/opus-1.3.1/src/opus.c | 356 + .../src/opus_compare.c | 3 + .../src/opus_decoder.c | 541 +- .../src/opus_demo.c | 316 +- external/opus-1.3.1/src/opus_encoder.c | 2783 ++++++++ external/opus-1.3.1/src/opus_multistream.c | 92 + .../opus-1.3.1/src/opus_multistream_decoder.c | 549 ++ .../opus-1.3.1/src/opus_multistream_encoder.c | 1328 ++++ external/opus-1.3.1/src/opus_private.h | 201 + .../opus-1.3.1/src/opus_projection_decoder.c | 258 + .../opus-1.3.1/src/opus_projection_encoder.c | 468 ++ external/opus-1.3.1/src/repacketizer.c | 349 + .../src/repacketizer_demo.c | 5 + external/opus-1.3.1/src/tansig_table.h | 45 + external/opus-1.3.1/test-driver | 148 + .../tests/opus_encode_regressions.c | 1035 +++ external/opus-1.3.1/tests/run_vectors.sh | 143 + .../tests/test_opus_api.c | 223 +- .../tests/test_opus_common.h | 12 +- .../tests/test_opus_decode.c | 71 +- .../tests/test_opus_encode.c | 295 +- external/opus-1.3.1/tests/test_opus_padding.c | 93 + .../opus-1.3.1/tests/test_opus_projection.c | 394 ++ external/opus-1.3.1/win32/VS2015/common.props | 82 + external/opus-1.3.1/win32/VS2015/opus.sln | 168 + external/opus-1.3.1/win32/VS2015/opus.vcxproj | 399 ++ .../win32/VS2015/opus.vcxproj.filters | 585 ++ .../opus-1.3.1/win32/VS2015/opus_demo.vcxproj | 171 + .../win32/VS2015/opus_demo.vcxproj.filters} | 42 +- .../win32/VS2015/test_opus_api.vcxproj | 171 + .../VS2015/test_opus_api.vcxproj.filters} | 26 +- .../win32/VS2015/test_opus_decode.vcxproj | 171 + .../VS2015}/test_opus_decode.vcxproj.filters | 26 +- .../win32/VS2015/test_opus_encode.vcxproj | 172 + .../VS2015/test_opus_encode.vcxproj.filters | 17 + external/opus-1.3.1/win32/config.h | 64 + external/opus-1.3.1/win32/genversion.bat | 37 + .../000-opusfile.git-67273ef.patch | 32 - .../001-opusfile.git-567165a.patch | 40 - .../003-opusfile.git-e8e3046.patch | 21 - external/opusfile-0.10/package_version | 1 - external/opusfile-0.10/src/Makefile.darwin | 37 - .../0000-misc-configury.patch} | 11 +- .../0001-misc-mingw64.patch} | 10 +- .../{opusfile-0.10 => opusfile-0.11}/AUTHORS | 0 .../{opusfile-0.10 => opusfile-0.11}/COPYING | 0 .../Makefile.am | 0 .../Makefile.in | 12 +- .../README.md | 0 .../aclocal.m4 | 393 +- .../{opus-1.0.3 => opusfile-0.11}/compile | 15 +- .../config.guess | 524 +- .../config.h.in | 6 +- .../{opus-1.0.3 => opusfile-0.11}/config.sub | 193 +- .../configure | 2155 +++--- .../configure.ac | 7 +- .../{opus-1.0.3 => opusfile-0.11}/depcomp | 457 +- .../doc/Doxyfile.in | 0 .../doc/opus_logo.svg | 0 .../examples/opusfile_example.c | 0 .../examples/seeking_example.c | 0 .../examples/win32utf8.c | 0 .../examples/win32utf8.h | 0 .../include/opusfile.h | 0 .../{opus-1.0.3 => opusfile-0.11}/install-sh | 376 +- .../ltmain.sh | 0 .../m4/attributes.m4 | 0 .../m4/libtool.m4 | 0 .../m4/ltoptions.m4 | 127 +- .../m4/ltsugar.m4 | 7 +- .../m4/ltversion.m4 | 12 +- .../m4/lt~obsolete.m4 | 7 +- external/opusfile-0.11/m4/pkg.m4 | 275 + external/opusfile-0.11/missing | 215 + .../opusfile-uninstalled.pc.in | 0 .../opusfile.pc.in | 0 .../opusurl-uninstalled.pc.in | 0 .../opusurl.pc.in | 0 external/opusfile-0.11/package_version | 1 + .../src/http.c | 2 +- .../src/info.c | 4 +- .../src/internal.c | 0 .../src/internal.h | 0 .../src/opusfile.c | 0 .../src/stream.c | 0 .../src/wincerts.c | 0 .../src/winerrno.h | 0 .../win32/VS2015/opusfile.sln | 0 .../win32/VS2015/opusfile.vcxproj | 0 .../win32/VS2015/opusfile.vcxproj.filters | 0 .../win32/VS2015/opusfile_example.vcxproj | 0 .../VS2015/opusfile_example.vcxproj.filters | 0 .../win32/VS2015/seeking_example.vcxproj | 0 .../VS2015/seeking_example.vcxproj.filters | 0 528 files changed, 64475 insertions(+), 33216 deletions(-) create mode 100644 VisualC/external/include/opus/opus_projection.h create mode 100644 Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_projection.h delete mode 100644 external/opus-1.0.3/001-opus.git-9c7193e4.patch delete mode 100644 external/opus-1.0.3/002-opus.git-a88d8365.patch delete mode 100644 external/opus-1.0.3/003-opus.git-25b27a9c.patch delete mode 100644 external/opus-1.0.3/004-opus.git-3499e78b.patch delete mode 100644 external/opus-1.0.3/005-opus.git-70a3d641.patch delete mode 100644 external/opus-1.0.3/006-opus.git-6e961737.patch delete mode 100644 external/opus-1.0.3/030-opus-1.0.3-decoder-only.diff delete mode 100644 external/opus-1.0.3/050-opus-1.0.3-misc-port0.patch delete mode 100644 external/opus-1.0.3/051-opus-1.0.3-misc-port1.patch delete mode 100644 external/opus-1.0.3/INSTALL delete mode 100644 external/opus-1.0.3/Makefile.am delete mode 100644 external/opus-1.0.3/Makefile.darwin delete mode 100644 external/opus-1.0.3/Makefile.in delete mode 100644 external/opus-1.0.3/celt/bands.c delete mode 100644 external/opus-1.0.3/celt/celt.c delete mode 100644 external/opus-1.0.3/celt/celt.h delete mode 100644 external/opus-1.0.3/celt/celt.vcxproj delete mode 100644 external/opus-1.0.3/celt/celt.vcxproj.filters delete mode 100644 external/opus-1.0.3/celt/celt_lpc.c delete mode 100644 external/opus-1.0.3/celt/cwrs.c delete mode 100644 external/opus-1.0.3/celt/kiss_fft.c delete mode 100644 external/opus-1.0.3/celt/static_modes_fixed.h delete mode 100644 external/opus-1.0.3/celt/static_modes_float.h delete mode 100644 external/opus-1.0.3/celt_headers.mk delete mode 100644 external/opus-1.0.3/celt_sources.mk delete mode 100644 external/opus-1.0.3/configure.ac delete mode 100644 external/opus-1.0.3/doc/Doxyfile.in delete mode 100644 external/opus-1.0.3/doc/footer.html delete mode 100755 external/opus-1.0.3/missing delete mode 100644 external/opus-1.0.3/opus.sln delete mode 100644 external/opus-1.0.3/opus_headers.mk delete mode 100644 external/opus-1.0.3/opus_sources.mk delete mode 100644 external/opus-1.0.3/package_version delete mode 100644 external/opus-1.0.3/silk/VQ_WMat_EC.c delete mode 100644 external/opus-1.0.3/silk/control_SNR.c delete mode 100644 external/opus-1.0.3/silk/fixed/find_LTP_FIX.c delete mode 100644 external/opus-1.0.3/silk/fixed/prefilter_FIX.c delete mode 100644 external/opus-1.0.3/silk/fixed/silk_fixed.vcxproj delete mode 100644 external/opus-1.0.3/silk/fixed/silk_fixed.vcxproj.filters delete mode 100644 external/opus-1.0.3/silk/fixed/solve_LS_FIX.c delete mode 100644 external/opus-1.0.3/silk/float/find_LTP_FLP.c delete mode 100644 external/opus-1.0.3/silk/float/prefilter_FLP.c delete mode 100644 external/opus-1.0.3/silk/float/silk_float.vcxproj delete mode 100644 external/opus-1.0.3/silk/float/silk_float.vcxproj.filters delete mode 100644 external/opus-1.0.3/silk/float/solve_LS_FLP.c delete mode 100644 external/opus-1.0.3/silk/quant_LTP_gains.c delete mode 100644 external/opus-1.0.3/silk/silk_common.vcxproj delete mode 100644 external/opus-1.0.3/silk/silk_common.vcxproj.filters delete mode 100644 external/opus-1.0.3/silk_headers.mk delete mode 100644 external/opus-1.0.3/src/opus.vcxproj delete mode 100644 external/opus-1.0.3/src/opus.vcxproj.filters delete mode 100644 external/opus-1.0.3/src/opus_demo.vcxproj delete mode 100644 external/opus-1.0.3/src/opus_demo.vcxproj.filters delete mode 100644 external/opus-1.0.3/src/opus_encoder.c delete mode 100644 external/opus-1.0.3/src/opus_multistream.c delete mode 100644 external/opus-1.0.3/src/opus_private.h delete mode 100644 external/opus-1.0.3/src/repacketizer.c delete mode 100755 external/opus-1.0.3/tests/run_vectors.sh delete mode 100644 external/opus-1.0.3/tests/test_opus_api.vcxproj delete mode 100644 external/opus-1.0.3/tests/test_opus_decode.vcxproj delete mode 100644 external/opus-1.0.3/tests/test_opus_encode.vcxproj delete mode 100644 external/opus-1.0.3/version.mk delete mode 100644 external/opus-1.0.3/win32/genversion.bat create mode 100644 external/opus-1.3.1/0000-opus.git-86e5f5ea.patch create mode 100644 external/opus-1.3.1/0001-opus.git-ad8fe90d.patch create mode 100644 external/opus-1.3.1/0002-opus.git-812ae3fb.patch create mode 100644 external/opus-1.3.1/0003-opus.git-cd529edb.patch create mode 100644 external/opus-1.3.1/0010-misc-win32.diff rename external/{opus-1.0.3 => opus-1.3.1}/AUTHORS (100%) create mode 100644 external/opus-1.3.1/CMakeLists.txt rename external/{opus-1.0.3 => opus-1.3.1}/COPYING (99%) rename external/{opus-1.0.3 => opus-1.3.1}/ChangeLog (100%) create mode 100644 external/opus-1.3.1/INSTALL create mode 100644 external/opus-1.3.1/Makefile.am create mode 100644 external/opus-1.3.1/Makefile.in create mode 100644 external/opus-1.3.1/Makefile.mips rename external/{opus-1.0.3 => opus-1.3.1}/Makefile.unix (68%) rename external/{opus-1.0.3 => opus-1.3.1}/NEWS (100%) create mode 100644 external/opus-1.3.1/OpusConfig.cmake.in rename external/{opus-1.0.3 => opus-1.3.1}/README (82%) rename external/{opus-1.0.3 => opus-1.3.1}/aclocal.m4 (63%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/_kiss_fft_guts.h (85%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/arch.h (63%) create mode 100755 external/opus-1.3.1/celt/arm/arm2gnu.pl create mode 100644 external/opus-1.3.1/celt/arm/arm_celt_map.c create mode 100644 external/opus-1.3.1/celt/arm/armcpu.c create mode 100644 external/opus-1.3.1/celt/arm/armcpu.h rename external/{opus-1.0.3/celt/pitch.h => opus-1.3.1/celt/arm/armopts.s.in} (68%) create mode 100644 external/opus-1.3.1/celt/arm/celt_fft_ne10.c create mode 100644 external/opus-1.3.1/celt/arm/celt_mdct_ne10.c create mode 100644 external/opus-1.3.1/celt/arm/celt_neon_intr.c create mode 100644 external/opus-1.3.1/celt/arm/celt_pitch_xcorr_arm.s create mode 100644 external/opus-1.3.1/celt/arm/fft_arm.h rename external/{opus-1.0.3/src/opus.c => opus-1.3.1/celt/arm/fixed_arm64.h} (76%) create mode 100644 external/opus-1.3.1/celt/arm/fixed_armv4.h create mode 100644 external/opus-1.3.1/celt/arm/fixed_armv5e.h create mode 100644 external/opus-1.3.1/celt/arm/kiss_fft_armv4.h create mode 100644 external/opus-1.3.1/celt/arm/kiss_fft_armv5e.h create mode 100644 external/opus-1.3.1/celt/arm/mdct_arm.h create mode 100644 external/opus-1.3.1/celt/arm/pitch_arm.h create mode 100644 external/opus-1.3.1/celt/arm/pitch_neon_intr.c create mode 100644 external/opus-1.3.1/celt/bands.c rename external/{opus-1.0.3 => opus-1.3.1}/celt/bands.h (59%) create mode 100644 external/opus-1.3.1/celt/celt.c create mode 100644 external/opus-1.3.1/celt/celt.h create mode 100644 external/opus-1.3.1/celt/celt_decoder.c create mode 100644 external/opus-1.3.1/celt/celt_encoder.c create mode 100644 external/opus-1.3.1/celt/celt_lpc.c rename external/{opus-1.0.3 => opus-1.3.1}/celt/celt_lpc.h (78%) create mode 100644 external/opus-1.3.1/celt/cpu_support.h create mode 100644 external/opus-1.3.1/celt/cwrs.c rename external/{opus-1.0.3 => opus-1.3.1}/celt/cwrs.h (96%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/ecintrin.h (97%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/entcode.c (58%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/entcode.h (81%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/entdec.c (98%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/entdec.h (98%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/entenc.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/entenc.h (98%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/fixed_debug.h (86%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/fixed_generic.h (75%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/float_cast.h (88%) create mode 100644 external/opus-1.3.1/celt/kiss_fft.c rename external/{opus-1.0.3 => opus-1.3.1}/celt/kiss_fft.h (62%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/laplace.c (98%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/laplace.h (100%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/mathops.c (95%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/mathops.h (76%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/mdct.c (54%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/mdct.h (50%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/mfrngcod.h (100%) create mode 100644 external/opus-1.3.1/celt/mips/celt_mipsr1.h create mode 100644 external/opus-1.3.1/celt/mips/fixed_generic_mipsr1.h create mode 100644 external/opus-1.3.1/celt/mips/kiss_fft_mipsr1.h create mode 100644 external/opus-1.3.1/celt/mips/mdct_mipsr1.h create mode 100644 external/opus-1.3.1/celt/mips/pitch_mipsr1.h create mode 100644 external/opus-1.3.1/celt/mips/vq_mipsr1.h rename external/{opus-1.0.3 => opus-1.3.1}/celt/modes.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/modes.h (94%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/opus_custom_demo.c (100%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/os_support.h (87%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/pitch.c (63%) create mode 100644 external/opus-1.3.1/celt/pitch.h rename external/{opus-1.0.3 => opus-1.3.1}/celt/quant_bands.c (94%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/quant_bands.h (94%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/rate.c (94%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/rate.h (87%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/stack_alloc.h (78%) create mode 100644 external/opus-1.3.1/celt/static_modes_fixed.h create mode 100644 external/opus-1.3.1/celt/static_modes_fixed_arm_ne10.h create mode 100644 external/opus-1.3.1/celt/static_modes_float.h create mode 100644 external/opus-1.3.1/celt/static_modes_float_arm_ne10.h rename external/{opus-1.0.3 => opus-1.3.1}/celt/tests/test_unit_cwrs32.c (59%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/tests/test_unit_dft.c (72%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/tests/test_unit_entropy.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/tests/test_unit_laplace.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/tests/test_unit_mathops.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/tests/test_unit_mdct.c (65%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/tests/test_unit_rotation.c (95%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/tests/test_unit_types.c (100%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/vq.c (72%) rename external/{opus-1.0.3 => opus-1.3.1}/celt/vq.h (77%) create mode 100644 external/opus-1.3.1/celt/x86/celt_lpc_sse.h create mode 100644 external/opus-1.3.1/celt/x86/celt_lpc_sse4_1.c create mode 100644 external/opus-1.3.1/celt/x86/pitch_sse.c create mode 100644 external/opus-1.3.1/celt/x86/pitch_sse.h create mode 100644 external/opus-1.3.1/celt/x86/pitch_sse2.c create mode 100644 external/opus-1.3.1/celt/x86/pitch_sse4_1.c create mode 100644 external/opus-1.3.1/celt/x86/vq_sse.h create mode 100644 external/opus-1.3.1/celt/x86/vq_sse2.c create mode 100644 external/opus-1.3.1/celt/x86/x86_celt_map.c create mode 100644 external/opus-1.3.1/celt/x86/x86cpu.c create mode 100644 external/opus-1.3.1/celt/x86/x86cpu.h create mode 100644 external/opus-1.3.1/celt_headers.mk create mode 100644 external/opus-1.3.1/celt_sources.mk rename external/{opusfile-0.10 => opus-1.3.1}/compile (97%) rename external/{opusfile-0.10 => opus-1.3.1}/config.guess (97%) create mode 100644 external/opus-1.3.1/config.h.cmake.in rename external/{opus-1.0.3 => opus-1.3.1}/config.h.in (56%) rename external/{opusfile-0.10 => opus-1.3.1}/config.sub (98%) rename external/{opus-1.0.3 => opus-1.3.1}/configure (73%) create mode 100644 external/opus-1.3.1/configure.ac rename external/{opusfile-0.10 => opus-1.3.1}/depcomp (99%) create mode 100644 external/opus-1.3.1/doc/Doxyfile.in rename external/{opus-1.0.3 => opus-1.3.1}/doc/Makefile.am (93%) rename external/{opus-1.0.3 => opus-1.3.1}/doc/Makefile.in (73%) create mode 100644 external/opus-1.3.1/doc/TODO rename external/{opus-1.0.3 => opus-1.3.1}/doc/customdoxygen.css (57%) create mode 100644 external/opus-1.3.1/doc/footer.html rename external/{opus-1.0.3 => opus-1.3.1}/doc/header.html (100%) rename external/{opus-1.0.3 => opus-1.3.1}/doc/opus_logo.svg (98%) create mode 100644 external/opus-1.3.1/doc/trivial_example.c rename external/{opus-1.0.3 => opus-1.3.1}/include/opus.h (90%) rename external/{opus-1.0.3 => opus-1.3.1}/include/opus_custom.h (97%) rename external/{opus-1.0.3 => opus-1.3.1}/include/opus_defines.h (78%) rename external/{opus-1.0.3 => opus-1.3.1}/include/opus_multistream.h (98%) create mode 100644 external/opus-1.3.1/include/opus_projection.h rename external/{opus-1.0.3 => opus-1.3.1}/include/opus_types.h (92%) rename external/{opusfile-0.10 => opus-1.3.1}/install-sh (99%) rename external/{opus-1.0.3 => opus-1.3.1}/ltmain.sh (65%) create mode 100644 external/opus-1.3.1/m4/as-gcc-inline-assembly.m4 create mode 100644 external/opus-1.3.1/m4/ax_add_fortify_source.m4 rename external/{opus-1.0.3 => opus-1.3.1}/m4/libtool.m4 (72%) rename external/{opusfile-0.10 => opus-1.3.1}/m4/ltoptions.m4 (100%) rename external/{opusfile-0.10 => opus-1.3.1}/m4/ltsugar.m4 (100%) rename external/{opusfile-0.10 => opus-1.3.1}/m4/ltversion.m4 (100%) rename external/{opusfile-0.10 => opus-1.3.1}/m4/lt~obsolete.m4 (100%) create mode 100644 external/opus-1.3.1/m4/opus-intrinsics.m4 rename external/{opusfile-0.10 => opus-1.3.1}/missing (98%) rename external/{opus-1.0.3 => opus-1.3.1}/opus-uninstalled.pc.in (88%) rename external/{opus-1.0.3 => opus-1.3.1}/opus.m4 (100%) rename external/{opus-1.0.3 => opus-1.3.1}/opus.pc.in (85%) create mode 100644 external/opus-1.3.1/opus_buildtype.cmake create mode 100644 external/opus-1.3.1/opus_config.cmake create mode 100644 external/opus-1.3.1/opus_functions.cmake create mode 100644 external/opus-1.3.1/opus_headers.mk create mode 100644 external/opus-1.3.1/opus_sources.cmake create mode 100644 external/opus-1.3.1/opus_sources.mk create mode 100644 external/opus-1.3.1/package_version rename external/{opus-1.0.3 => opus-1.3.1}/silk/A2NLSF.c (90%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/API.h (93%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/CNG.c (62%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/HP_variable_cutoff.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/Inlines.h (93%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/LPC_analysis_filter.c (78%) create mode 100644 external/opus-1.3.1/silk/LPC_fit.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/LPC_inv_pred_gain.c (65%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/LP_variable_cutoff.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/MacroCount.h (70%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/MacroDebug.h (83%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NLSF2A.c (70%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NLSF_VQ.c (62%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NLSF_VQ_weights_laroia.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NLSF_decode.c (85%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NLSF_del_dec_quant.c (84%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NLSF_encode.c (77%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NLSF_stabilize.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NLSF_unpack.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/NSQ.c (80%) create mode 100644 external/opus-1.3.1/silk/NSQ.h rename external/{opus-1.0.3 => opus-1.3.1}/silk/NSQ_del_dec.c (87%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/PLC.c (87%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/PLC.h (94%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/SigProc_FIX.h (86%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/VAD.c (82%) create mode 100644 external/opus-1.3.1/silk/VQ_WMat_EC.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/ana_filt_bank_1.c (99%) create mode 100644 external/opus-1.3.1/silk/arm/LPC_inv_pred_gain_arm.h create mode 100644 external/opus-1.3.1/silk/arm/LPC_inv_pred_gain_neon_intr.c create mode 100644 external/opus-1.3.1/silk/arm/NSQ_del_dec_arm.h create mode 100644 external/opus-1.3.1/silk/arm/NSQ_del_dec_neon_intr.c create mode 100644 external/opus-1.3.1/silk/arm/NSQ_neon.c create mode 100644 external/opus-1.3.1/silk/arm/NSQ_neon.h rename external/{opus-1.0.3/win32/config.h => opus-1.3.1/silk/arm/SigProc_FIX_armv4.h} (71%) rename external/{opus-1.0.3/silk/float/levinsondurbin_FLP.c => opus-1.3.1/silk/arm/SigProc_FIX_armv5e.h} (50%) create mode 100644 external/opus-1.3.1/silk/arm/arm_silk_map.c create mode 100644 external/opus-1.3.1/silk/arm/biquad_alt_arm.h create mode 100644 external/opus-1.3.1/silk/arm/biquad_alt_neon_intr.c create mode 100644 external/opus-1.3.1/silk/arm/macros_arm64.h create mode 100644 external/opus-1.3.1/silk/arm/macros_armv4.h create mode 100644 external/opus-1.3.1/silk/arm/macros_armv5e.h rename external/{opus-1.0.3 => opus-1.3.1}/silk/biquad_alt.c (57%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/bwexpander.c (95%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/bwexpander_32.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/check_control_input.c (93%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/code_signs.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/control.h (93%) create mode 100644 external/opus-1.3.1/silk/control_SNR.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/control_audio_bandwidth.c (90%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/control_codec.c (79%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/debug.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/debug.h (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/dec_API.c (89%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/decode_core.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/decode_frame.c (87%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/decode_indices.c (98%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/decode_parameters.c (98%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/decode_pitch.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/decode_pulses.c (93%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/decoder_set_fs.c (95%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/define.h (95%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/enc_API.c (90%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/encode_indices.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/encode_pulses.c (91%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/errors.h (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/LTP_analysis_filter_FIX.c (86%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/LTP_scale_ctrl_FIX.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/apply_sine_window_FIX.c (95%) create mode 100644 external/opus-1.3.1/silk/fixed/arm/warped_autocorrelation_FIX_arm.h create mode 100644 external/opus-1.3.1/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/autocorr_FIX.c (64%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/burg_modified_FIX.c (85%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/corrMatrix_FIX.c (83%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/encode_frame_FIX.c (75%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/find_LPC_FIX.c (94%) create mode 100644 external/opus-1.3.1/silk/fixed/find_LTP_FIX.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/find_pitch_lags_FIX.c (73%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/find_pred_coefs_FIX.c (83%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/k2a_FIX.c (86%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/k2a_Q16_FIX.c (86%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/main_FIX.h (81%) rename external/{opus-1.0.3/silk/fixed/noise_shape_analysis_FIX.c => opus-1.3.1/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h} (76%) create mode 100644 external/opus-1.3.1/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h create mode 100644 external/opus-1.3.1/silk/fixed/noise_shape_analysis_FIX.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/pitch_analysis_core_FIX.c (55%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/process_gains_FIX.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/regularize_correlations_FIX.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/residual_energy16_FIX.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/residual_energy_FIX.c (89%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/schur64_FIX.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/schur_FIX.c (94%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/structs_FIX.h (82%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/vector_ops_FIX.c (78%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/fixed/warped_autocorrelation_FIX.c (93%) create mode 100644 external/opus-1.3.1/silk/fixed/x86/burg_modified_FIX_sse4_1.c create mode 100644 external/opus-1.3.1/silk/fixed/x86/vector_ops_FIX_sse4_1.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/LPC_analysis_filter_FLP.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/LPC_inv_pred_gain_FLP.c (80%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/LTP_analysis_filter_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/LTP_scale_ctrl_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/SigProc_FLP.h (91%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/apply_sine_window_FLP.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/autocorrelation_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/burg_modified_FLP.c (98%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/bwexpander_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/corrMatrix_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/encode_frame_FLP.c (79%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/energy_FLP.c (94%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/find_LPC_FLP.c (98%) create mode 100644 external/opus-1.3.1/silk/float/find_LTP_FLP.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/find_pitch_lags_FLP.c (95%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/find_pred_coefs_FLP.c (89%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/inner_product_FLP.c (94%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/k2a_FLP.c (88%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/main_FLP.h (83%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/noise_shape_analysis_FLP.c (72%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/pitch_analysis_core_FLP.c (84%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/process_gains_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/regularize_correlations_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/residual_energy_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/scale_copy_vector_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/scale_vector_FLP.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/schur_FLP.c (90%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/sort_FLP.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/structs_FLP.h (82%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/warped_autocorrelation_FLP.c (93%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/float/wrappers_FLP.c (76%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/gain_quant.c (98%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/init_decoder.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/init_encoder.c (89%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/inner_prod_aligned.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/interpolate.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/lin2log.c (94%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/log2lin.c (95%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/macros.h (71%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/main.h (82%) create mode 100644 external/opus-1.3.1/silk/mips/NSQ_del_dec_mipsr1.h create mode 100644 external/opus-1.3.1/silk/mips/macros_mipsr1.h create mode 100644 external/opus-1.3.1/silk/mips/sigproc_fix_mipsr1.h rename external/{opus-1.0.3 => opus-1.3.1}/silk/pitch_est_defines.h (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/pitch_est_tables.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/process_NLSFs.c (92%) create mode 100644 external/opus-1.3.1/silk/quant_LTP_gains.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_down2.c (93%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_down2_3.c (96%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_private.h (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_private_AR2.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_private_IIR_FIR.c (98%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_private_down_FIR.c (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_private_up2_HQ.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_rom.c (68%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_rom.h (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/resampler_structs.h (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/shell_coder.c (93%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/sigm_Q15.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/sort.c (95%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/stereo_LR_to_MS.c (91%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/stereo_MS_to_LR.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/stereo_decode_pred.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/stereo_encode_pred.c (94%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/stereo_find_predictor.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/stereo_quant_pred.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/structs.h (97%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/sum_sqr_shift.c (73%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/table_LSF_cos.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/tables.h (89%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/tables_LTP.c (87%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/tables_NLSF_CB_NB_MB.c (79%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/tables_NLSF_CB_WB.c (76%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/tables_gain.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/tables_other.c (87%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/tables_pitch_lag.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/tables_pulses_per_block.c (99%) create mode 100644 external/opus-1.3.1/silk/tests/test_unit_LPC_inv_pred_gain.c rename external/{opus-1.0.3 => opus-1.3.1}/silk/tuning_parameters.h (84%) rename external/{opus-1.0.3 => opus-1.3.1}/silk/typedef.h (96%) create mode 100644 external/opus-1.3.1/silk/x86/NSQ_del_dec_sse4_1.c create mode 100644 external/opus-1.3.1/silk/x86/NSQ_sse4_1.c create mode 100644 external/opus-1.3.1/silk/x86/SigProc_FIX_sse.h create mode 100644 external/opus-1.3.1/silk/x86/VAD_sse4_1.c create mode 100644 external/opus-1.3.1/silk/x86/VQ_WMat_EC_sse4_1.c create mode 100644 external/opus-1.3.1/silk/x86/main_sse.h create mode 100644 external/opus-1.3.1/silk/x86/x86_silk_map.c create mode 100644 external/opus-1.3.1/silk_headers.mk rename external/{opus-1.0.3 => opus-1.3.1}/silk_sources.mk (84%) create mode 100644 external/opus-1.3.1/src/analysis.c create mode 100644 external/opus-1.3.1/src/analysis.h create mode 100644 external/opus-1.3.1/src/mapping_matrix.c create mode 100644 external/opus-1.3.1/src/mapping_matrix.h create mode 100644 external/opus-1.3.1/src/mlp.c create mode 100644 external/opus-1.3.1/src/mlp.h create mode 100644 external/opus-1.3.1/src/mlp_data.c create mode 100644 external/opus-1.3.1/src/opus.c rename external/{opus-1.0.3 => opus-1.3.1}/src/opus_compare.c (99%) rename external/{opus-1.0.3 => opus-1.3.1}/src/opus_decoder.c (71%) rename external/{opus-1.0.3 => opus-1.3.1}/src/opus_demo.c (76%) create mode 100644 external/opus-1.3.1/src/opus_encoder.c create mode 100644 external/opus-1.3.1/src/opus_multistream.c create mode 100644 external/opus-1.3.1/src/opus_multistream_decoder.c create mode 100644 external/opus-1.3.1/src/opus_multistream_encoder.c create mode 100644 external/opus-1.3.1/src/opus_private.h create mode 100644 external/opus-1.3.1/src/opus_projection_decoder.c create mode 100644 external/opus-1.3.1/src/opus_projection_encoder.c create mode 100644 external/opus-1.3.1/src/repacketizer.c rename external/{opus-1.0.3 => opus-1.3.1}/src/repacketizer_demo.c (97%) create mode 100644 external/opus-1.3.1/src/tansig_table.h create mode 100755 external/opus-1.3.1/test-driver create mode 100644 external/opus-1.3.1/tests/opus_encode_regressions.c create mode 100755 external/opus-1.3.1/tests/run_vectors.sh rename external/{opus-1.0.3 => opus-1.3.1}/tests/test_opus_api.c (87%) rename external/{opus-1.0.3 => opus-1.3.1}/tests/test_opus_common.h (88%) rename external/{opus-1.0.3 => opus-1.3.1}/tests/test_opus_decode.c (88%) rename external/{opus-1.0.3 => opus-1.3.1}/tests/test_opus_encode.c (60%) create mode 100644 external/opus-1.3.1/tests/test_opus_padding.c create mode 100644 external/opus-1.3.1/tests/test_opus_projection.c create mode 100644 external/opus-1.3.1/win32/VS2015/common.props create mode 100644 external/opus-1.3.1/win32/VS2015/opus.sln create mode 100644 external/opus-1.3.1/win32/VS2015/opus.vcxproj create mode 100644 external/opus-1.3.1/win32/VS2015/opus.vcxproj.filters create mode 100644 external/opus-1.3.1/win32/VS2015/opus_demo.vcxproj rename external/{opus-1.0.3/tests/test_opus_api.vcxproj.filters => opus-1.3.1/win32/VS2015/opus_demo.vcxproj.filters} (91%) create mode 100644 external/opus-1.3.1/win32/VS2015/test_opus_api.vcxproj rename external/{opus-1.0.3/tests/test_opus_encode.vcxproj.filters => opus-1.3.1/win32/VS2015/test_opus_api.vcxproj.filters} (73%) create mode 100644 external/opus-1.3.1/win32/VS2015/test_opus_decode.vcxproj rename external/{opus-1.0.3/tests => opus-1.3.1/win32/VS2015}/test_opus_decode.vcxproj.filters (84%) create mode 100644 external/opus-1.3.1/win32/VS2015/test_opus_encode.vcxproj create mode 100644 external/opus-1.3.1/win32/VS2015/test_opus_encode.vcxproj.filters create mode 100644 external/opus-1.3.1/win32/config.h create mode 100644 external/opus-1.3.1/win32/genversion.bat delete mode 100644 external/opusfile-0.10/000-opusfile.git-67273ef.patch delete mode 100644 external/opusfile-0.10/001-opusfile.git-567165a.patch delete mode 100644 external/opusfile-0.10/003-opusfile.git-e8e3046.patch delete mode 100644 external/opusfile-0.10/package_version delete mode 100644 external/opusfile-0.10/src/Makefile.darwin rename external/{opusfile-0.10/050-opusfile-misc-port0.patch => opusfile-0.11/0000-misc-configury.patch} (76%) rename external/{opusfile-0.10/051-opusfile-misc-port1.patch => opusfile-0.11/0001-misc-mingw64.patch} (69%) rename external/{opusfile-0.10 => opusfile-0.11}/AUTHORS (100%) rename external/{opusfile-0.10 => opusfile-0.11}/COPYING (100%) rename external/{opusfile-0.10 => opusfile-0.11}/Makefile.am (100%) rename external/{opusfile-0.10 => opusfile-0.11}/Makefile.in (99%) rename external/{opusfile-0.10 => opusfile-0.11}/README.md (100%) rename external/{opusfile-0.10 => opusfile-0.11}/aclocal.m4 (75%) rename external/{opus-1.0.3 => opusfile-0.11}/compile (95%) rename external/{opus-1.0.3 => opusfile-0.11}/config.guess (80%) rename external/{opusfile-0.10 => opusfile-0.11}/config.h.in (96%) rename external/{opus-1.0.3 => opusfile-0.11}/config.sub (89%) rename external/{opusfile-0.10 => opusfile-0.11}/configure (99%) rename external/{opusfile-0.10 => opusfile-0.11}/configure.ac (98%) rename external/{opus-1.0.3 => opusfile-0.11}/depcomp (59%) rename external/{opusfile-0.10 => opusfile-0.11}/doc/Doxyfile.in (100%) rename external/{opusfile-0.10 => opusfile-0.11}/doc/opus_logo.svg (100%) rename external/{opusfile-0.10 => opusfile-0.11}/examples/opusfile_example.c (100%) rename external/{opusfile-0.10 => opusfile-0.11}/examples/seeking_example.c (100%) rename external/{opusfile-0.10 => opusfile-0.11}/examples/win32utf8.c (100%) rename external/{opusfile-0.10 => opusfile-0.11}/examples/win32utf8.h (100%) rename external/{opusfile-0.10 => opusfile-0.11}/include/opusfile.h (100%) rename external/{opus-1.0.3 => opusfile-0.11}/install-sh (58%) rename external/{opusfile-0.10 => opusfile-0.11}/ltmain.sh (100%) rename external/{opusfile-0.10 => opusfile-0.11}/m4/attributes.m4 (100%) rename external/{opusfile-0.10 => opusfile-0.11}/m4/libtool.m4 (100%) rename external/{opus-1.0.3 => opusfile-0.11}/m4/ltoptions.m4 (73%) rename external/{opus-1.0.3 => opusfile-0.11}/m4/ltsugar.m4 (95%) rename external/{opus-1.0.3 => opusfile-0.11}/m4/ltversion.m4 (68%) rename external/{opus-1.0.3 => opusfile-0.11}/m4/lt~obsolete.m4 (98%) create mode 100644 external/opusfile-0.11/m4/pkg.m4 create mode 100755 external/opusfile-0.11/missing rename external/{opusfile-0.10 => opusfile-0.11}/opusfile-uninstalled.pc.in (100%) rename external/{opusfile-0.10 => opusfile-0.11}/opusfile.pc.in (100%) rename external/{opusfile-0.10 => opusfile-0.11}/opusurl-uninstalled.pc.in (100%) rename external/{opusfile-0.10 => opusfile-0.11}/opusurl.pc.in (100%) create mode 100644 external/opusfile-0.11/package_version rename external/{opusfile-0.10 => opusfile-0.11}/src/http.c (99%) rename external/{opusfile-0.10 => opusfile-0.11}/src/info.c (99%) rename external/{opusfile-0.10 => opusfile-0.11}/src/internal.c (100%) rename external/{opusfile-0.10 => opusfile-0.11}/src/internal.h (100%) rename external/{opusfile-0.10 => opusfile-0.11}/src/opusfile.c (100%) rename external/{opusfile-0.10 => opusfile-0.11}/src/stream.c (100%) rename external/{opusfile-0.10 => opusfile-0.11}/src/wincerts.c (100%) rename external/{opusfile-0.10 => opusfile-0.11}/src/winerrno.h (100%) rename external/{opusfile-0.10 => opusfile-0.11}/win32/VS2015/opusfile.sln (100%) rename external/{opusfile-0.10 => opusfile-0.11}/win32/VS2015/opusfile.vcxproj (100%) rename external/{opusfile-0.10 => opusfile-0.11}/win32/VS2015/opusfile.vcxproj.filters (100%) rename external/{opusfile-0.10 => opusfile-0.11}/win32/VS2015/opusfile_example.vcxproj (100%) rename external/{opusfile-0.10 => opusfile-0.11}/win32/VS2015/opusfile_example.vcxproj.filters (100%) rename external/{opusfile-0.10 => opusfile-0.11}/win32/VS2015/seeking_example.vcxproj (100%) rename external/{opusfile-0.10 => opusfile-0.11}/win32/VS2015/seeking_example.vcxproj.filters (100%) diff --git a/VisualC/external/include/opus/opus.h b/VisualC/external/include/opus/opus.h index cdf79875..dd5a8fe2 100644 --- a/VisualC/external/include/opus/opus.h +++ b/VisualC/external/include/opus/opus.h @@ -142,7 +142,7 @@ extern "C" { * * opus_encode() and opus_encode_float() return the number of bytes actually written to the packet. * The return value can be negative, which indicates that an error has occurred. If the return value - * is 1 byte, then the packet does not need to be transmitted (DTX). + * is 2 bytes or less, then the packet does not need to be transmitted (DTX). * * Once the encoder state if no longer needed, it can be destroyed with * @@ -531,7 +531,7 @@ OPUS_EXPORT int opus_packet_parse( const unsigned char *frames[48], opus_int16 size[48], int *payload_offset -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5); /** Gets the bandwidth of an Opus packet. * @param [in] data char*: Opus packet @@ -592,6 +592,20 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigne * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); + +/** Applies soft-clipping to bring a float signal within the [-1,1] range. If + * the signal is already in that range, nothing is done. If there are values + * outside of [-1,1], then the signal is clipped as smoothly as possible to + * both fit in the range and avoid creating excessive distortion in the + * process. + * @param [in,out] pcm float*: Input PCM and modified PCM + * @param [in] frame_size int Number of samples per channel to process + * @param [in] channels int: Number of channels + * @param [in,out] softclip_mem float*: State memory for the soft clipping process (one float per channel, initialized to zero) + */ +OPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem); + + /**@}*/ /** @defgroup opus_repacketizer Repacketizer @@ -602,7 +616,10 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDe * merged. Splitting valid Opus packets is always guaranteed to succeed, * whereas merging valid packets only succeeds if all frames have the same * mode, bandwidth, and frame size, and when the total duration of the merged - * packet is no more than 120 ms. + * packet is no more than 120 ms. The 120 ms limit comes from the + * specification and limits decoder memory requirements at a point where + * framing overhead becomes negligible. + * * The repacketizer currently only operates on elementary Opus * streams. It will not manipualte multistream packets successfully, except in * the degenerate case where they consist of data from a single stream. @@ -897,6 +914,64 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepa */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1); +/** Pads a given Opus packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len); + +/** Remove all padding from a given Opus packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len); + +/** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams); + +/** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams); + /**@}*/ #ifdef __cplusplus diff --git a/VisualC/external/include/opus/opus_defines.h b/VisualC/external/include/opus/opus_defines.h index c42d301e..5a70270d 100644 --- a/VisualC/external/include/opus/opus_defines.h +++ b/VisualC/external/include/opus/opus_defines.h @@ -46,7 +46,7 @@ extern "C" { #define OPUS_OK 0 /** One or more invalid/out of range arguments @hideinitializer*/ #define OPUS_BAD_ARG -1 -/** The mode struct passed is invalid @hideinitializer*/ +/** Not enough bytes allocated in the buffer @hideinitializer*/ #define OPUS_BUFFER_TOO_SMALL -2 /** An internal error was detected @hideinitializer*/ #define OPUS_INTERNAL_ERROR -3 @@ -98,6 +98,18 @@ extern "C" { # define OPUS_RESTRICT restrict #endif +#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if OPUS_GNUC_PREREQ(2,7) +# define OPUS_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define OPUS_INLINE __inline +# else +# define OPUS_INLINE +# endif +#else +# define OPUS_INLINE inline +#endif + /**Warning attributes for opus functions * NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out * some paranoid null checks. */ @@ -148,15 +160,24 @@ extern "C" { #define OPUS_GET_GAIN_REQUEST 4045 /* Should have been 4035 */ #define OPUS_SET_LSB_DEPTH_REQUEST 4036 #define OPUS_GET_LSB_DEPTH_REQUEST 4037 - #define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039 - +#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040 +#define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041 +#define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042 +#define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043 /* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */ +#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046 +#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047 +#define OPUS_GET_IN_DTX_REQUEST 4049 + +/** Defines for the presence of extended APIs. */ +#define OPUS_HAVE_OPUS_PROJECTION_H /* Macros to trigger compilation errors when the wrong types are provided to a CTL */ #define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x)) #define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr))) #define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr))) +#define __opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr))) /** @endcond */ /** @defgroup opus_ctlvalues Pre-defined values for CTL interface @@ -185,6 +206,17 @@ extern "C" { #define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12 kHz bandpass @hideinitializer*/ #define OPUS_BANDWIDTH_FULLBAND 1105 /**<20 kHz bandpass @hideinitializer*/ +#define OPUS_FRAMESIZE_ARG 5000 /**< Select frame size from the argument (default) */ +#define OPUS_FRAMESIZE_2_5_MS 5001 /**< Use 2.5 ms frames */ +#define OPUS_FRAMESIZE_5_MS 5002 /**< Use 5 ms frames */ +#define OPUS_FRAMESIZE_10_MS 5003 /**< Use 10 ms frames */ +#define OPUS_FRAMESIZE_20_MS 5004 /**< Use 20 ms frames */ +#define OPUS_FRAMESIZE_40_MS 5005 /**< Use 40 ms frames */ +#define OPUS_FRAMESIZE_60_MS 5006 /**< Use 60 ms frames */ +#define OPUS_FRAMESIZE_80_MS 5007 /**< Use 80 ms frames */ +#define OPUS_FRAMESIZE_100_MS 5008 /**< Use 100 ms frames */ +#define OPUS_FRAMESIZE_120_MS 5009 /**< Use 120 ms frames */ + /**@}*/ @@ -250,7 +282,6 @@ extern "C" { /** Enables or disables variable bitrate (VBR) in the encoder. * The configured bitrate may not be met exactly because frames must * be an integer number of bytes in length. - * @warning Only the MDCT mode of Opus can provide hard CBR behavior. * @see OPUS_GET_VBR * @see OPUS_SET_VBR_CONSTRAINT * @param[in] x opus_int32: Allowed values: @@ -430,14 +461,6 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_int_ptr(x) -/** Gets the sampling rate the encoder or decoder was initialized with. - * This simply returns the Fs value passed to opus_encoder_init() - * or opus_decoder_init(). - * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. - * @hideinitializer - */ -#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) - /** Gets the total samples of delay added by the entire codec. * This can be queried by the encoder and then the provided number of samples can be * skipped on from the start of the decoder's output to provide time aligned input @@ -474,9 +497,9 @@ extern "C" { #define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_int_ptr(x) /** Configures the encoder's expected packet loss percentage. - * Higher values with trigger progressively more loss resistant behavior in the encoder - * at the expense of quality at a given bitrate in the lossless case, but greater quality - * under loss. + * Higher values trigger progressively more loss resistant behavior in the encoder + * at the expense of quality at a given bitrate in the absence of packet loss, but + * greater quality under loss. * @see OPUS_GET_PACKET_LOSS_PERC * @param[in] x opus_int32: Loss percentage in the range 0-100, inclusive (default: 0). * @hideinitializer */ @@ -508,7 +531,19 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x) /** Configures the depth of signal being encoded. + * * This is a hint which helps the encoder identify silence and near-silence. + * It represents the number of significant bits of linear intensity below + * which the signal contains ignorable quantization or other noise. + * + * For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting + * for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate + * for 16-bit linear pcm input with opus_encode_float(). + * + * When using opus_encode() instead of opus_encode_float(), or when libopus + * is compiled for fixed-point, the encoder uses the minimum of the value + * set here and the value 16. + * * @see OPUS_GET_LSB_DEPTH * @param[in] x opus_int32: Input precision in bits, between 8 and 24 * (default: 24). @@ -521,10 +556,68 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, __opus_check_int_ptr(x) -/** Gets the duration (in samples) of the last packet successfully decoded or concealed. - * @param[out] x opus_int32 *: Number of samples (at current sampling rate). +/** Configures the encoder's use of variable duration frames. + * When variable duration is enabled, the encoder is free to use a shorter frame + * size than the one requested in the opus_encode*() call. + * It is then the user's responsibility + * to verify how much audio was encoded by checking the ToC byte of the encoded + * packet. The part of the audio that was not encoded needs to be resent to the + * encoder for the next call. Do not use this option unless you really + * know what you are doing. + * @see OPUS_GET_EXPERT_FRAME_DURATION + * @param[in] x opus_int32: Allowed values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
+ *
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
+ *
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
+ *
* @hideinitializer */ -#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) +#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured use of variable duration frames. + * @see OPUS_SET_EXPERT_FRAME_DURATION + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
+ *
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
+ *
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
+ *
+ * @hideinitializer */ +#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables almost all use of prediction, making frames almost + * completely independent. This reduces quality. + * @see OPUS_GET_PREDICTION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable prediction (default).
+ *
1
Disable prediction.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured prediction status. + * @see OPUS_SET_PREDICTION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Prediction enabled (default).
+ *
1
Prediction disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_genericctls Generic CTLs @@ -578,18 +671,6 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_uint_ptr(x) -/** Gets the pitch of the last decoded frame, if available. - * This can be used for any post-processing algorithm requiring the use of pitch, - * e.g. time stretching/shortening. If the last frame was not voiced, or if the - * pitch was not coded in the frame, then zero is returned. - * - * This CTL is only implemented for decoder instances. - * - * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) - * - * @hideinitializer */ -#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) - /** Gets the encoder's configured bandpass or the decoder's last bandpass. * @see OPUS_SET_BANDWIDTH * @param[out] x opus_int32 *: Returns one of the following values: @@ -604,6 +685,48 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x) +/** Gets the sampling rate the encoder or decoder was initialized with. + * This simply returns the Fs value passed to opus_encoder_init() + * or opus_decoder_init(). + * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. + * @hideinitializer + */ +#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables the use of phase inversion for intensity stereo, + * improving the quality of mono downmixes, but slightly reducing normal + * stereo quality. Disabling phase inversion in the decoder does not comply + * with RFC 6716, although it does not cause any interoperability issue and + * is expected to become part of the Opus standard once RFC 6716 is updated + * by draft-ietf-codec-opus-update. + * @see OPUS_GET_PHASE_INVERSION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable phase inversion (default).
+ *
1
Disable phase inversion.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured phase inversion status. + * @see OPUS_SET_PHASE_INVERSION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Stereo phase inversion enabled (default).
+ *
1
Stereo phase inversion disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int_ptr(x) +/** Gets the DTX state of the encoder. + * Returns whether the last encoded frame was either a comfort noise update + * during DTX or not encoded because of DTX. + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
The encoder is not in DTX.
+ *
1
The encoder is in DTX.
+ *
+ * @hideinitializer */ +#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_decoderctls Decoder related CTLs @@ -628,6 +751,23 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x) +/** Gets the duration (in samples) of the last packet successfully decoded or concealed. + * @param[out] x opus_int32 *: Number of samples (at current sampling rate). + * @hideinitializer */ +#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** Gets the pitch of the last decoded frame, if available. + * This can be used for any post-processing algorithm requiring the use of pitch, + * e.g. time stretching/shortening. If the last frame was not voiced, or if the + * pitch was not coded in the frame, then zero is returned. + * + * This CTL is only implemented for decoder instances. + * + * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) + * + * @hideinitializer */ +#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_libinfo Opus library information functions @@ -642,6 +782,10 @@ extern "C" { OPUS_EXPORT const char *opus_strerror(int error); /** Gets the libopus version string. + * + * Applications may look for the substring "-fixed" in the version string to + * determine whether they have a fixed-point or floating-point build at + * runtime. * * @returns Version string */ diff --git a/VisualC/external/include/opus/opus_multistream.h b/VisualC/external/include/opus/opus_multistream.h index 965d54ab..0347310a 100644 --- a/VisualC/external/include/opus/opus_multistream.h +++ b/VisualC/external/include/opus/opus_multistream.h @@ -110,10 +110,10 @@ extern "C" { * packets produced by the encoder. Some basic information, such as packet * duration, can be computed without any special negotiation. * - * The format for multistream Opus packets is defined in the - * Ogg - * encapsulation specification and is based on the self-delimited Opus - * framing described in Appendix B of RFC 6716. + * The format for multistream Opus packets is defined in + * RFC 7845 + * and is based on the self-delimited Opus framing described in Appendix B of + * RFC 6716. * Normal Opus packets are just a degenerate case of multistream Opus packets, * and can be encoded or decoded with the multistream API by setting * streams to 1 when initializing the encoder or @@ -140,7 +140,7 @@ extern "C" { * * The output channels specified by the encoder * should use the - * Vorbis + * Vorbis * channel ordering. A decoder may wish to apply an additional permutation * to the mapping the encoder used to achieve a different output channel * order (e.g. for outputing in WAV order). @@ -273,7 +273,7 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_enc unsigned char *mapping, int application, int *error -) OPUS_ARG_NONNULL(5); +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); /** Initialize a previously allocated multistream encoder state. * The memory pointed to by \a st must be at least the size returned by @@ -342,7 +342,7 @@ OPUS_EXPORT int opus_multistream_surround_encoder_init( int *coupled_streams, unsigned char *mapping, int application -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7); /** Encodes a multistream Opus frame. * @param st OpusMSEncoder*: Multistream encoder state. diff --git a/VisualC/external/include/opus/opus_projection.h b/VisualC/external/include/opus/opus_projection.h new file mode 100644 index 00000000..9dabf4e8 --- /dev/null +++ b/VisualC/external/include/opus/opus_projection.h @@ -0,0 +1,568 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * @file opus_projection.h + * @brief Opus projection reference API + */ + +#ifndef OPUS_PROJECTION_H +#define OPUS_PROJECTION_H + +#include "opus_multistream.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond OPUS_INTERNAL_DOC */ + +/** These are the actual encoder and decoder CTL ID numbers. + * They should not be used directly by applications.c + * In general, SETs should be even and GETs should be odd.*/ +/**@{*/ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005 +/**@}*/ + + +/** @endcond */ + +/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs + * + * These are convenience macros that are specific to the + * opus_projection_encoder_ctl() and opus_projection_decoder_ctl() + * interface. + * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, + * @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a + * projection encoder or decoder as well. + */ +/**@{*/ + +/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the gain (in dB. S7.8-format) + * of the demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, __opus_check_int_ptr(x) + + +/** Gets the size in bytes of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the size in bytes of the + * demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, __opus_check_int_ptr(x) + + +/** Copies the demixing matrix to the supplied pointer location. + * @param[out] x unsigned char *: Returns the demixing matrix to the + * supplied pointer location. + * @param y opus_int32: The size in bytes of the reserved memory at the + * pointer location. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, __opus_check_int(y) + + +/**@}*/ + +/** Opus projection encoder state. + * This contains the complete state of a projection Opus encoder. + * It is position independent and can be freely copied. + * @see opus_projection_ambisonics_encoder_create + */ +typedef struct OpusProjectionEncoder OpusProjectionEncoder; + + +/** Opus projection decoder state. + * This contains the complete state of a projection Opus decoder. + * It is position independent and can be freely copied. + * @see opus_projection_decoder_create + * @see opus_projection_decoder_init + */ +typedef struct OpusProjectionDecoder OpusProjectionDecoder; + + +/**\name Projection encoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionEncoder structure. + * @param channels int: The total number of input channels to encode. + * This must be no more than 255. + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size( + int channels, + int mapping_family +); + + +/** Allocates and initializes a projection encoder state. + * Call opus_projection_encoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @param[out] streams int *: The total number of streams that will + * be encoded from the input. + * @param[out] coupled_streams int *: Number of coupled (2 channel) + * streams that will be encoded from the input. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionEncoder *opus_projection_ambisonics_encoder_create( + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application, + int *error +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5); + + +/** Initialize a previously allocated projection encoder state. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_ambisonics_encoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_ambisonics_encoder_create + * @see opus_projection_ambisonics_encoder_get_size + * @param st OpusProjectionEncoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param streams int: The total number of streams to encode from the + * input. + * This must be no more than the number of channels. + * @param coupled_streams int: Number of coupled (2 channel) streams + * to encode. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * encoded channels (streams + + * coupled_streams) must be no + * more than the number of input channels. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_ambisonics_encoder_init( + OpusProjectionEncoder *st, + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); + + +/** Encodes a projection Opus frame. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const opus_int16*: The input signal as interleaved + * samples. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode( + OpusProjectionEncoder *st, + const opus_int16 *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Encodes a projection Opus frame from floating point input. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const float*: The input signal as interleaved + * samples with a normal range of + * +/-1.0. + * Samples with a range beyond +/-1.0 + * are supported but will be clipped by + * decoders using the integer API and + * should only be used if it is known + * that the far end supports extended + * dynamic range. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float( + OpusProjectionEncoder *st, + const float *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Frees an OpusProjectionEncoder allocated by + * opus_projection_ambisonics_encoder_create(). + * @param st OpusProjectionEncoder*: Projection encoder state to be freed. + */ +OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st); + + +/** Perform a CTL function on a projection Opus encoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_encoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls + * @see opus_genericctls + * @see opus_encoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/**@}*/ + +/**\name Projection decoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionDecoder structure. + * @param channels int: The total number of output channels. + * This must be no more than 255. + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size( + int channels, + int streams, + int coupled_streams +); + + +/** Allocates and initializes a projection decoder state. + * Call opus_projection_decoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size, + int *error +) OPUS_ARG_NONNULL(5); + + +/** Intialize a previously allocated projection decoder state object. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_decoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_decoder_create + * @see opus_projection_deocder_get_size + * @param st OpusProjectionDecoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_decoder_init( + OpusProjectionDecoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); + + +/** Decode a projection Opus packet. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + opus_int16 *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Decode a projection Opus packet with floating point output. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + float *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Perform a CTL function on a projection Opus decoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_decoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls. + * @see opus_genericctls + * @see opus_decoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/** Frees an OpusProjectionDecoder allocated by + * opus_projection_decoder_create(). + * @param st OpusProjectionDecoder: Projection decoder state to be freed. + */ +OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st); + + +/**@}*/ + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_PROJECTION_H */ diff --git a/VisualC/external/include/opus/opus_types.h b/VisualC/external/include/opus/opus_types.h index b28e03ae..7cf67558 100644 --- a/VisualC/external/include/opus/opus_types.h +++ b/VisualC/external/include/opus/opus_types.h @@ -33,14 +33,29 @@ #ifndef OPUS_TYPES_H #define OPUS_TYPES_H +#define opus_int int /* used for counters etc; at least 16 bits */ +#define opus_int64 long long +#define opus_int8 signed char + +#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ +#define opus_uint64 unsigned long long +#define opus_uint8 unsigned char + /* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ -#if (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) +#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) #include - +# undef opus_int64 +# undef opus_int8 +# undef opus_uint64 +# undef opus_uint8 + typedef int8_t opus_int8; + typedef uint8_t opus_uint8; typedef int16_t opus_int16; typedef uint16_t opus_uint16; typedef int32_t opus_int32; typedef uint32_t opus_uint32; + typedef int64_t opus_int64; + typedef uint64_t opus_uint64; #elif defined(_WIN32) # if defined(__CYGWIN__) @@ -148,12 +163,4 @@ #endif -#define opus_int int /* used for counters etc; at least 16 bits */ -#define opus_int64 long long -#define opus_int8 signed char - -#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ -#define opus_uint64 unsigned long long -#define opus_uint8 unsigned char - #endif /* OPUS_TYPES_H */ diff --git a/VisualC/external/lib/x64/LICENSE.opus.txt b/VisualC/external/lib/x64/LICENSE.opus.txt index e6681a4d..c43fe9c0 100644 --- a/VisualC/external/lib/x64/LICENSE.opus.txt +++ b/VisualC/external/lib/x64/LICENSE.opus.txt @@ -18,7 +18,7 @@ notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/VisualC/external/lib/x64/libopus-0.dll b/VisualC/external/lib/x64/libopus-0.dll index 068f50e33a6eb408dba35e9f43ab5510dcae3405..df42e883ece947ef69f8e964ef398e558706938f 100644 GIT binary patch literal 328704 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�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 literal 124928 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 j!}#djWmzkW3M^TezqUP2JZpMNkJee$(r}?Rh`f delta 4783 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

A#dkYcz!*TVoz^`h;_XYzgIMSuwT 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 J|K}y}KLA1YiQfPK literal 114688 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�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⁡?@{y<{;_(b=miOhsV=ZD>zGCsMe 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 z

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 Xl}TmEY1Q@H38kjAREkXbRzCj=!H_&2 diff --git a/VisualC/external/lib/x86/libopusfile-0.dll b/VisualC/external/lib/x86/libopusfile-0.dll index 65b6ac3aa75ffc926be934b90086d1c766547362..4596684d17e611540ad530be0b48e2e8218fb7ed 100644 GIT binary patch delta 4944 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 l>zaAmCE5(_2JKeun7Gq%=OM!q>9AQ>${e delta 4885 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 kXU!MQPo?Iku1Q^=x;ZrhmwJ+d@-5Fcan be negative, which indicates that an error has occurred. If the return value - * is 1 byte, then the packet does not need to be transmitted (DTX). + * is 2 bytes or less, then the packet does not need to be transmitted (DTX). * * Once the encoder state if no longer needed, it can be destroyed with * @@ -531,7 +531,7 @@ OPUS_EXPORT int opus_packet_parse( const unsigned char *frames[48], opus_int16 size[48], int *payload_offset -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5); /** Gets the bandwidth of an Opus packet. * @param [in] data char*: Opus packet @@ -592,6 +592,20 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigne * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); + +/** Applies soft-clipping to bring a float signal within the [-1,1] range. If + * the signal is already in that range, nothing is done. If there are values + * outside of [-1,1], then the signal is clipped as smoothly as possible to + * both fit in the range and avoid creating excessive distortion in the + * process. + * @param [in,out] pcm float*: Input PCM and modified PCM + * @param [in] frame_size int Number of samples per channel to process + * @param [in] channels int: Number of channels + * @param [in,out] softclip_mem float*: State memory for the soft clipping process (one float per channel, initialized to zero) + */ +OPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem); + + /**@}*/ /** @defgroup opus_repacketizer Repacketizer @@ -602,7 +616,10 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDe * merged. Splitting valid Opus packets is always guaranteed to succeed, * whereas merging valid packets only succeeds if all frames have the same * mode, bandwidth, and frame size, and when the total duration of the merged - * packet is no more than 120 ms. + * packet is no more than 120 ms. The 120 ms limit comes from the + * specification and limits decoder memory requirements at a point where + * framing overhead becomes negligible. + * * The repacketizer currently only operates on elementary Opus * streams. It will not manipualte multistream packets successfully, except in * the degenerate case where they consist of data from a single stream. @@ -897,6 +914,64 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepa */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1); +/** Pads a given Opus packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len); + +/** Remove all padding from a given Opus packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len); + +/** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams); + +/** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams); + /**@}*/ #ifdef __cplusplus diff --git a/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_defines.h b/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_defines.h index 965ce030..ceee5b84 100644 --- a/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_defines.h +++ b/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_defines.h @@ -46,7 +46,7 @@ extern "C" { #define OPUS_OK 0 /** One or more invalid/out of range arguments @hideinitializer*/ #define OPUS_BAD_ARG -1 -/** The mode struct passed is invalid @hideinitializer*/ +/** Not enough bytes allocated in the buffer @hideinitializer*/ #define OPUS_BUFFER_TOO_SMALL -2 /** An internal error was detected @hideinitializer*/ #define OPUS_INTERNAL_ERROR -3 @@ -98,6 +98,18 @@ extern "C" { # define OPUS_RESTRICT restrict #endif +#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if OPUS_GNUC_PREREQ(2,7) +# define OPUS_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define OPUS_INLINE __inline +# else +# define OPUS_INLINE +# endif +#else +# define OPUS_INLINE inline +#endif + /**Warning attributes for opus functions * NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out * some paranoid null checks. */ @@ -148,15 +160,24 @@ extern "C" { #define OPUS_GET_GAIN_REQUEST 4045 /* Should have been 4035 */ #define OPUS_SET_LSB_DEPTH_REQUEST 4036 #define OPUS_GET_LSB_DEPTH_REQUEST 4037 - #define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039 - +#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040 +#define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041 +#define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042 +#define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043 /* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */ +#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046 +#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047 +#define OPUS_GET_IN_DTX_REQUEST 4049 + +/** Defines for the presence of extended APIs. */ +#define OPUS_HAVE_OPUS_PROJECTION_H /* Macros to trigger compilation errors when the wrong types are provided to a CTL */ #define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x)) #define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr))) #define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr))) +#define __opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr))) /** @endcond */ /** @defgroup opus_ctlvalues Pre-defined values for CTL interface @@ -185,6 +206,17 @@ extern "C" { #define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12 kHz bandpass @hideinitializer*/ #define OPUS_BANDWIDTH_FULLBAND 1105 /**<20 kHz bandpass @hideinitializer*/ +#define OPUS_FRAMESIZE_ARG 5000 /**< Select frame size from the argument (default) */ +#define OPUS_FRAMESIZE_2_5_MS 5001 /**< Use 2.5 ms frames */ +#define OPUS_FRAMESIZE_5_MS 5002 /**< Use 5 ms frames */ +#define OPUS_FRAMESIZE_10_MS 5003 /**< Use 10 ms frames */ +#define OPUS_FRAMESIZE_20_MS 5004 /**< Use 20 ms frames */ +#define OPUS_FRAMESIZE_40_MS 5005 /**< Use 40 ms frames */ +#define OPUS_FRAMESIZE_60_MS 5006 /**< Use 60 ms frames */ +#define OPUS_FRAMESIZE_80_MS 5007 /**< Use 80 ms frames */ +#define OPUS_FRAMESIZE_100_MS 5008 /**< Use 100 ms frames */ +#define OPUS_FRAMESIZE_120_MS 5009 /**< Use 120 ms frames */ + /**@}*/ @@ -250,7 +282,6 @@ extern "C" { /** Enables or disables variable bitrate (VBR) in the encoder. * The configured bitrate may not be met exactly because frames must * be an integer number of bytes in length. - * @warning Only the MDCT mode of Opus can provide hard CBR behavior. * @see OPUS_GET_VBR * @see OPUS_SET_VBR_CONSTRAINT * @param[in] x opus_int32: Allowed values: @@ -430,14 +461,6 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_int_ptr(x) -/** Gets the sampling rate the encoder or decoder was initialized with. - * This simply returns the Fs value passed to opus_encoder_init() - * or opus_decoder_init(). - * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. - * @hideinitializer - */ -#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) - /** Gets the total samples of delay added by the entire codec. * This can be queried by the encoder and then the provided number of samples can be * skipped on from the start of the decoder's output to provide time aligned input @@ -474,9 +497,9 @@ extern "C" { #define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_int_ptr(x) /** Configures the encoder's expected packet loss percentage. - * Higher values with trigger progressively more loss resistant behavior in the encoder - * at the expense of quality at a given bitrate in the lossless case, but greater quality - * under loss. + * Higher values trigger progressively more loss resistant behavior in the encoder + * at the expense of quality at a given bitrate in the absence of packet loss, but + * greater quality under loss. * @see OPUS_GET_PACKET_LOSS_PERC * @param[in] x opus_int32: Loss percentage in the range 0-100, inclusive (default: 0). * @hideinitializer */ @@ -508,7 +531,19 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x) /** Configures the depth of signal being encoded. + * * This is a hint which helps the encoder identify silence and near-silence. + * It represents the number of significant bits of linear intensity below + * which the signal contains ignorable quantization or other noise. + * + * For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting + * for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate + * for 16-bit linear pcm input with opus_encode_float(). + * + * When using opus_encode() instead of opus_encode_float(), or when libopus + * is compiled for fixed-point, the encoder uses the minimum of the value + * set here and the value 16. + * * @see OPUS_GET_LSB_DEPTH * @param[in] x opus_int32: Input precision in bits, between 8 and 24 * (default: 24). @@ -521,10 +556,68 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, __opus_check_int_ptr(x) -/** Gets the duration (in samples) of the last packet successfully decoded or concealed. - * @param[out] x opus_int32 *: Number of samples (at current sampling rate). +/** Configures the encoder's use of variable duration frames. + * When variable duration is enabled, the encoder is free to use a shorter frame + * size than the one requested in the opus_encode*() call. + * It is then the user's responsibility + * to verify how much audio was encoded by checking the ToC byte of the encoded + * packet. The part of the audio that was not encoded needs to be resent to the + * encoder for the next call. Do not use this option unless you really + * know what you are doing. + * @see OPUS_GET_EXPERT_FRAME_DURATION + * @param[in] x opus_int32: Allowed values: + *

+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
+ *
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
+ *
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
+ *
* @hideinitializer */ -#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) +#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured use of variable duration frames. + * @see OPUS_SET_EXPERT_FRAME_DURATION + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
+ *
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
+ *
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
+ *
+ * @hideinitializer */ +#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables almost all use of prediction, making frames almost + * completely independent. This reduces quality. + * @see OPUS_GET_PREDICTION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable prediction (default).
+ *
1
Disable prediction.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured prediction status. + * @see OPUS_SET_PREDICTION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Prediction enabled (default).
+ *
1
Prediction disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_genericctls Generic CTLs @@ -578,18 +671,6 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_uint_ptr(x) -/** Gets the pitch of the last decoded frame, if available. - * This can be used for any post-processing algorithm requiring the use of pitch, - * e.g. time stretching/shortening. If the last frame was not voiced, or if the - * pitch was not coded in the frame, then zero is returned. - * - * This CTL is only implemented for decoder instances. - * - * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) - * - * @hideinitializer */ -#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) - /** Gets the encoder's configured bandpass or the decoder's last bandpass. * @see OPUS_SET_BANDWIDTH * @param[out] x opus_int32 *: Returns one of the following values: @@ -604,6 +685,48 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x) +/** Gets the sampling rate the encoder or decoder was initialized with. + * This simply returns the Fs value passed to opus_encoder_init() + * or opus_decoder_init(). + * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. + * @hideinitializer + */ +#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables the use of phase inversion for intensity stereo, + * improving the quality of mono downmixes, but slightly reducing normal + * stereo quality. Disabling phase inversion in the decoder does not comply + * with RFC 6716, although it does not cause any interoperability issue and + * is expected to become part of the Opus standard once RFC 6716 is updated + * by draft-ietf-codec-opus-update. + * @see OPUS_GET_PHASE_INVERSION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable phase inversion (default).
+ *
1
Disable phase inversion.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured phase inversion status. + * @see OPUS_SET_PHASE_INVERSION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Stereo phase inversion enabled (default).
+ *
1
Stereo phase inversion disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int_ptr(x) +/** Gets the DTX state of the encoder. + * Returns whether the last encoded frame was either a comfort noise update + * during DTX or not encoded because of DTX. + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
The encoder is not in DTX.
+ *
1
The encoder is in DTX.
+ *
+ * @hideinitializer */ +#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_decoderctls Decoder related CTLs @@ -628,6 +751,23 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x) +/** Gets the duration (in samples) of the last packet successfully decoded or concealed. + * @param[out] x opus_int32 *: Number of samples (at current sampling rate). + * @hideinitializer */ +#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** Gets the pitch of the last decoded frame, if available. + * This can be used for any post-processing algorithm requiring the use of pitch, + * e.g. time stretching/shortening. If the last frame was not voiced, or if the + * pitch was not coded in the frame, then zero is returned. + * + * This CTL is only implemented for decoder instances. + * + * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) + * + * @hideinitializer */ +#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_libinfo Opus library information functions @@ -642,6 +782,10 @@ extern "C" { OPUS_EXPORT const char *opus_strerror(int error); /** Gets the libopus version string. + * + * Applications may look for the substring "-fixed" in the version string to + * determine whether they have a fixed-point or floating-point build at + * runtime. * * @returns Version string */ diff --git a/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_multistream.h b/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_multistream.h index ae599793..babcee69 100644 --- a/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_multistream.h +++ b/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_multistream.h @@ -110,10 +110,10 @@ extern "C" { * packets produced by the encoder. Some basic information, such as packet * duration, can be computed without any special negotiation. * - * The format for multistream Opus packets is defined in the - *
Ogg - * encapsulation specification and is based on the self-delimited Opus - * framing described in Appendix B of RFC 6716. + * The format for multistream Opus packets is defined in + * RFC 7845 + * and is based on the self-delimited Opus framing described in Appendix B of + * RFC 6716. * Normal Opus packets are just a degenerate case of multistream Opus packets, * and can be encoded or decoded with the multistream API by setting * streams to 1 when initializing the encoder or @@ -140,7 +140,7 @@ extern "C" { * * The output channels specified by the encoder * should use the - * Vorbis + * Vorbis * channel ordering. A decoder may wish to apply an additional permutation * to the mapping the encoder used to achieve a different output channel * order (e.g. for outputing in WAV order). @@ -273,7 +273,7 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_enc unsigned char *mapping, int application, int *error -) OPUS_ARG_NONNULL(5); +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); /** Initialize a previously allocated multistream encoder state. * The memory pointed to by \a st must be at least the size returned by @@ -342,7 +342,7 @@ OPUS_EXPORT int opus_multistream_surround_encoder_init( int *coupled_streams, unsigned char *mapping, int application -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7); /** Encodes a multistream Opus frame. * @param st OpusMSEncoder*: Multistream encoder state. diff --git a/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_projection.h b/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_projection.h new file mode 100644 index 00000000..9dabf4e8 --- /dev/null +++ b/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_projection.h @@ -0,0 +1,568 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * @file opus_projection.h + * @brief Opus projection reference API + */ + +#ifndef OPUS_PROJECTION_H +#define OPUS_PROJECTION_H + +#include "opus_multistream.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond OPUS_INTERNAL_DOC */ + +/** These are the actual encoder and decoder CTL ID numbers. + * They should not be used directly by applications.c + * In general, SETs should be even and GETs should be odd.*/ +/**@{*/ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005 +/**@}*/ + + +/** @endcond */ + +/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs + * + * These are convenience macros that are specific to the + * opus_projection_encoder_ctl() and opus_projection_decoder_ctl() + * interface. + * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, + * @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a + * projection encoder or decoder as well. + */ +/**@{*/ + +/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the gain (in dB. S7.8-format) + * of the demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, __opus_check_int_ptr(x) + + +/** Gets the size in bytes of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the size in bytes of the + * demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, __opus_check_int_ptr(x) + + +/** Copies the demixing matrix to the supplied pointer location. + * @param[out] x unsigned char *: Returns the demixing matrix to the + * supplied pointer location. + * @param y opus_int32: The size in bytes of the reserved memory at the + * pointer location. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, __opus_check_int(y) + + +/**@}*/ + +/** Opus projection encoder state. + * This contains the complete state of a projection Opus encoder. + * It is position independent and can be freely copied. + * @see opus_projection_ambisonics_encoder_create + */ +typedef struct OpusProjectionEncoder OpusProjectionEncoder; + + +/** Opus projection decoder state. + * This contains the complete state of a projection Opus decoder. + * It is position independent and can be freely copied. + * @see opus_projection_decoder_create + * @see opus_projection_decoder_init + */ +typedef struct OpusProjectionDecoder OpusProjectionDecoder; + + +/**\name Projection encoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionEncoder structure. + * @param channels int: The total number of input channels to encode. + * This must be no more than 255. + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size( + int channels, + int mapping_family +); + + +/** Allocates and initializes a projection encoder state. + * Call opus_projection_encoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @param[out] streams int *: The total number of streams that will + * be encoded from the input. + * @param[out] coupled_streams int *: Number of coupled (2 channel) + * streams that will be encoded from the input. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionEncoder *opus_projection_ambisonics_encoder_create( + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application, + int *error +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5); + + +/** Initialize a previously allocated projection encoder state. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_ambisonics_encoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_ambisonics_encoder_create + * @see opus_projection_ambisonics_encoder_get_size + * @param st OpusProjectionEncoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param streams int: The total number of streams to encode from the + * input. + * This must be no more than the number of channels. + * @param coupled_streams int: Number of coupled (2 channel) streams + * to encode. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * encoded channels (streams + + * coupled_streams) must be no + * more than the number of input channels. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_ambisonics_encoder_init( + OpusProjectionEncoder *st, + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); + + +/** Encodes a projection Opus frame. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const opus_int16*: The input signal as interleaved + * samples. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode( + OpusProjectionEncoder *st, + const opus_int16 *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Encodes a projection Opus frame from floating point input. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const float*: The input signal as interleaved + * samples with a normal range of + * +/-1.0. + * Samples with a range beyond +/-1.0 + * are supported but will be clipped by + * decoders using the integer API and + * should only be used if it is known + * that the far end supports extended + * dynamic range. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float( + OpusProjectionEncoder *st, + const float *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Frees an OpusProjectionEncoder allocated by + * opus_projection_ambisonics_encoder_create(). + * @param st OpusProjectionEncoder*: Projection encoder state to be freed. + */ +OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st); + + +/** Perform a CTL function on a projection Opus encoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_encoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls + * @see opus_genericctls + * @see opus_encoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/**@}*/ + +/**\name Projection decoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionDecoder structure. + * @param channels int: The total number of output channels. + * This must be no more than 255. + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size( + int channels, + int streams, + int coupled_streams +); + + +/** Allocates and initializes a projection decoder state. + * Call opus_projection_decoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size, + int *error +) OPUS_ARG_NONNULL(5); + + +/** Intialize a previously allocated projection decoder state object. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_decoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_decoder_create + * @see opus_projection_deocder_get_size + * @param st OpusProjectionDecoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_decoder_init( + OpusProjectionDecoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); + + +/** Decode a projection Opus packet. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + opus_int16 *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Decode a projection Opus packet with floating point output. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + float *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Perform a CTL function on a projection Opus decoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_decoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls. + * @see opus_genericctls + * @see opus_decoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/** Frees an OpusProjectionDecoder allocated by + * opus_projection_decoder_create(). + * @param st OpusProjectionDecoder: Projection decoder state to be freed. + */ +OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st); + + +/**@}*/ + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_PROJECTION_H */ diff --git a/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_types.h b/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_types.h index b28e03ae..7cf67558 100644 --- a/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_types.h +++ b/Xcode/Frameworks/Opus.framework/Versions/A/Headers/opus_types.h @@ -33,14 +33,29 @@ #ifndef OPUS_TYPES_H #define OPUS_TYPES_H +#define opus_int int /* used for counters etc; at least 16 bits */ +#define opus_int64 long long +#define opus_int8 signed char + +#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ +#define opus_uint64 unsigned long long +#define opus_uint8 unsigned char + /* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ -#if (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) +#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) #include - +# undef opus_int64 +# undef opus_int8 +# undef opus_uint64 +# undef opus_uint8 + typedef int8_t opus_int8; + typedef uint8_t opus_uint8; typedef int16_t opus_int16; typedef uint16_t opus_uint16; typedef int32_t opus_int32; typedef uint32_t opus_uint32; + typedef int64_t opus_int64; + typedef uint64_t opus_uint64; #elif defined(_WIN32) # if defined(__CYGWIN__) @@ -148,12 +163,4 @@ #endif -#define opus_int int /* used for counters etc; at least 16 bits */ -#define opus_int64 long long -#define opus_int8 signed char - -#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ -#define opus_uint64 unsigned long long -#define opus_uint8 unsigned char - #endif /* OPUS_TYPES_H */ diff --git a/Xcode/Frameworks/Opus.framework/Versions/A/Opus b/Xcode/Frameworks/Opus.framework/Versions/A/Opus index 646032e109d1d030c8976cdb7a6a8e4608b4d5e4..00562cb3c651fda92395bed1b97a18051ddbea14 100755 GIT binary patch literal 860340 zcmeFaeSB5bmGFNrNib+|Uu?8!QQ{1p=Bk5aN?TH}&4GLMTzfBIB@#MdXrmN5Y8}b7 zRC)F0DyN5o=_pD&!<46^^Dxu;z|#>M)X2RFk^oi{f(l|afG;=1mjFt_i@Cq=+UF!B zX!}fmzu!O4=VLyf+;h%8`*p3g*Is+Awb$9%`}A`@pKplY=R1dMj?WkH`G#ilxi8?~ zO_SfDMNfKZTt5H%90H$1;ByFk4uQ`h@HqrNhrs6$_#6VCL*R1=d=7!nA@Df_{%?Z7 zODEs&Wqa>u-eD(ByN+nu-GMXs~!+ve5xv{!>X1C}#?pXy)LkMCG`X256H zxBMZuf9?OntwNp$jrUB=`mVCFYGL(V3-0)#mwtAAbHC<}HY=0{;c=P$n)9tePK|2w|)Q5^>33`-%78H zJP)i-#`~2)^_@+3gW*@U!i86z2OxRwgVlg)`fmjfCjXU{(a6;AghP=&9#HGSeXf_) zd(N+LpQT>|=i6|e%lIGJpDq)An6K=vJHKB&|LSRX#utv&>*3I}^A}@UD_1e|Pdck_K1)e5fyq%zV-I8lgHljQ=TN# z=YO9=;ByH4-wc6r(|S9(dufqbwYwyxM*EJbK*0lQZ1Yd@&1}jnZCU(5Y4fuD&XFal z(&nWXm{qNk;n8ENqTmt9HL|pM$wh8z^wHDD)a>XZr`6c>-9xPAIgM&`nNR9p&@_DB z#lF1CV|PrN(>PE6ja8#-G}z?5+L(26Kk+U1`O-as1FDOt(`4088ybm_`cdD%oa~f-P{q?UTj<$zXeUp*sYOnhso6T;K zpI~dE;qtb3Lcx@kZhN=;HN%MpE>9mgPi=j5LBms>*=(NF^=0V;9Q*WT^iFMT$kPq= zD1Wos`r?9C$+x0Gcj}<-ZG+BwlB}(yOQ%k%U<(6RqeDIo4`ZfrlTmKWxY10!R~)up z3R&S7468X}eH^iRBlgWjhJEe0kaeQ1-3ssFWlP9Pg-cSVRbFRW;gkTdAAX4?Exx69 zhpe>P7~5mTn!_b;MXm5A8msZi-(W}{MY@3t@S?;r23-kLRe-~=tn!tn6|dD# zEvDsEP&8_-nX4~P%-5ILrnBI;&8JrXPgYrmMW4#@O?yd;S@ou=Htsd8bGB7fl*qIPUk$4SO`2EQ@rBGKNXieFRP_xmEwq8>B- zVNS^TvEN9%?KhLz>K{j(Sk?@lp#RO+JCjD5cG893s5)*1dQqpaj!tX(Q-NEa=~98K zo>8+7sac(d8ga|hUHo44w7dzZz-`YI4R{sc)oo7~nTe)=nMe7xhM?XKuQ&bMO@D)F^^nkF zPF%89t-4GKB(~)bAWY4E&cJsNeKH>>gsm4%E4CqG?TJ`NLUwtP9Up1W37Gb@BKx{= zYGY%h>J>7i)YgI<)W%(jUO%*1o&SsO-qN(1)?AVbCwHrGvlV+bq{3bNr(#tZx|h11 znK(aMwImQ#8+*b@2=ma=py5HP6o@Xa-`*2{ zJ-M5fsxQ~{OuvUgEzMA8F5D^KOr&y+?DlZ!JB#0nPP`qa`jTlis^nWj302`|0m>%R znY6-=)dkaL)e$rO&XCNp6?s0$WWoS4`Aq%=eJpaBHI;4_egaoW+2N6PJW#q_IijTq z*|(P&&w(T#+}3D&$E=FI0KKe?RPBHx>6uyeqPZ57Er(y#@~TBpY1(B)rgMYewARR! z1&z0uL!cNlWF4}?zYR8$X@Z@*GMg&d-F-|Lc}An@3Q#pG?+0KAl%)h^|HOUf+cF|M z-V(LTiv@L($Y!T$~XORm6hrE}ff3@~F%tuB~f7_OQWCTe6~ zfRr{^dlT(`YtCba^*T$95!_a?zkj`vvDjw5wO4IS`@0fLUhuPOfKORA%E!?_!F}<7 z|A<+&gVf60pB+<`1^moOgP0O-;$jiw4fC>!n)WfChXjOBK@MCKqqtdvb#qg8TJQcx7Y!|6c!D=uB zmB2t{+@>{WZPdxl5z3u8d=~97%}aKOd^1@+RWKx^{%wb$rZlSiHqv@x$zv=jk8@XY z+z$V?G`yjDUdeH9ei{p&?-z#VB~z-nWf9f3S{kK?LjGN5)h<9^_+V&3Mlu>Jo)@`k zUO4%FUtZ^0zaCJ?&q6MFA4qH;Vw8Rq|F=3Bd}7HaU-cE?1@Hff;!^gVkpD%q>P6j< zkxhq7kEm6D$3T;*>Mz>yXMsxIIe^gG6cGRrAI6W-;=`HsM}&u%GtJNNs}~OmTSpDVG_|qK zNStKoQ>ej;)rG7%&$9BERXq&vIo4jOE$WO~DJ;NHS2Tdga4KZAgsqnm3(hgEhG_8c zJVV{lFi+i?V)TFC!~AN7q_@mdA7-DCadE@6{qTMM-{OA<|EYPkz$N!rDp38aKv>O6 zsaeOlG#P4Ew*mPXs$q|Ro;rC_6~EGV|C;yWWqEPfeWC9UhE>CMKb<()Oy1-2dOJKk z-z64H%-@?r*hLgPfZv?^Go^feVf#6lDbV&QxspyUGJMDH%c;Mw3p06`@X9A zUy!`!FAp(;g@N5Fybg{OVtb+IlB1!phE@`dZ^$pE1s*1|F8byfxoPH9>uE{x-A#} zWkrWd(FtzRk^M!PZvyp{;ZMoj8w=FA-=^<@ddi>f%oTt$e`TdU9Vu;Es-`%(Md|ju zlHEr4QGa-ke+Su1Th+Q$*#B0^?r`ZIwXVV65SA*#r7fiUVeYYU$Ua+;x>?Bm>5x6= zS;OB3|CafwIf^?)Z9PRJrL8eb+fGjn2yEP&7&6r<{Cy<-P7Yj8IRD??lLvF~_HW7KOTQU~omg!M z)~*6+xPSfo;T7){)?0RLK2rFEkeysk|4sYSleZ4#@+H>fmXcJ| za#~Jg*^%r}Yf>S{^e5SlJ-l75X)Hp>S@T=!fFqOCU?h6ZQNL<5iW-cf*TVU)=(SQy z3vGuIONxCewAWhqF!`hQ9cV+?M}xw@R>@9yYbe~?*3PzYFRy~gyiTpo zvypvkZc@>~$d)c>NVLn*%bPZfMnAYnoCILxuE1n(h zwcZeE@px$En*WqS%TM~F))Q;FjsI=TdNTsLqb!`Yk{^MaF-WQ&s_BgKitIA2b~Ct_mpydew6^s>`*aoCm>46aC~qPExs1}})~YY& z7hIG9*hx~-PU-;hKu7JXl!hlXy`;jhjz@uXH^AOpMjg>$icuB04ajutA9o#94TQsnvz|A(&xRAG&$Uz_ zONX^)Jsoi-4>9dEEs`O*+gdk?muA&|C}g=LA?7Dn>cTyy3JFbZpp2$Ejg+?bY_pXt zpwMznDgKCK6p(8zWsF2`j#`tBTJ6!`-iUKUk+ev9S^klg&N7Nbs{X(<*+hj9-vgBL z@ivlvYe*~z+gevEPgRX(wwYHg z&F{${L5eqny(QT`ekH4DJ%UOgTHmfJLR(r?MRZHMn$@Ug?NUK`4)UyX$u=`u?~`0z z=rgyR$<(ES1zTL5$Mzxd-^SqmSF^SV=^!3GN3rJubVEAN{&|Zufzrcmf=5~iu;dtZ z8Y;FPWXw9El8?X_I_mfl9ZD+x+s=Kp5$olU^~3}QgakPLN3vnGlP)=>w5DOrN?I|U z!deIj#m5?%4P?FLM?;J@RDCaHel)`Gvl>DZpAd3%+cZ=tWdxh-@N_F}tw~XNu+=d@ z{&a3(Ds!nLI`IiXzP1-H2{Af(irS8T2Sb7S^kSr9T_LLn^#;pa(d3-mpP}ZMntnR_ zZJ+NN`B|2qOc}~dSq;{j<Z4r3!H+`LJBj*y?%6-o3!zw>ALFCrtu=Tf=!g$Ai4kbQ@P>N=43l}y_F2n4>}p3h*=dWh?Ks- z(|mbSF-I5<^Ho2(q{vGR02M=v;laYGAbUi`ngK$sl(cq6ptt4qvK0AD6>ep(x;B-l zFP3Lxi_A}mQA(+r3CJPmCWR&0j_@+8+1e#)kdSqlO~vt$y;;VkYQ`bglU(y-V6&h7)YMvR;TqnJ3{A8B#*dsB;iR%=AGJk`&$qzb|8XsFjyi zhuZjJc87Cw*6NNtEAvizh`eH0FB#SwQU5`;b)3df_9X<*UN*s@V245eQ0W`XUZY0o zQ;3aKv@|KisaD@dC83;k(hGQ%(RLtQx{u`${k5jvC3k8OQkNT`4>qiZSZVu`8@;hX z+~dnA-u8~+O!iZP<`(bo9N#ZreF|b8v^sJS6zTtf7R~g@qFB}8XzAgI)e=+D=cz6d zL$)`n%X*_QZcfxi&V8ud!k5e2tqnc9oK{l>bh)n|G$= zjoyID8&Z}wM@rcuYgX-HAbzFCwwR=yca-cGNOT5Jb;)19{OV=)vPP|5bP`9AeVJsk z=2CWWeq_N(CBu50NhM~L2!@kNhnjHdOXdYQB;zY+FYv{*t^0<09 zZM}jHR;_8s-+AsDkuI46vc9UCGz2SIYHrea{7BWrxCzXDtoq1*F( z(`jGWfKmP)YhErXi2Q*0=Am5}tbq(sy- zVKpKXp0HNsz2!Xcq#H)}Il9_`a757k=n%h=tBUS%k#LG7Fy zE#1BNU=#%*1!Dr`qv-6T6CW43N&QRuuN>i&%aL4@KSf`Kq=X3lqE@#5J7e;AbAF_1 zkLhQZ6exIvx|6~exjNJJRkV;d=l$+B(dCXv3QC5F+IKGM9MfjaNVe0KJvrY>Hp{4h zl)m^)JCYBHRPdHe({-j%R{$1VAU4fGND~^$M}<6t`qd8 zowxk6w!>_#zE}HtW zY+ny9lXEpLo%wRHCxg4>o$jq{%oe$~McgiTZ;QEI>E4RGUCV7BZheyMXxzrE4?r)S z*)#yB_7g7Z4reAV(0JXT0mIhma3)BKhq3Aj1JNTZ+Mhtr_?0wJr|USJ$;=m84rp3t zKK0SN_Z-k9D(No9M(Ahen9w=PtYGUq&iKCx*-r?;hpbE}*lt#}Y&pf$6S4)E?CrW_ zgw~oKE}5%o(3>(*>+eF=kMilZ%m~Ow&kuXEo;21_)0&zevVJhCUn-Q@p*L8j1;A~w z2FNTCbPUnJjJi-{rwKe|%DBK3@`2IFJOROd!2IBc8kmA_;X)eihckOg^~B8h_vu+c zzy5EFm|Bnk@EDNn&38&!XVPk?a9FSb_YL84LDb+chJ%q$X9rfcFA$jBotmL z^UtGpPj*$wmB=3`ggSoBb-;QjiwLHys8jIZfEC2h+Xzr1v#R*vQF7y*iApw>Ya9SsQtz&rAuyA{+K zYG^XV>#A;hH=kHKmV&n$H*3r2PZ zNi=&SVyer_jT?>cW;Y8j&y=$gx}4l)$L_Lcy@Aw|Ik84N$T;p|EvnBE`o52=3%@^@ zY4dWqtW0uM=v;t6vpc+^7Ao80aJSFZZXS$FST&4hE*mcR&NxyuAGanKbE~<#HMxje z&GW6vBe}g(ifA6?E)(qabjkourCF44eqmA8n?S;4`Rjx|$#!yD70y1^hrAGWFDciM zLgjNoT&dP^Rexgu;{Oc8pR|%%gyBmq-9ON5PqSp0B$YwBnlt~AHyYI%t%D{3mAiAG z4^Qq)^5_FFOQ%fhB;G==n)qU@%>6>n8qs6H^+GEPzL2vyB@cGEC}(_~k$x+uWIy(Q zl)X(_g(y>vUSuTC#5J3MieYuf*fA!T;RQzRykHe5a_d-RO^8}=nRebkO%pw{58Gx- zT$#?Tdj}XbGi~2T7X2)Lu8NS=Xjm^;t$1@q#dYKyoVyaI{OaLwTgh=z_@nPmRPK*AG3FHgTa#w^%W8_!@#R=>Qz1KEEH={H>(JnD!kyq@wc4VZ zk{wk1<^N5O2JNo|9IEDFcSIWufZKM;Q=KMGjILg4w4O4ny8J0@qhafH!#ZlF-yH&- z)y169W*^=iIVHOX?$^S}{Yy)uRtmSPsMR^ImPXG*0(pU}7|-^cv1feAvuEU+{!{EM zBiSAC-RuP-iRZCrq+~x3|DBmwlA?Paz(3VJRdX*LAJoNtUKgR(6fOmuq=yk}Tet)} ztk6?m|Dx8esC7{H@7&Ms-z8`IcT#q~*=8piz~@a0b`2iS|)R&0t{85eD0i4Rj?wGd#~I%%|?j9O_YcNiX{U@dI5 z8rClHz!7mP>Wry{IDy9VC0K$z`xDk1!B@M6$A=mo>a*c7`V2g}O-zIW4>Ox~@wE+n z?Ti1;Xhr-7Wijh{RU`H=Y{*ORnc{^0)+gHZDh%i+!q#DTjtGKAt;9ek2r4<=ho7wU z2h-0>IB@+p>8A~on3;V^`m^1|Pb2+#MdJt6Ra-ka2>WrW3$Mj2X@xb!<06D^O7vu% zGQV2&7?=s!x1xXeS-5RwBU`K?i?7qX;!^m59oy4}PU|p|mc69T+Ly^g-T*h@$MkTk zKb0p%o&&6TI*&C6h2fl)dZCCT_Lgt3V-JU|3>uFVo~ko4k8(PK)iGdL+k_*ingB9{ z?!v{NYTS;!koh5on#7W|c)@HH80)E>_sSf|q}FKtBYG>R=TLwO`N$mJq+vZXT ztKlY1A~*?Q6@@_7c-S`FVL}sQYh@0oubAJUVT0=)h9jWs9%eO*hUF66_?DZc`_%m+b0eK5qEvqWFEnth?U)YG zqME^-X5yWk>aSpa8^q7WW1wKAJE9QInP?DyRsK__==GNdm{M2!Bv}CFr!v^ zDsDy+C;i5=NX^W)*JXVzF4>Q=SFIA$Ok&9%rs9L#fu|CTAY+H(*rG)RxInY@My4{) z@9S7f25}w7Bs$X7easoh26mBK+|K^p3E{%9Enuy zI!3VZrH++$c-1j=g|nFQG6&B2p3DWo!4>7pxoJt98p8JCVXJ(T3OYh^D)}1*09wkQ z#4aixkZ9jm?C_O|H2{AGuBbDe@h_9hX9SNrxh+O8Tx_h!`ii9My{Pg&imGYvhD(mS z*&`O}&L+kMl-9do_*b5es=!c9Ut{EV#+Y1Hh!1JYF?A7&yxA>UraG?1HXu=L?*|jR zfsl1PGd|Z(Q*U(KuA#LAm#fw*V>O2LqLKb!wBdh|=^HLR8dg(}mh51ThLm|E96TDf zZ!O0EF>Kvh94>vu4x@a*mxN9!$7V3htF^f1xAhoXWNcdCj;E~Gs9Y5{O#hMZN35tL zr)PfuF`}s`Ov8Hw$7nes_y-`AIR$~liIE&j$mmU(n%XQ-DFa|AZ~aFE{*@J4l8?go z(LS>ikw!&VosBnVzM$n{&FGPr9P9l=;eM^#@b%I65=g z360C>;a~>DjTsAElQfuq0y`9vVwz zZ4r76Tdy>Qe=9I+3X9i(FY1JU3$@ll*eOx6TPH)-fy{&V>z!Hbx48FdM@{gqxk2o= zc%`MFM*b_pwfyYRPWKfML*UYinF#M=UsDfEWClYSX*G7QdSEOM;pAHk0vR>72_~&p zS26X}OuS-l*ed`$c9UqJA@!T_(Y#?dSB_M)8;R4oDzT5OB|AFG=)IPrWeR3q#F-zF z6`UqgtYu+59m_dX5z9^Ps2*9eJGmdn6w~?Ihtx~`xsTBQ5ksR^ybdk4s#(myU033$ zbImSkd$do_e_8qW_^K}}*$+)K?}wZx^bP?jacqkU7;Hnc-@dGll!Q2 zV2I~G{jlLp5||SHH8pPoAl9}z+h_SZ_VOUgY`vS9lR|a?Et#GfdABrCXX!8k~4#!z0fynx>|G4&v2nCM`m{*nO`JM)xGGQpiZ0V!aY`pFat!9=V z?WZ8%00V051|aMsuGl4nFf~_3Qy|P>mhgoUp)t80ja@>2NC}*yiZzRZQqq#+9LYOP zmz$O=lpvV|H8Gro-7HdWmZ`Jo-+R1f03Vxe7TdKz;(GoEry!y=GPThl#z!ZLlu9bX7{RD zr__jvs^SAR>peB%YRq-4(Q>wA`|0=|q4^`?RUB-VJ|ky5$kYvt0D{8BS(S?qGF=aW ziUV}`a;9|~_q@_$&XqF&GJstjzo8aaULWLd%<@+u9{Z-9_vE+T-91M|tQN6i;xCMC zLAywqTl;*t%*)xSx0}Hp;p=z^37*D5JM?t*Bq&t;#GK*HH-Zi)x`JG>wdfY`s>2gG zWSs3Vo>~?L^&v9VR z#QZPwn7ZC6{12{jfT~~KwJ)(oi;G{>zY|$5&Ni7HGP|3J<+UpLZPxmZLJwXATt%H( z)oWNEL173PoNY)P0z{!Pz$m;a5`3L4v8-0W=&G^^J_zZ9zzEPg(}B?v@$Rmd*W_N0 z`e1|EjjPq1Is^mRtDvr~6?j>a12_1bg(FI2zqi2`zqa!yE&r$4es zt>n^Uk80*}da^yL*c$b;JFJ#S>FGE+W@@SaDlP|T#pX0eok9gs3k?2^$*7Ml>@r1BWN2}ri{8&d?a2b2ln1~%3gAsDZm_Wq2 z+izAa%4Zn8VSC1yk)|KzTCMo&nf7v7bWLoq_h3~Bpfw1@?C6-H2&PqHx-}Vh4J$knCpx@cJwbFN zf~Y>0=frUD=lIi-^-&9t4>^DJrYn%L2(%gBH5g~OZhGc@+(TW7v>FiNv?RYtR~Efu z&22ovC-N2oB~}3~Ysxm2E!=V|{-jzZr|7LCD-MX`lByBa@`_%65%;T(bI)16E!b{x zy**;R($*V1+R-aCYk_YX$Gc>azx6}Wn|!NecL;UKv{%)%9w+ooe``iPHEJkZqG>H^ zT9dPQh#x&eRhGnWN#d(&>i^foa+N-VTHyNvp1xILXN6jludV@KXCq*>@XmSVyh{LpUh&iqHoDfW*0S4;5&(v`HR0` zwItflNi^rD59efeidoibKuM))eg&kYEHcIHF_VCu5HV{tih~=cXWsfp7e zQTid=VLCKn%dMij6xpv9KAcC;PRc*MmFIemhb z)1wpmcMU6+Jn1Wg%w^Zm!H_rx$a$wdZtd%Vbh9)n!_3ClX5%X}k8=iFsuw-Rus1rE z158S^_VrNrYP}(mdD*u<3=*Zh>}hoW=B&@$;#I(TW!h-U15K(^l81@Cn{p-u+_C~XhHPwrGxBO00CQ-m6`lAopT3|*JS9tc&cNcOxLP- zvp&>!+4Xt8jwVTgE@fGeqavDipd9>ZQ9?E2QktVx4+&XT@B~3wnY@;K9gFx0i=O_) zj=Q;y24B=#tV_pyM~mvii?~8>wF^>%k8`!@<6KB4g+BvPh4!C(KjUX|UU7ykQVWMj zUW{*sLaMJCkRQDnC&Uc3R(4KUO`Wg3#E`@}rC>Eh3v8L&oL6n?Xrc45U>e^#tM{z= zzo1$Aw<0Zv$QGpKK7FFl6_OE@M-)7wkL54etKal^Z$uo7K9aklQI~4e?@oE|DHCC)hGlEpHFyg5#}^o=U#alqyFJ7k66?+XAM#x$GDyBV-Y4H3)$-j`PriFa zM5I1p?u@KA3R$lyl71Jb=>hWH`^*=P?0!nV`wzq;5iCUB(DL0|+#%mxKTy8IaJ~gS zI!FEI)lRWz{Q4tngj{;8!WD8oZ55`c*oD8IY!zNC+UBVLM6C3k_{+Mc>Tih>Ol^E2 z>hF+gCHDBJpIHX8bqb$GiWz)99{KL#sDFpxM#LH9J2Z?~KPKM(=j6MO`{cXB8bo1F zyhDl6h*Mp$YvBswAx z;SW|8tEwIoz>BWnADx1<)!Zs4&e5`QtZ;~WxUs11XAkvSztK$rW4KolP{hbM$T6-oz>6=`yJ&+Lkz( zs~2^x8C`t2mK@k06<>$y0`CDNh%M)nGuYbJlSL%#MOLkqeua9%9G{M|f5LddJ`m@l z@(ocrbZgzd9(Bm_>dT}X2pMP@u(qFKZ-u0h$=>P5;P`y!P?BUTBr2D`KM0qHaU+f= zvVKgko8mtdab-J_9S2O7>_KIv*DY0Z5@Ay0k`>78mg3^$W zhMvx1d8+d-M>9ID;TPRmXC}wJH-2dNpXbDD`jhh!9x|a)1kI_3(;cG|NBpeWNE*Ts z)T$BGqifISCS)zyW>~$hin3Q!l+HZ=6lc^e*E*BFDpuKrlG}PAT>7zk@Ja5mblr|= zx8wIxSlV3iyz~f@myteszEOHoIZw#KC;QvSxRK>jTaX{+0kuH7{d_!HIf34-wl=Gc zJDkEl_?AnAlfZ(VeIqw?o{?*? z&3{VbqNuIAw#xfpliJ!u7!o;X!fS~V)1#YflE)SOwGt&pYVC2J{r2D&UUNPD%>~o` z6Kbo(%-CQxrVo8_MI-UMvguO+L)EtuEJoFLCyt*TDh7i|u*(e<z!-^Hv$H=m4d=Izj!!H&s&jAGU3^DFWV?Y@_(QywPV$%(-Ns1)Px~_rxcnBpT^RGGW$g4 zp8%yycNpR}W}@JwL-Z|fXWq#)ys5i=jA;^*KpHnvw=?N^etntkC`_fJSp@m_4QGzu zdP4)`gN|EyuiJPfbNN9%nvNey!D&M{KR}FwR(34!1kqx;4P#f-06UP$p*vnT02&f< z`oQ_x{i7SD9Bru@fwfFhIXqnY(%nA>yBlPW(=|kzEMJZUv=YfL_Yrab5vWRV8owyQ z3hqY-hqR0aI&kSP%S0lrXj8=~#b&+5?Ljq@H#h8Y^9JVA<8t5ar{Z(KmUdc{LUzlsN-CP|2pTkuM>FW zKrro0`U9>t+06GjxoQNT2g0FXr{P=+1T)b000?qw)I;Zi%tC4uRMJg+dfo&=(tbc}(tvVl5mE0c+C%R;adv z*`4B*5F2;-2t%)YSSsrUXe=aKyz0Y)^hRt4rU zp0O(M6E5FYvkr>3d=@kJBTk%?(>Od3 zhfHj}>HHK>?(^cS{KfE0_r!OJmg(O`slcgdU1Py7V8FCc_)Fk;fd|iv2f*_ZZEMh* zqUQMijs+B!&Uz*iXs>3XkSu=M1Uspv+{BYShI)(U6$LW)7{sVa{zbWRxGNJEb^ot$)+5RqccQ#}^*fi48@f^OC zwP*fhf3YIF>{~wH(lINt%ehv6Rg3RDJj27+S7cLje7^WqI{Ltz#ueGJ(Ij8ABHK>1 z()fisPV1aTeN>doP=+|Cu_Pq{;FimH`}Qw4PB*OG>{Fl@38%#hg&{uv#d|JPV|T^_ z_ndE*_NwHoO#hBI_+guJ{?l@t9wB&l;>7uCS}P{dF2*cTUz|~qV__D?UlGLxqa3%< zU**cZ#1sn5_*FgtX@y2hci=CGf@wd#w;>hY8&cQrHA;8Ot!OY;e}|SLRdRH{Oe!gS zK zIO%>3GI`WmQ38(S-Y?-6@HjAoyHF=l=F;^O^oFm0zb7LY4~AzQ$IgbOYxX-_U+0m3=6ZIj8tT5-Z;4fzlQ4QNyT}JRIfW6jyX}6`w#ylO7arI$(+=FRY3`;GY$+_>@YT zKqh2~Et=>b@vH8+0%TTSB4^K?Ne^H^xIfGRcJExm>t6?lIwG466KI~vWCT;fKC#>L zkHSHswn?6jVF+CP^QWJl2$*QK+B5UfSO0z3iJG|ZRzh8mu7zq0_4_YLG|Q0OZfupH zd{YS0w3U71v2d^#bs=%$st615RN)1QhBAa?0<~>Cif1Ge%lP{x@@3Ub0@buEPPu)M z;EnG5mG+(M&LNn@-NQ^L@7jHN(0lirW>pg#-3Q0W);>3_gFT+fPrj>kKBk?Nzj3;C zYOBny=TZnMCA%{}K{B$rh}k0r3#=){A?x0#*q6TnQyMYlDzlDP^neDfDS@Ub62ZyW zG^K1L7dF+;JNuMXru-V7R_MeD}r69ErYD)b7?R5$hvH z&8|HlbEZUoCa@9m#lJ%(+Jj$-785Q@4f?aZUvLMj^JkeFxWlaCBNa?Bg?*UzPgqSqwGSkF5skz=M(0yT0 zC&fey?|DX>SG(V!;=Dq7WGt1Rj)`f;$el=sC!a8-+E}k0b;9e4>gF97u zTHVyBN#tR1SH-!QP>|PWMcoH=pU9Cpx$p~2r=I~Hh+3XIe#gBTY`~^5NWUpv$z3JC z5UNYm(7*r+1XJL79akyYGO zeHF&(RVG%6zVp7rpmVR4mjL@PT_8)|p7;T&Ls;<00aEFp{txC)E8g3y=gUi2;3F1Z z)p^lN`|S|Xs%iQ5brRlXI>=~B-hxCSGEP&n9mNSZ+`ZL*m+8N2_U=quMXPSek5>I7 zJ`qL{^(>+WLTQcRwoF%fCkav!m?msOh2XsEx?*0BI=6)}pdRcY=xKe>rQ zA$t}Ka=%*ngid>jBeT*;6v{(3+KMPHQ%9EyvItEz7xd?8ZF8X1SG`8CzpehZ6PPKd4S#x*j^bWg6o z8TWdOeIByruAJENZGEP$_0@=46nMCwIrT@9}hZ-Q7O zPGzglm2i)xgb|zus@LRGuLtcY20uarQES+F$_K2$c6>tAsn4f8*v3DeBM+G$?UvRx zV)_cYAoD=)(E~!>5db3t?;njkBRu|kOeDtv~Z}HM<4)#zi6}E31Q-nzLiIq<7So+rl zhQMNB^?0W9g_j`rm+VH)g1^RZ?O0Ap5xQokIv1HJ?!A`-*26+V9|UGU!d9k|MQ0A` z$x7CkIgO;wcm&~~FO{c)z9+4|D1BArmsE8To8d>`;NE)9{@g91GhsmP1PlVFm{U_D zB6O_ksG6Dg>nml2u54Cg52yz=ll~U`YPi= z11musDsfYkaRo4xpGoCO#-sE6x$&GkD3gqb-oJH)?tME$6TBh>VXTYJIJW$it)-xdGP z{zBrv$#@C5T1;111G?l=_2GBiV0P;noKQW9XJU>m=LrBc23_>>UgjOSx@ zvrO~%He{{9@Udj{<}<O&{Og*$+ zYbIp5S=J)*jV?vadbLnvx83z)kEgh&noN70aDzl6rwrD-GGYGujWru+xT?&&R zc(@j0j}nA9I_5SG;9QvC9bw2@$=3kZxE;QTBpwM2o6Z;9S;-|u7J8!BlLH7ww2!fYgXe6E;^DI3WLa0+sDw2#lYO^@gnod&o38v%RNov$d zX5`7P7ZR~I%gmdeshzB80Ij)hS0A|$A&HS;@kfU0Asf*{mwv~vr-{@&v#5J_VrRP( z9g#E95kB=C&G!k|1gxnyGN0 zSQ5P)N$G$Y6j68+?@W%-;}ViI^|)Nue4XcAmST1m0iEZxiI1RumO+}T8$@S|xV>^PZY)~jLr zrlPQYb5wv_!mesv8MPssPav~C(B%qF_ByxA`|#|S31`gAlw7O9UBpLJbZN;=C_3x$ z4Ri}eD*fk-Hw{nc4*y07OCZVt8oUIiXIg(j@8MFq72PaqE5Pm3Egzr;sfgSFSWu7& zaBdUh^3rOE-bGDPaOpmN^9X zVe8!(r{pB!^qIsC(F@6XA)J(xEBy%HEWPk33@UkZhR1R%l? zwLMYB3sobN4*yi{@&EbXJTQ0UNwkUnMEy8<5kFr`49Vm1e{|(JkQ+Rz)8O}cfAiO_ zcIu8I*S+k_`pR46FKsUzwF0RXlR{v|3Xx^e0*#QQz{R}h_}d)L+Ej``iPw0);j`Kh zPm95oETTcwcBtXcLS&v0oadu8@=NS456GI*A#>@o^%@Xp(SXoOhRhA4{XVpKdS;q+ zU1V{$DDZ=KVF~#pm_b5Tp2noGPT&m>FiFgezl=zlsIsv?%ml1jU4Uq}3A9v87!|>I zViD%bn*YI^M(U+g&U?J|CS1oVn7)@UYA^4iYHe&^jGM zsopB<2*(4gUa>U2z!upx4)wSa(^O}a9s-pk@c_KxzhMwuFI;xHzFzte&oQe(c2=nY z`;CZo0*ATP8)f*mvk361-w(6vS8~H?z|nF#EimSnsu+=d&Ji{Cs46~;{_cZ3Rs6A< zaa5IesGB~xyHLMxID(Gv9aa9Zy6GeAIphG*$JETXDDXC~K2qgxtD7Vqtu%xAq`G1V zu^qYTU=oCbAE=q{)7%vwPzT78dRHfp1fV=Y|Iw7+}gZ>KU`mEs#FU64LGR#ov z6GBi+Z)Fw>LBYcQ^E*!TQr2`GY)W48Jp_U7HIO8=a(n65WiFt8u4v=LG6_ZK4B4Ai z?uoNY3tZm!LMU9u-YE8PGvdQtY)nx(iFIRVmbW27A^O4MfrxRjO^IMRREEoSw` zZ^ix1UGrxIawe{kHQ$qe(%HOwsRkUa#hk_n7AiO%{HNbWub!-?{&xlIKAVVhyNyVlLf}IOYC{dihh%|I8IA zSLEHvGy(X+Df`N*%8)Ry5jDwMB$c?Ur5asC&$y+f&N)+ zBB)NR7BNOQ^3+jAi2;jAgyR6e!+xe`C3DxM0JIo4gYH?^G(nTjby+^=As;4jwNUud zqIx+)Dkmi4Q!X)&|2BJXwz zKv35#;3|CJMF@tE#!Yhy*M_lR(IK%$Tza#vKQR1SvLTDP)S%Z_@&A<>enmU|z^GLr zHtxVxb@9=hBfjeCpA0pe!qUzm)=BK6`c17@8q#G3&3;df?YtX}O9kHJdUFM!ui8Sy z*K8A3)6(v{{*|L)i@zy--FLCfHL>%1OBu_6@N0Fyd^lI1(YR-1Kjms@BG-C(rGn*p z#>~2=hHJ-o{1)&+V^XhGV{=y+>bmF6wRY}`$yOh6#QhUD%ettXpFuXn-AYL%(&39-(C?cPL--8OuixuhklE`8E;Atjv8tNN9~qLR0;vnrc+d)l@A8 z{PdwBYUpBeVh>A#1(;2tXqDu8AFpJFM4g&|m_dnR5_MMTlg7Y6$glfNeROb*bOC$B zKf$T~chq?@Uvg7edh0}o3@JGdHuF|7zau)r9&c%#5Yj!D@nTipT=FqUv4I2%iJDRZ z_Pz=t3!hTg@)0`(yfyBKD+}%;&j=dfD;e4CR*%0c{#3^gs85?kCGHOqzx_Ivs;RCc z{5RjDI|s3F@71CRnDATBvyG^!pU+!L;bPIs6t1~XgKH-&6J%-e9`Fm!Oy|kx1k?iEu~O4k z!5pZCx&*LpFaa%9Rz_E&;u_&$k8=&5f<0fb!u5h2F0B}R6HV-`Crhn{W)GLr< z5<^|93Ghr={0&0=`=xz>nQn8o9$MhxzQ$QKM42{XRZ`w?u-W8OoG&L%4ACxHxWsrB zo6JKwD;wM$1vezNXu7W8gt-=lrh4KM>mIvMyIx-R+b8+Z%IdX@+c@69NlijT$?2VM zx{kBfc8rC`O#dsIdsP--~~I~XJo<(J`l2kLmyd}|OcntHwJOFhPB`wmkK3WkSE=si zwANqTaG{>xx9sZv+x4_sCv!4n-&kZ%aW`ZGc5!;=%5+&vNp@D7JD;_`^CW&Ychn)`4(C~IAy~b~J8N_2 zYV8Tr^vy!q)yZ~2*8HXSf?!t^g1xz4f16(@jtFQ-vTneDN&4tHzK3#LAM39E+MaVK znz)x#F%fNKdv%%KT=5XZHP8!fbC5HiqvYg0+cGHfT+La$gIRK}zLR)*bm0##M8Boi zCcq{8{Xr6hx2AjBe{Fr^%ZdF9fEGDa{SMa}7s}6Z)g=fPg0f{_>Ql)uT}9H!T#A=W zzcis`8m3TyH&z$l{(*TX6~wFe@va$Tk5-2C?>7XGRPN&<(C5Ml4K!nPJM(=H_WHzT z{BNAxf5s84RNLMbj|9qE##uCK$l_so^YCz*kNxcMR1-w5rwaTYbo;T(Icj|{79_eE zo;Zi1!BZ#{BG%inAg4Uv^QyAVGIlW|H3?RX3)y#0u**VTZ(F3B_GVY8(~AQ1BZ~k# zW%}*o4gwTX#7;GxmW^`sdp+D_H_MVb9raH&Pt&uT+x1YN5E3!UvztY<5EUSlEC4lb z0u>YFT{d2p-7LL9*)Hv(BTNZBuh_O6h_dBk2URCy3L2pxv!0ORuUa3fup zK4&$BWXh+yQ_D(9;4>g7AefjG>xNqWG8G%hS$xK}igUxR4&OD|p=^*PmFXzZ1EiYs z+UvSV1Oy}XJ3R*AkWUu7@BypvK}^wR>5;`pI}Yj1d}ODs2O{RU&Pli?*40e4~6o+@IEAZWQGcCZC;rX1^1CD!ttA$r9yqK z;ss%ifv~B_y+7(d3cr77fPR6B%+qc}n+x1#MA{D&vKY9PGxtpdq5v*9Ec~;-n>!%a zjC0v{^=Hdx+sr?DyF_De{NLFj#Qd!>|10K1t({b>gc@Sbj4>6iKl!Mfn6)oVFo6J} zTf=tsm`U0OGnk>vw1zjz>?0@*i@|ikk1O+F>k!SWXZZlq!cZhqbXKq8#?0(yL2`EU za(**+5rPQiDXZ^XG>Renr}+lX5~|*CtztRG$dVo2R++CZl%OI{IWvY0S*k2NN&I|s zjxS|AqSu5zwmwm_Y_<9eOiJ~XX7xt!CASX3xaENYBe5q-P%p~D$T!iAyD#=+LXaji zr72gOrXZWn5d6v=?Gy51id{`SQ+r)NkLk@!&Xd9~Tv4EYir42UBcnt`uopYL($x!N zbEgFnI%@8rX6Jj^E7uiKq1Ry48UHh3#CmHsua-mlMfC3Oa}4Y2onhj~eD&*8C5;kv z4c-mVGb_;*VTX8BfWO{PJ~Gr!~XiPZn3QqZ1M4ul&8n2zJoa-s}bJ= z#!`*t<=WwhZT{BDKPyN()xRIYSJ03;Cx5emb5&xGD(R-^ zq$Z1}s&5WV_@+B!QoS4|9qhXl%FlJBCH3G#^w~8URbOm0!OVE}$;}Me!|1~roih_! zy&+tCx&ZAG*YZ?7p3f1w8lWP z({)QDm_VEh4}-2PLe645`{fzXyIm4kNrMyWQ1u9CWf@AGxMbO7?5xcNDLMZq>^0r- zZO#A|;e^>It~q6bO(6b`dF5siK1}iP)ppE~SSwsJ$B9-UUTtPe7}gf`5}hCDC*BmT_DOiC5alhj6Fv;+uKYWjF;r(1Gw9!}>UMB>@~<` zA{{PXO#`~uezC>LUFXCB>ji!Ez}z`waLG@VlVD_DB2_qcwiz9{wzUE>>UFvJ;}yK| zs`GH;4ewe@!i>8M_C#-nx^PQ=Pr4*lQlWCM3uw8#Nzdn4zdE z9q5-6Cx`2UpTi%cL#(HKDTnhg@<~KGGyM|7x!&J)&EAJwMZL{H&jU)4NGGD3rfbpF04HOyE z6ZKMsZ&`uMHB=2cad=qGm<$=@&&>+EnM5bHh%HFl<&S5IF+U3Dxf9ux`QC?f*O3n@ z5xg#)9hL$$VH{t9x;&vo$9LYfyE1xl>tV~w>+K}spY+pOq zthyKF2PalL#3zWVD_|b1O(>7_`Bpo<{!XW>9=f#L$)6&Eo8kR>##QTQsK{6 z>1Mw78r~^i{$!|jML9&CyNi)^-sc@kY9f4I!Nd%F`9z+;aP~o9c<7kAiqGA@5quH! z(2F7QdugB6-;7qB;zQ-5?xBrhUbG#;CB>bK5{~e~;j|%DVjBA+iYe0O4Bs-uO;cBJ z8etYj){5bWX)1k)&)JJMp2lV!P-73N>)sF_dv8AD7CDPKebtWOiyk|B<_iLrzIKBy z1q}Z;-RlabaX&+#)KUL-cjc0pST&TBW24JFnq;uG%Sodr7tYtk1H*6Ost=W6ch^?H zJ-GcJRON@%j8@Jn5Wvj?7y33a!eK+xCFPWVm)4}9YC*3A`Fgl9zcEfY`nQ3HoZ`FU4^+RVma3?Lea2M{{x0jt|HIq6 zz(-Y```;NdvC#(i#0HBNHQKbz6r`l0C4wyjGccnw5NjfdCXzP7(H>MP8Kpe|5+(y| zCmZ4gMJr0rIlhPX)MG@ch+HP&k^qW(TT_MTw^wx{ps{eNCG zv-e(m?R8(zde*a^=l6if)f~Uv#Z_Cv7!2+)rxNYbY3W2VF-^KCWnC-+ z3oEg$dUtbAKgPDd8QhTxtPNj@UfFKkcQMGEyOLj(^)I!`&TO;hb;@km$7~S2rg>#- z?x_aZ^nWvruy7FpbmO|T2W@GCR|?q$Xl@p|(rNr?{_WI%Qgo(f(p@<_$~Zz=T*GoC zcqV^J&LnQb>LUI%=TT&^b~=f~bKsbaUY9p>2=K@P$!=yu5=0Y6@ z1RMI`FdL(sk)TvB6u0AxjL+59d;5`;-Arn~@)AW-W*X|_*q`{4&y-f6ltadV^{Jgt z&-(|T-uw4IJ&#W_|G}r%{QXa*?ic)nPkR8!_&Wu@fKRjj!KZ8g{-;@ddf`9#bnf5( z^g=#${DV)&^C<*cI_ylj%Q7l$49((t#p&5hynI}XIw0jjL!_y4b6aQ`4` z`6?-JfAK`76(bnLOpBw#!o9&Kwc`GD#FF7_e67mGtjJchf-qGQW(UK~k+D>jUk=!B zi^i(4#6ZU|V-R&aOh95l$&@N0ALM&=0G!I@W3=PN2`_Ds=QNPorG=ngWj%x1H>tr3!+=n6$b#ha8 zd<%p|Tf`ne%_y_!Pf4If`a;bEk`(KXHldpJOL=RiE^H0jR;m$PgV*ETzcZVMnxAsQgKQV#hm@lXOaF(h4i22Z0l14VHw2= zL;iJLA)Wg&16v9guA)Dz5}{3+DNmqr7w)D>cEdm-H@N4&gv;1ZgR1SOlf8&J+%eut z=prgQnewdGEO{2a>|wNP^Fc7Xdt>{b5O#Er3%i!ytpzZ3`DECy=4aM!TOHt%kw`FD z1!cFw92N3iJ-DFPjj{zDKU!Pbs-M6M3W}3xWPU?rmy>YC?Su-`bTvv)N|eE>FBWdD zy4ZDho2)Xc`qLmBp8;y71riZmrHJUT%Ms(XF#c|dtv^X`g*HytTU55#JM5^2 zaM^m>Fmd#^D1#>1ubX=AcC|I9k4BSeVqgNrS!tD#K|PwpMPpoFECoAL+HUoQ5(%>p zZc^`-N{=B*ba07fz@Eyv9eFL6T8E;V_tkFRz&2x5!!Q!vM#Ra0IHF#JIi0MeG=Qwe z9QZHrYwj%q4pz*7lUET#wVo*xNbbXQqg{RWy!5XnKEOpc`S6*91&r#vB7yJqi{NyS zCsLE=mEKsd%7Fw*q9(K-)OoaP532vR$cF12PS8d!$HnX7&>~gc2-x#fF^ynwF4NvTKum zaSy&_AT#EiVUwl`u9Si3x&_1xD8u33Kalq7mNaZTe8!qZ z3bvXFry^J;#wLyM8P!ia0vNsqocNE;T1@q!C2FLTR9(RM&u^U~2*4AFQpN^~BE;!? zCuA)gP<%`-mp$KOM=aHKNx>FD{11zEXIvB$&YaILm6p&JRuG8O<|Pz^bA2V*)8-x^ zI=*PDo6%B5iAC@Zz^+)>jnbdi@)^wgVXfk*)^fy#(w`tT6ra{g4r{j_(~7^;N}iX@oylAH|Kf`wi#SmcnSQ_EBNV!t5!`~Ur+KI&ghDkPjVPT)+7JEHY4eSA9tuSd z`3sjyRRel!_0*e;oS#7QBsrS-VIXuLBjzyj@jFk@q)uf-UGWjtIcP5Kr`kug;zL?V zC(4UjK3n9LF9|!X6`zu=)kj*%QJMfg;Tm-^q{J>;u_s4;$(rgSp52aNi0X4w^ME-c z71J7~Nhz?DqMUTtvsiz~);PCWwhou!_Swi;4C^nVlLKn(DUGAp;Uji-xXN(DS|EWq zoyICoGJHcUPc^Xx3Vh5-;@$Z)-EH8XsAcl%H#ovJC;w<%v`3E zWGW#S6Jq5OU&3brmP~8xC@9I;rk6D z2(?E7`ksIjFg9Z#WeOOhCP*EmEVg5y1>7VK(@Ya3hSP;!8%R_3Z<~SAa=_3}0Kyg5 z3BO0_=?j#e?h`5@LqI^CB8zj0B(mRVutbW31d3$;{E!X%q3TCq#H3NXZudnnMorA(QqJE^9_6 zC)EXHiMFCr%A;av_^H(smGUd;F{#as#-OXXtyQ|v1eEAcc(tGS6}v`1Rd*&=2eIeH6EYLB31 zz?U1`^~%yCc+XXf)hkn_NDE&_8FF{anN?bFiYRL-MlZEJ1k<3ln_qh^KmNILn>AN% z!*c5nvr2I4TG$+XJ8}M_w*@bWi+3AIP&HS|{3DB83g=||vUDalK8#^P`_rqLFUlm( z)MiwRtRVRy78n6Z>X!N#gI+7(yb{(D%?LYI3Z2cZcIZhbF1=d4g~x*j#VwhcqfZ5HF`C2j*qZ@gvxEQ8N9r-OG9G81@xivGe&&BPY`j?c)x7wQ|KUb@r4T@yQlF7y0 zBve<9z+U1;0$#MPO>zjOUT~vcSl6bk#0zfJ3w34pYe#22D5#5RbjL_j)5lb$(~Qp; zdkk5b)tSVQRY(hcm&SGLyHz8~>`F9Z$u~D5sJ-X3W8!@0e``++|D-J~60FTFr#ycB zy}#F-^jV+g+}UauHjVz`*po`zA2#dWsG6_U{kYX?4_ntp)p~?mjrOp0ZB&g%xYc$K zTWtr(TwzD>skp#uDt?4Ex{J0_v%=KevgYFg6{_Z=Ec!PZYCh%@YR&2Yd($#4Q2=Xp zpFJ(DF>21v(b^-Mt?7AYHC5dlzJzoV6V~kc@OcD{&J|z*Gs;&~h2bGIoO7nj1-~s~ zWb!12lfs`dN8R(<)o-WF*ZFeqpRexg)P0@YyXVPlw$D>9^vCaL0 zFD9sG_4VF#RRq7SlN@FG@Od2x)v-r0WMwA}p8e`sSc;VA@Cf323)Sw7s>pJng$MIH zwGrlfG%tOdZb{v(MJ*vu*Z|d~UfEpy3zF|F2~~ zJCpRP2T&Lxv=P@#;kVRAq{|_M$y97G-@^M;5?go8jEv3IT}85aNQc{qj2#w^O6jmM zRC_!>=fjcyv3Et@dA@gK0H7P6DDn68)_cPowzp&~#GZ^~IB1Lh%)~Kj)6NqR4iF-d z3Yp53Kk5=by)GzvR`^9K5~yPbz-_taA*QCHZhhG4wNqlGpNq zS%$X~c~h7~-fx}B`vYz08!4HVX8e$<#V(6Uy@o_XJ>P!y0`lU30lh9c{+oCx9z4jg zm_5y~*P7ErYj|rfyt|lg_tO@(aW5z#V$qC=I%r?TdF5(*j~n8=JNv3I$@qgI7jBE4 ztc+%*kJ_v36wUp2QS7a|gpgpby*d6n5~r>iOBtC;kbf`V#D5wSGZf*1^Vv>b`>C{p zsd!&njDo#@Rw%{$$p=iWd$jT43M`q2R{!*Nl_;2pq7EzvV3Rq)$sROc_CbZ+_aBV^ zo*1#NkL~{mkG}4+9vaGG9j((k;7ZJimQnPU%uBdkPrHk$#&p2R)8EG-!M#)DyCfnj zsJH5ucmS|WbHP%J;(=#@uL>)K`qu=Wjx<5|66ST*5;)?ulmbU2wf?I8z~V0_k(rW+ zG3aq`b7wyVIVzlQDS>D46E{X`zK#Z}{>E_g@|I<2`D)1^b~QCuFITDjY*-v)yL&h` zfN&y9QdqQkZ5sqbovH;2KdD&(w>pp)@a_&Sp;`GX0$))yuRdj2q@+o2$McafNa+lF zQ!E@e`1FqhxNCCm!=aTQr%gb!dLkab*HGRLaqtp*3$_Pw#N}x$z@A9J?>B;LUhRO^ zi8n-?_p;s5yJNHeid;`hGuX36_pAY(54liaT0s9yrjTd448(QvJ^^8&@8+|j*gG_! zh_mWut?3o|3FvUmw^}`GPV)en$+(00f&9f489gf0(@!S&(U0tDvqjslIn-lM++;#B z<}jJj=$W#t>mm{m?Q8-iK~TWxV9y9a70BR2Z+^tH#uKTWrZ>Bt`}M8I_Gtbcww)Nm z6e8Mp{NP?S9UU3J=gQ=kba&xlGt_g5O#EGh&LaQPJ)xfOn>SL$qUpT6dXf6H<$w|e zlpG<}2O1g|x9(Mtnx%lNIj;VL8Rt{tAPhO86^lHCSrB6_K&eF=8h=#=mEy%8tk&`= zQ+W%gC-2e!5S5Hu`5vOyuF%k+TxA)%KUDNFOK3{$7Spw(^Pr{`5j3#p{HCv{sAM~cp2b8S7`d?u82Kz+Rpz;HSW>b{W(&UW{vnJqXk@@jOd5w5WqZ)YTA6iN1w?DzM|>3lv?V z^}5FO*}u`ZoU1A+je>HB{f>0`TKd{+tO+Udl}Ievm;evNZd4ILP#&pNz5MzSbB-$F zhDTKyT3`+@$2%G;4!tpu6#|$<+9TjVO)uifrN}Zmb@oCDs(;&dlj@K3v>=#6StS_Fo~apvrOKWY#kQtxk%NWva`7l(z~!!rph<`^Wn3aFrzHY@h56!iuZRM8(6!jFbVIcNn@#BrMiojZS9 z@ZS?8i3mjcZBdORQk}TX|=4;fYIX$`Zn(;7rr%U9~;TMoT{ zLCLs!Y7-vXNiO4|y|N5B0&voTT~*fK!!&0o1zsi@*LvBwr?lshu?&c{yf4kTS$$aM zc{%o-4^$HU=cq3$M6XC2DmqErJc!Z?BjL7o)T#P!CISj&leh>!z4b6!KB7C)e=#M) zZ6tc7o5dNXFh`4B%^!mu-2LP+m>QF8poPbVNh&%!3rZq1R4;UKf(K)jzEn++k!xk1 z;ZuS=p*bfU%n6hKlFpe%QMK^Lc*8?WvhH{rwL>Z&n)N!ImrMnhq5q5o>W(jDU_rN* zKbTFgI9f#>oz|7kd@G2KHFCBXIlpAAK?Pb;+j6cDDp7J#NBtQO@`%y`?O&F0pSr(| zPf9ad&1i=OT}~3Yx!F=hfJXMeaZ7S{8XR!e&QuE2RT~SxM>gL?4?~~LglZ^4;*LzR zMhs)@$@yK`;$Y#R+`63G6oQgFG6m`5q#}RS2JMBtXl#AQUxo9Qz<>JC zv)9d&!vt#}?Te?aezNd;+QofhMWY^k8gc~#U4lQ(u+SA;Fhx_w3&mLl=Id{~Ri1WA z4--D9j^%5CSip#U!yB3C_3G~mSE}#v=y<2u?J9Pa1oXE(`unl}d0G}bl`d2PAKMgu z3d`fCaJ*4j7ljG+^==NpZgVgbDEz$Uf5>H(GGj0q0~>yNBNf6)wqqSb!CAe`A@a1= za0dm(+vzeFlSsT0XyF&==FqJFME&VG?gWctDOc1HLnlpR$y-GcHnbnUe3Ant;5Bpw z*Z@-#^d;e6xvUMt7N+i8IWC(EAd1*emUW8la`tU_Xt*kAkMsuHtm=`-P1#yGGG5=K zHc(0WMOfA%#*e6uh>JjFErWtvwq=CYT=PLBFffEu%la!AqWUh-K>?e_q`}$kuj=$Q ze+ZovEx#SUD(N>IQ3CM?md;_-7M!H&C5W2tZN_pcnx@^p%WI71Q~=+aD1OLEB+er> zr}B)d`b*yh1k)z8C1(E~V>(0;nKQBqzUmsCs6XAbin@sJfvE6Lnqv$tZ~>SVTG=)& zn+N5%FISmj9SF^8X9NVJ)mMA5qsM=YBY_i!+19K z>s?HUd{s(5C|NFjiRU@#c$aM-&gYu6hB5Rt!zI;CwRT0)-++l1UiX=RHH#}LeS;oY z;}Y}CU@gSeWY=cFRb>2mQ*xIoMzr9bv$0fLG~e28@(^a-e`PGG4x-4C{yJMWb?kH0 zR|PX`4ryb!V$RW(%jLt^)9=byssPUmpTv{{HYRt~`6M@3IH?~q;Bk%#$IxTP)c(Er zC%l39;nWn|&y*SNtkMD%#`Gh(zB*Zyg{ z8EbCsz5(-jPrzl1WbkSC{XoSBZ%03bnKr9YpZ=IVbgK5NzfINd|Hz@;{x{qM#P9|X zm;cLu!pHAun>!Xvb!n#oXqtZF%chDoO?I(*K#WOsB&C3hiak$QOc;2shEZ(%}+K0a9|97#u%I7bFwZv`u~xp z<2t}Fua{*g3JHDD)?bpMG0U=bfWJ86P-XM3#nc+f0T zbb$x(pXJi^R9_g{W!y`-MFM(j-=dZ{ZZfJDP}bS1tc_YeBq#p@&4KB<<8rNhQnxm_ zMJvAo3|Y;|D`&zm^h{x2r?59*^0`!o-7`2b|28&{EFh}Dlvn!j0?K?o{l(HQc;6P> zkBl11jYJh7(<<>1-^8d@bDVP+6o+EpdW)IJTLuIsbVKN}*+ZmjJ%ozWmK#qS|Cq9TguV@)u`|ib}!y-^UC{=^sY5!t5_LD7G4D z4!2<^%WM@=$~c~EBA=^JN3oHqJ~87G$plI_z&J{co2B{+l=Np2D005+H`0(8Nd8~E zb8h}7W-B|0>}>U&fTgztKcq5nzGi)DM!*O5MoA&#W~o79J(0%ohfm2x?KWf|0?LKr zy-&gZ&ePh;$_5@5;=v>Xhb za}oT^RTI91z6*nRz1G03r}0a`}??`u`7$4 z0UOLnpH9_wwp%aSbGi9|fL-wF9T4jl$h;);o42eNdm!GgbN@Dxb`Xi@>Dyui!k*0e zwlB2Ffdg5H_Xe)5r?l{1Y7tU){w!u@BSxN+=A%N=9We3I&RTs9%^WcD8Un^NMp7g! z%?_)$KzfL-IkTUWfnd+$cXEIp7p30Pj3u;CY*D+c07IgB^Re9=`tUt)YPhM(sOk4& z#;RN%J7Rje__w8)keLnm4t~=rM(|IFBZPj2W_i=Jg;*=X0~TGw?o!=VvST=oPylbA zQI|31YlgsRBD?jS$9AHrSIRxXzzgs~)k;@V9)Pc*8NzO{<3GYX$$^7ccKoauikmjP zcCRrmA!T&sAt_h4C; zb^XZNAE^DlWK12NgH*%?eLaOf1OOM&UQkPx_Q9TxINl{Ti5f%Jpm)EH|?M5_U zO>K$lHcD+0T^qM2HS!=i!DLz799$MswxVg(L!rwEk%F~Md-vnApaK(ar7z!R52}~P z4cgFlw>DnYA4O<(kk4t-L8<*X7k3{VneXzbWr0A zt>Jr+4{~la(Gp284-WCLxB0~743JvMq5L96HSG#2ciKgE<&tAEa*~Reyso||OD;7R zv4KFtxdLwzlaFabWAJZCir+xOd|avCZPjjlQ?|(*h#_Vky8D5PkTO4T8E)PAXj9i< z#a{!jg~Jf$0U?**A1)tOxuUu2LaYDH$U@;uTeP8_4~~&^E|qk?PrMJhetcH{S#Vty zZ{QxX%Rv;h@DFr-iyKbn4oWfy_{pZqh@zB=GOd9v_B-CfRxSKFlbNwAvxB`P!rzjp zLW-qX5TChmVa~<>5Im_gZ^aHq@8mW_G8Dh1*(Q`-Bts=TTv{MO;NG4;+u{xqMIaZfrl5|BQ z;5QnV#0Wg{$;bSq}nCX!X2}|FIL%+;7n9f=JjrMrm8Tm-wq+ZZkrIJS*7t= znPiok_ivJU?__I(z(DYZ1UU?zSs3UUexUT?CZne^M^Ie|BeoK`yReKXZHJmEBuwN; zg2UXv#DFV`pVB^Mk6$BG6pxUhgFW!W-$C~ z$sKI_t*3U*UmB3%f$d0TMXK)_yDv2lvR5sAi0Wsfz^H2qPT{ zMA4bX*E~{}Ua%KM1{0~ctNL=8DIy{sYUe~_H#6;x2op~iwKnwp85-4rzWuE}fEVUF zls1(PsJ@5q-j3uvW&E&{fe^HC+LX}N5B$?qo2w7+gv5`(v=Ff`0q^DDl(?h*V=7uuz?6hr!oen z5Wp2DLuK2h3ggH_3lBJwb9$D=mbJ=jC#Mbho@K&3E>Z#cfm--M_&R4m-ZaK$5-cCc zgG9T_inh#*b{p*CZ65Uva$cJhqO|{sHu**pFj>`cW*V#{WJem;$#V|rIr$?j_5&*u zVNYvg-<7BQz%r9J4Kxa43Jvw72{(9#6SOnG(esg&!J{)@fkBMecuNGIsDk>1!J@R1vo5__`}0|IMnbuPjEP# zpYfP9lahz|Uu$P6d#w{T;WbE4-fIZ=L{^wBFS6wY!a^j4+44F&?=@2-($X)uQB?Qy znWHl1*QUt`UJC~?piq)7Yr*uFc2_U5dEqYv3}p(-!>p$2pZIN2XdsgUD{E&9Q#0dE z8coW>{e`qBj7Ro`BJmL9BV1)4WO_}Pc>XOW6&Nn@4J?*ujU$K|uzHobC~zm;)mP$} zC$r{!e(|T(Tyr6vSO(SRlFbDUmzj9Dx@ZAS23hwLUfVzmLV4F(z2`Q$H8=?7(uX#u!6iANc2v{^y;5V zyL`COY!B_P#n%i`i^q>SaiU+~Qv7C9asi4HF1Th73o?DA8J9wIl-9^&YLIjG$#s|v zc2{oHmDwKg6u}`Z@!#EPI#KU5ov43?6ZMVsBXe)G_Darl(+S_*j3eoq{pNLmlWQaS zJIcvlxOQ5cTlLX;_jJs5cOq$aIo}aiN%+V_7@RQ&XL&<9Oy`&%r+57vkHM!4YA&TF z9I%~vf#=Nht}E4iz;GO;v5$$t@!K7&9YZ?wj^=}Qw=w*7mkpqyBe+X)Q`u)XxN|qu zp0rgDgcDjJEip3Kq_ed+rZwEkWbSgfnm;^`p@|nF-M+%3f9%nJhP?K~3mKF-%`4~2 zKcapX%5R?&<^nu}VgI)bo+-Y8pV;?Xq&wVa{Lv=l!*XE6DVy4-ndc+;sfE-GB&S9z zCk`3Ji4%Mo!XG(u_PyFo0Zqa1R%Pnd&TF=dNP^XImKRHCU6#7N+WJwYVlaE!i3}P8 zNrd8SB?G+I@Pi;e*JLk>9|R!Y(0}slNW%3Bb|>m6 zZ1#vqAXg8(%ps6;^RKBQ>oGImkuiZ$&XUZ!UzYK)y3ghWAiOhpAw#i?6R=rJ;t#>S z$-tzyUXPT#j87@O{m;uH(N)Eiqy6E9gegWcW)q;MV_4OfEEjAR&xX*fCONcO zqT8PcW+R5m92u5egBiVT1fkuDGOA~R^bISHq^Z?!6k(aExh0m#K$F*a(Rwklde_^% zE@!J-pT!x;epkmQ9i8c(m)X=?ilD~uIv)rwmJ}M098OM_#jcCmIVGAs!p-@$adWRg z-zxt}fECWT1`;ALx0k(3Q?t%2$CZ*67J_5CQ#{{*R3`B%CEwl&2c*7@ca z#1Y`TXz(-9qYw>)=cGgFola8d)Zu*UdnuwcyH@`tcdQvxURUs?xS60We!L#5r6Bd$ z-+?*G7odRfeeBO3IgdqdJKL#q#*@-Uw9MLOMRTUSK7;dn8cUo_{km&5_vAn2^{(n< zdnEJ`q>_sj|5m*Cn;Kwop9WZbb_1*@hw94_SS}WUrNY}er~YKE2BSGJY2TsyAIMaW z?${Ko>Mv$n+Y8E@axLVxb?UHO3vWj0#ibvG0x<^2Ay0I%a%lqiM5H(axiht@^10(| zO^t8WhHgC$0GiAb@Za3V-L}xIitn5af)(Rm%*?ho7} z?}4M;uZ7=aXB+<%C3*BdBf)&kyj_t?0#!$mH7ILJR>d#}OYUy^Lmhs8obFG*_TfKg zq>TqWZMesV&r!FtM?{1u>jDQ%@U-DJkL_<9g1Vibir;SRg7u2maW{xwjjcO0YfZnJ zfAtx-&@|>?Aym=`gT%&pL4qF`XV?e23vm}dq1kQQjYaW9;BPK;N4|?vwq&*8*n65^ z&P;c^Z5uq!PYK535Sb9v43wF$T*9^XZq;`OR{*5Gt#E@jVFOsg-q4nQ<0y6k#YT>z z?{GVh>)Rx`-H{*#-0KUyo=yewsMm*X=K(y7Q>(4o3)|BJt5mt~mGb(HUm}tzLF;vl zlt15Z{04(isX#3wAZ?71b4g)`Hlf39d#`XCct7ZWqRch|ghR61er&JiKSWUv+1_zG zKM@;z&HpCPTWq_1bf1V)IU&=J1YhYoPb>i|kl2>g5>&Wdo3Neccsh#KBBL3tEIMXe zF0#G99zcO2@7o-AR2`;*_Uk;hC_;L@)$PQVUDP_?jm)Bg?}oP90PZ157E!jioo!ZY zYA@`wZIc=X^nF^xJJiCjPl>YH)v8kv(T2rs{1Q~?iWq#*ds!8&`i?UOjV$;I|B+bE zZ>HDwxb)!-Zrh21ugoA>&G9U$4`1Ml;I;j<+qqdkEM-C_8_bUkU#PwCj@!1!?R--| zDSfezj&KV`IubH_&wUvW+@yiS0(vUlG-tP7OK8rJWq+%jOsfd$Am_$fQLTh z)!c1kB3Unv(fun<`Fgj{`MB#MD={k}5_tsmkiq{Y?2IyA2wtSl`}%M)vAbVot9V8p zo79&pzQtSjSvze7E@OSPdPw3l!l^*=G^Z+T;-ud>rB-v^!sHUkVPxCtiJ~T%X3V>z8yePg^@GE_ zM*nx`usHsNxpyToa7&qkmUP^&v~!BZ2y0J?}5F_T zQfdcjEYoMqDWdn3|Mn$HfmC~8bJBr&Xme9+;Vbqu;(Mz`X9n;tkCeV$_@0GLv|`CF3ojp39*1aXYRmajn*)m=p8>I{-an6ZT!(bJ#~llbDx1w zDj~_95No!+?{Dq%e)2i*%lf<*_{+ZEPxvR^uVMx2jd%4KGqcZ0X=b04W}Wl?!9MS6 z&v~!Lc(SIUbKa{IlkXeOc|WgD`v2SaJI?ujTc7VYo%3Ei7MFZuom0Nt?TZInahr)gYE~k9^NE}#226QjY}UtEUp^2Pf{Ulu;z=3 z9`6Um)i62h{hiwUd(HQw;y?eUWJkn*bXKtJ65-J6uaoa06N}(J`y^_3dqT$@+Wd>n zbVtWO<|Z`?3Gm(Mu2HFh5zszu+Wh^DZVKy-zj*FPD%Yq)KpRfajGMZLsZEC!g*IRG z6TuzR{<=k6Zx(E!tdEHoPDfm!J)BimEC*~4-bcSWdxV?GjH)lw2`jNSvL_S zFK!-crDhq9&K_n)nUhbH{J5Czq*lyquIg_SNeaE2*Q=Nqz40AqMWj{q@xv9g?z!J< z^~+Rr?+Bm12#jK~@DAhlFXk;w-lG3BZ*#eQ+Pode?PKPxgWCpm%W>dnM6vVhdGhHK zYr1Ys%}o`;-F01R7&Rb%H}Si`OE^<`t7aFN@7M62W7J6hre_mN?=CHjmjwa8Z|9|` zs^8(7TmjeijyLo%M-Jn91mptmC&uq>p-eC>VneFpGHdD zvm`vN?$N+QY}hV4$BZ{#hPTglKinuk%lLUz?jDu9hnwUlDvxsasN6l=EyBEQV?I)W&OidVAj|Eb;fqSc7hFA-KwSj{(tC*CKnPZMVif2)u6_U3Ut`){ZfHo>~yn-XUs z_y3dfocir{EBtfodLe6vydTQ7k$=LU-BP5VTrZGI>!PeF1v_I;{GO8!ubtuC+?jy| zKxHly|AlP;jNXX`W9ID@91B?c;S~PPrN4`rgZHeoZXzw8zHybzOr=jXUriiz4D07H z2*qy2E|!Ox&HFRZW0b7mD_U`Qf2X$!Db~JN#tR|>{l1E+k3}W>-?I2~cw5KH98f7_ z>0<}Aj+LV=W(v93@O-Y1&5P~*08N{*`Rl~4OEehv#j?hVamBIN%RzLv$L2s9FNt<# ztfCitlhX(eIe9*ptY3*saj>F!fCDSI&a0kIaGmXes#~*K!=JG`qyTtb5ak)U3q*b> z2uJy<^0H%JkbecU)&l9*O+`J^fY2400Jo}OCsb>&V%37&?W-!!v-@bCTwaQia-izo zfxfB0(OC6Pnyh^!83P7mrm&srdDJ)0$cM;b{a*2{RiFCkq3lAPJhIEK&)3Acx zfFdIt*Lh1;r8v}(-+m>uBgnyz@k<+4Y5zLZ3eI1VHM*IMZ;@{>IZD64hKpV~>d zFKvE0vDwEjkyb>~a~ZWV=2hl$LHipDp%_f>G2DkuMa0>d)+wnLe;q|O#!6rOHBNY1 zIdSk8zFX5Njft+lXSrJBye9!J zq9oHPBT=54$rU7$WzrVBhyH8N91tr^tg5)pb#_`1!m>_5zG^Vn?SR#LsI$e?9gKn#L0u zm!pokjB%ydU!tP9QW_52dqjdheRrh7aZ6Dwe2p~eMh7fEp4VsR#Gf4`skZr@EG)B@ z&~j_Zi?t7p%Y?T|WB57_ZLYf$lZRnaH6v#=e@}6aeesVE4Ox?M{ zBYLo5)>y2ZPui582qRZ?y@Kv_N}erNefwhf+=P-nEZ1B8WiTp00as*FuGL?WU_$^n z;I%EL-|@pB<>|K!#J}DVJ={oI%ERDj+QxEYh;R#2s5aI7&!6I=h1XF`;}%EZVWknK z3Zg9%21S`a`1O5&VZ=URv`8uBcx#=B^}a9mYd;lSFMC#WtUEq2rgJL1FE(T%q59@^ z5NZm%FE&U$Z;Ff^sI9#z*K||l&%{Q8vKJom>F#+1DGlq!%8ZbB!vu6ym5awGdVkd?c-TcJhlQFuc>Fe*psIiO>eD zV4{Ub=3Jgk?7z+=W~GGD8+bhyqKr#>Y$JnMW-p^l2poc_<*1$rZiD0ps+^arbj4p_ z_GF?ckVQ`|174k=q#EsEve3z3%9M1(TF&%erfo{20m5+ZDtTr)nT%W=~oZ(YuO}WT}gV7!}bKDo3=M}9ROJ1THLT^beCe2bxvZw`$@($-)OIzC)I#g94N{ z`sQ7*nI3lMC7f`$^9G)OSO?u~gWZMp^794w-H=MARaa3i>3bt2!Gf5*M{#xRr;_Pz9a2Ix3bAQfv83mdD%_u<7sn&~8s@|9e z?2GMp$?#S%p)UP>mvf`5_jLgUktRoatSCawl@<+sRjOA#z=cvx0U9iyX-m;`Zr-1+ ze9S4J9o=}0qS10ba4<}4F>s~)`uk^aF+g+h8m8kab0*5UBNNGLB*>49Kk!z6lP3RJ zQ&Y&Zl!-Yl;|D-cU3nqEN8IzOze?zQMGtU*UQ7nvl%t5NFyuwC>v2*5MW4>-RYP40 zkz5RfNXTM93GU)HpvM9n>P(6)UZy_6-b(qb*4xDFx@`v@bl|ZW{b@vYJ39ji)lDNe zF}!(R7{hbMN6iOOP&!@_1NKG#4*BZc;4kc|0eN^zEi+AOgt`K!YtKm+qgI&L7nwDA z*pA^`iVHy#y;b$Njbw;sn^L*+Yu> z;=gYaz^v`0>cYWQ@5<@i^(v@66Nr_r#VsIVu9Db)=Tn{p7;6&|)2eflMEmFCWYnr! zK<37oD@G*Hpl@>xzGI+3zX9ZH4JDmwSst`R^JqC7FkK?OiY^>OONI)Ho-$jBDD6%S z(8#$ZwuBu3BP2JpR+=lV`c`_qjk|~|KTBpoU%1)*~qO4!#R}g38(zv8X$zRvPKQ4uCfn2=h**1 z)$F!qa*+SL6wVVV$pJ4#^^(^pf$v|c`bnW*nx(b&9P0Q9jWgNWfc&tFi*$hLW5HM!O;JOScpkK*3uE#IG0WSx8#T2-R1q19Ug^=7k!&?-<%yvHh*3Ax(LZwyT?5lF;p#?Q+ zo|#<uoNl@Tm@uq*sJmoC$R+N9MwIn#tn-%5s`^wUx4%s*PMK)ePV&u|aSP zE!LDGQTl+_rF+~iJpf>br-=JvGhISPleS`M$u`^LW$e^SM!Kh{`a)j2Rj^+^NpASm z4ud11@I=jl_+2FC zH}b5_p0bR=^jT=r-?kfpaZdeJh{+Yyr2e4Ge^dsDQg$t7-~-=x)CP!*vUUC zFcho!iE?WT`$>_*z3Md7t4(|}>7Drzm;ywNY$-VqMrC6H0tSfV0#K)}t>gJ% zgArqL8TgDN=?!yZ7r*W>A**@_;NKkYm2Fr+h!vLCn2uWI=fJ3rL#-0?8I-f?BhqgX zK%b0JbG){9{kC_(H(J|B=uO7cNFhW@QN)hmZ~@D_vSL9;<`r};%U?m)^3GRK+Z*zV zfLCFN?WlgKU8{IUuAN%NUNi}bm@N@YQQV93;Y;0G#Q{{9U&4*KmMvdr4|#>tda+FH z7ksYk{A4a{ou#_f!=NvvRMAwzE?GrCDXQ%;%~toW!U=InwmgJ%G-UQ9yT^J*e`|va-s0m=V#xlJ5PZ*{z1XhnR@8 ziZckcFH^lw8JPj)5-*E*6xLT51>F?TQqV6R!I5Me=!igjGDRPuOk35f4T6{m4^zKG z3rnB6b6chTwD4RWz(#~eYYhGlB_b?P{lfRQsd6G(S4A9!@=o#E=@f08*S43^t(@)$ zMbM~OI~@=_rL(z&$&-+eBKLlZzOz4te(f{dWIe;pvvTt+8yD}ZnY8MrWmLBjhuC?9gUbH(_hR0q<*i{Fi$2M z=O)8Hpi%(+YNZ=n?TV9Au$^*DihRPtKRu!FPp#hag?iFuaAZ~Z`Hl-sLI#9nybK;uClJ{)xDal z3b(H7PFdkxRk(STl1lLrp-8!5a45HEu3)VEl)Es%er*&&5!g3|@^YW^5Jn}O#vIo0 z<&tPwc5gd<#sqMNiFvIkRi#GJ~~kn@eU@srye9I zYtdCJsr0+@G~~{Ws{2#u#^rXX+e6$2a6b>mwa>W!Tsr?JiVgn=HT0mp+5)w?N-<}c z^N3HSS&dMe5s-dG^11)Lwb1)*i6SDQ;4IBr5*`biOM{oC;SiuBib6c_q&ikx(GGc7 z!6BKS<$xc#lZC*~Lcj~CgdI}tXD!Ia`#iyNW32+9sjg-7^_56Y3%%*I#-u2`iL7pX z*2MQsDCcKnkrTn4vM?lq;bZKt@Z)~P5h%p}nGioQx)*DOh4l_5^!?%Zax*h_dA zol9pg;>H8wpTZXDRATLlC2)|OtD@+o;{sKzVHtioSc?}gp3XRZfB^?^z9Qj$==ZKC z`p|Eo*7j#<{v`btik|gUl78c-EO=4;CK}40Ua~yi$kEz2Q}X-80XqeyL5G_SDiGBX zMb)4Ad(`|*#@LJBOwrx{J3SXduFZXcJkbIrB`aH2X~El*ML%T*n-ewXNx$t=nXmL& z6Ic0L<+sKBws^r;0998?4M4EwD)f1Ub$#(pE1atex2`YVWrcH9;nwxVX;wH_6|SzL zkmxHs8hk<~xVsR@RkhdFjA@FvANDy9`%pB}LO0XgE~vbiFFP@x00aC17DH9PL_M*R zF{_uTrtmkTo@7Wc5VD>ySq39#CxmweBSZc;-l!e`ajLlimKy!kR=Wu0xje2)Y2r`A zPWw=1J}6dq$oy0jzphAnH)ToWuCi|a7|))bC4|+Pq@9&nk@lQdRVxoa%~<#=e?XNF ze+HOBY31IO^~C*ZrP)sFxJo;%wyv*Q?Y+)w=hfErRja+%S?#>qy1r_)_d2V+S6l5Z zOK4BLVKhg(!9ky_fm#FWfGy zo3GHE|9gdJgUV~+3n}I3T*PIH&dW5j$Zz7+VQVGO!XHq+fZlFe)+8AE2{82gO@@9m z@2ME4oF)sJ(r*tFE;Hj{7J_AL-2Nym7Ij|aw{;P{&6*jq6fCnwDE;QQec?mDTx|hN zI=>KgGNH4T@-rP0@*;Qs7v=6HxqFGb`d4Zxh+Ji%(6Sp|G@lz@w4PtGo?nvZOM7t4Sy*I#+vfO5MQW{~U@-t@CE}gxm3fvZ z?bOb5?Dd5rY)|Fa&OYB?faMm4J4K%(i_^d6n17@y0%4wZUzH~-fO>ME>bIG$h>!C) zV-@kdRmXi1UoKB+Jo%0JA|pgR-K5@a_v%}{$M%rsGI<8=<8NGy9P1E!kIz_HnJe+v zdgZ+_YHb>iNjz<@vCur<_J0s%Kwj+C{U30?%>lt_Z{dcTPGpC`0q>%F1|r26p&J`X z1#@ZyY|~YK;aV)~ z4rmQk>Q_il-xg9CNB|h73CLISM zate`4+=+($mtw%|C&UIPIm+R;?ep?KU|GEO8^0&zW8TmwgaNCT#T&F{D;O)KB8O@2!& zk86`ZfF~>w#Qq8~p3P-<#b2}7n~z+nnhr$(NtRO-E?T`DdFVTw$CW|!@#-O7+eu2f zi+4x`a$ukh8A03+dJ;pgq_H+z(}_5r@2xKP>K))a`EBfiR7+B$1>8zQQcp|-lzk{Z zSsj<~_bYo!D%k`~l7LR^#@<5iaI@Gk$gvoI8%_sXeZ3n3wv7Q>bHH}kKXPfUl(^wu zNKQnJLXKAnK`A8A=84=hghfPRa15jylD)Q2_Tz#ypogXEt*Tno7pFjd=m*OEl8#Cf z4ITN^cuU#^^Nw&6k0dZtE|I0u;q31emC)AP%dq~sv#cNIE`$~F4&S2~-g9H*IGEwC zjt^nTy;bP)sPQ>_JSK(dsvOEFtc{rPlXZRj*Uf>}2%E?!H#PUrAyIjmRpU!QhDBrDP3F*jKjj>&<4qghOsZ?KU!0-p3Z&JVBX0wmeRrS!B zAk1n$^nJAOr?fFyNP=$tt|3U+R|!EJY_>*3k<1;(ZOx$53Ob-VI1!p?$}hbU^StB* zkwQ+^S+nH4==6$~&j={}%@3FgT^MR=VUL5#_jSu)(WvT+Jdr8GeMT@}TB^MP z$>;;PLP9EDk#;;C; zt+76I>APc7%Y=0~8PNBOsC-R3Z{35Rljt6O%5cedAWb8>7IzT_E#E~0B92&^ph;tm zQF(Q}Hap9&g4lLxfgYritB4KHvRKjP)n{lkrkh~bZ{uJsU#0gx(@&XwdavZw0k4xm zxVTikdMgn5tydj5=!)8StKMV?nX8$;R+=4?b7JRm=W@2~IIeo%YK^r`ggQ_7t4^#I z0|Kmuh$-EO8PJbhugOZ`a-MW!fZKHiRxLYDD*cLKL{RZ5hMJKvYOCNR&4FBnMuwuG zP$sWrYZTwWxVAi-v5u+eqPkZ487ZA67m8S=K#?Wj>y&`IB;Zs^z;p>XnG!Hl0#2j^ z)Jnkdlz;^i(329-C;`V(0+vX?S1AF@B;d=GfaMZ!G$o)(0*<5vtdfAkDFIOlIFu65 zCIQ_k0qqj-MM}Uf3HUrEpi=_=mJ$$?fX`9_x+S11C7?$FK1~Toqq$edQvxz2AeIu~ zAi!e`y53iH(q{xP&OgqoJ&-^z)?I#Q+;8}Le9iH6jMdbBo}LOv<+Z?tF7A;#Ag<&B z5UL9}dSvwa9&oKZdOH#TjJCsr7ze~HQeSm||Af2`y(6#lU9!rR(8yXvIFR8tFD^&sE1#;smUukgyi;)_Dk1xPmWUp1 zS(YRhb-tuIZi9cg3jgU^*#Ry8bFI8fe4~`VuQ@8awX%;iN4{1D<^T`b&}yaYZE_Kt zLTjU>BI!$_5V0TJQqT4%yo8YvAIlP%%g_G-pFN zYNnE_Vo5={X_(){jl`15NUTb(Dn>LBquq)z-HK70h|!sd(QUb*gTtfpjw z*5bvsU?y!U>ZXb5`+C6uSW-f^7EaO|_bd_TZNJ=F%k53I0$noU7#zi1GrI5KM+QtGjIi$y?sc zDyHIa%4$VbaaNoaN4<1}?NULKQ*oX-D~@{U2ZK!`mm24Rv*M_ij_~l5 zI0JsI;%t?SRhi}G*{!%*nvDZ)Io~~e2ThaUPL{?P))?lR4a+)}OI4NWy5g+G850UO zDoh%80e3OiuOzK6c*g{6ln`I7oVR|6SofoOG-ZA}QS(Wd_rti%=H!!iTg-Q7&VxCh zb7alca%i+I915!Qxm`6MVRM;As?5huK1LuqU#U7Q9>G)W!#U!lQ%DoG-RJ_Sm6kGA z5<>Cw)rV?30B1XbCkBhmh=q^JZ@yx30q6nIp@O5qI|OI^2sq=E#JG#tV%ko|ySQZ& zH=iuT+2&%&ukUDoV8St4IFf$p@ zZ3fgP17w_%#)4!(j~URI3^-*5EJ+5WQ4c;@mJE<_Ou+JFK&Bbclnlr+16Cyi9A-c? z86e}FG}@8@1I>W;WWXRZU{^9A*9_=P2FN@hjaV`u-wfzZ1`II+dXfRd%z!iok=e*H zPe>y(88E^Oa3ljpnE}ga7S2`X3u$*@3YVlq%%UaIWTGghR!cN@4MRGwD0Zq+A+MSv z8A2rP#8wU@X+~2n7Xc<)_!q_`YW!ZF(`Q^JgDuMAXdcsocf}X-mdR4jMP{tExMrzA z$)E*K?qVNb*KGlN($x94( zrfsQ|&D`InS?QV|0Z71#DtTlKW4ePMsm=Qt{J%DIk2X)NLqls z{Vf&n8lcW7-_0#r{0on6?J%f%9?Kbh+)ZW(Tf$zl*X9a-D1kExghnY<53G==s1%SuMAYy+i<`Jj z_&-DyqfT@<>O_a5PINfxqzq-KQOFB$M8V72FGx$-@;ZA+9R)F!G&Yje0?DfS$Mn6F zz#0NVqi~PtD4*{z)1t*BAe#V6Qp-0qofMs?C0we@tX8Igi~7<>T1E6P6oQSVdeL3; zX;*$?JXjYzmKAdD=SGg_Ltv@NZ6Q8$wbxd=FueP@@kVZe)Mmm|L;Rp>kHx* z@ty-TbWpirD@)5ITo!E~O&LXV4wv!CrEWCQw1z!u>{qP>NHgWFLhI6q}>6DTihp*(=8rzRck)SzgDM0L-zi^RQZr;2XkvM6{O zqO)u;M^$utu5^5~A4=0mO@mJfe%~>i!I&kgE|8?`^U@9B)BmZwSpsJg7mR=Z$meTS zg@65}^q1O+i|m}R_#Yr_vC^5yoRj?F+4ANX&434sCO{+T`;0fHm@){Y&7tEsfq046 z;v7N?%ds>U%MnEc%W^kN;M7wB8Dz0OknrQu==%^^A!1=yU zT*wIsm%|1Mir$XDl{SCXaeq~?&7pGXp22>3Xb-- z#Msq@x-lgcGs)Yn@8F=vC+H)lyCY(V3aHPyl|5Ug+#TD^otHbL-~-u9nYM2_I?LUh zj%N6QRKh5c@L|L;pG4-*nCIyb@8oF&Pc&%%cWYEj5BRSKg)_UX8q(}DZj#MO52Z$g z{x!XZ?%f0ja%HtcWD7QskCDfihq74w1@!F&;3q4%EYM|8&GYH409eSU0;?=$BYXn# z6F!$Xa06Tq*pVez^)2Z70qDz&XsIJ}Oi)SU{e%eO5F`F6ho>e#D87oMt?v{FeEYtd zUkIEJG*6mVTe!lcn$t-mT?>6e8n9)dwbELo`77SW7x9y_-;vL?g(3+io_xpo!VE5c zeGBCQ-w43nA#h)%asF_6*~#FNk@hJA%qcIYt&(~A4R43Mh{Up=*R~^2cp|teQM2j- zC{_^}u!KC>C-IN8{1^%2L!s;drje(4nVt8lmj98ARjM1BwUI+D)qYy|Jqm2KYy1rs z)q*W&?AeAaIJ-b3Frfv@jVNA+D2#a>S|a`iP} z{WoyLh#XuEO}@@Q`&%vh$E_U$d=0sOA4yZR>x<66f^WPGF-= z_C3K)69$S*Rcg2o6!p1)9uMdrD3qW28ga#@D|dBBVG!V$inXForbIG<<<%ZMZ*{Z( zc#$Xq9sCfU5)< z_Cj3Gst=PcjVw%LnknPIIB7C*SB)p9?&;2q+;xx z0+0tO9_UE{1f!;X5+5&Ti=;>ab1Uy6Rl>21Kc~#Kyne}N1+AQSy?SN{JfbyZazqTN{_W(Xd^>nCD^;m9bzc#8?7x3&9*`#6`|R~<0Zr=0G#GmR7ie20 zX<+RI$r8F03FMQ{`BpxxVUY)ixv;0`*v~RxAfZU}CYJ#3l^gJUG!QIkhdc71-CH#t z+g+uq?gPcvxevFZt~D~AE%>p5_d>IB(<0;ZHTQ0}zD4tJuv${<);tHCyL6AB&j4dI z3tzFgSD|IF_93a z#uxEqy7fcNaYWIFb{vNB?$0{xM)3H~k3kxM!g{V$tBQ1eK%d|p+xX4>o z0+Qb+5}QK~{hnpA&dZ^)UIJupa=(Gzeb@+PU2);({j0BZ0W(2SjP3Un!@(bQ$SlpaxCH{>mzki*iEM-VZ zHoXGxMQ;Q*#D75|0<({GiqLkcgcd$wHZD9#x7oNp&cv}!!9)hfNO+80V%m%=#l|`> zK#-=H#&c%tf2=w{4OSqN-I06#;?ZM%09xD}(_{OS+7%aenO%YRE+8U?*ZXu1%hVu& z{D;g=owbUYuz)nq`gSJ=QOuw==}Of-I~h!n!~1_kT~Y3^4>XlJ>~%h%<3j?6!{+B% zZ=q*_7P?#3gs7rdEaI5^!D3W9AwC)ZeIM&QlR9fYlNQ=p!fH__;P1-MNj5@LwexAN zp6YdWa5Ve`ToUR>s0k?*690>`SY%8gl>|TL6^5&gP_^-CCnXVR6v>8%#Y4T3jZfkQ zn~SKhW&Cl@x!ziJrT>8XTBa?G&?%Gw+lUhQs3}cu)9B4SYismHP|s9j4YDHRDRrb_ zsY5Tv+J?)RNQ{S8yWe(DhQr3VXlQ^ALee;vscKdy`KTU?tG2)rG^Qa4YH3!kTs;d4 zc3QK6o{d`TtCY&Cw?kCv15+6v#V1CI1erZ+n%B_5Y^5;o(ND-cJ$sTKjhQ1uhQ1zW zn)r0+$vqn(%Cr9k3Mu8l0vM_&)8fqfLA~g-oMyib;!PEqbV6Sd*kRA((c@yU6l=Xk z8lVL1&Wh2Tnn|OmIl{D~(d|ClTlnq}`b=6VyN^UkSbu|L=mB%~>n#EOEv-RQA7=EF zB?+$t4zte!i?wq9y5~gFxKJtoBYID{}mdapg&3ao`TPI>i;r6TTf|X zQ?twazvHucx=~>1$x--h3uP~HEO@BWD!{n-B5PT>e(0KbM1g$h%tTmr^G*_1H}u=kG=S>d+v` zLP=dk*{X$pLKF}SlG<+e9+GV041kX$KexRS`NHG!C4aA~uNzw_4qAt_r}+W zxM=E&dVc% zPVQ5qn8;IF{RW9c26=iWu|!t$O|h0*v4-jB?_sgWql^X9QVQB=c;V>;d5x`%pn*-7 zY_T8inwFZHLIW%DMY8e)4h%~=00D>tT~18`IIsdMj^Kg0^9B(oFEx%?cEJP7$^#IL z*BPrIz>x0#4-^Xp63|MJvwkWaa29e_YC3|{<<86H`%T`}J(2 zB61gzyM;~i6O~7~i^$!=cKPX)N4bm0-NJ4Z(ih5;+(ejWFr1TzmG=WIoZh4p}53cm#PmhU|uLs8ceKW;_z}1J}``r&+m}S{~Rqy)>_qz4> zw28Zj?TZZB4YGeBm=+T^c$cIP55XJwu2`!&A?-!h2yR2?QL-v zw&)#vkVt@Hv?IifEGk#wKJkh=0gxQO@q?4U z#5ZNczLC7%B}rq3&0Tm}$FyQ1lFeRUWE4(-{Kq&diwu7y9m`Pt%@|hg0^kg8R=U;@ zV0Hwm-sKsT74Vg+j$nZ^djyl}sBtUUJv)7ooVUhBvL4Y}#|$3z@csAV6nVzou2zAq zNsAxnr%!orB6h^T!d}>R3EFnYXo4|q&bBdy_D8gNjYI~ru1|chu8!jKYCBl84;MB+ z*d3pzQcUhg$!$F$9Gs6mehK*h8_*XzhEZ4b(H_N5dm|V2w)En8XLFBR-=|9W8Q)wI zEoeEmQ(F&!&v_>7I}Eov#cA&HQh;RoAcpoS4`n|^aVW}{&Nkag=aGVw+WKuSU4ZE= z@OZAJ%|HUR%9ae{g!BMHN4-Z|B<8;$DuZSAJzHU`hcfI0=C^gU_ULA9Y`cEkx#QR# z!~I>G-m>FUG*~bUcQ-qaI6K@08;*5+Q!Z`JmSejL+LxfPW>;rD$_zIu`6ouq2AL!& z|75&G#t#J3sJRnln!};5u2`Q-`#F!j>X6H!j!*R+&G9Vbw>^F%V>?33=13 z9cj)Ub{fvMiqteEJ+J;V{r`~n?(tDo=fZy`nP{Sedq#uO8f(zlW|UfT8c#`~l?^j8 zLuUjvNK%8SL2OU8SjY(4go{HoyTb;4ZB^P+TY9sc^Xidav{$%QEqm;gh;+kuU!?%H|QkL@1 zM>tG!R1*bTJyJjA&iX0YU=_h@F49%zHe<>dBi7OpKC#4@mRmn%Ebmh4r;Ku`KRHqn zOJ{-8%Sp;(%*?(`d)0A~*J$<-qBGW>;mK@hiN_9PXs<>y8*b_6BLYbB`R5X!^F3y` zQiIE5#JuK2Dw&c^9ha$K71PG(e5_|S>Mb4A<|Ulv4G2+|P;F9WqX#NWSt>PYI(?xl z9uhuiuV!6Ix5iM5C$mLWGEm1*6)Hp?^wolYjwdoDH-BgMX(MJ#%OgyW5$!(FA1&r1SQn>qcLIlDGHQJ;aca7039{{F-`ia*tCC`nI@5?MM zph2P*hx;V9;WZ>l$-z^AUy9^lkmoT{^<_OWTMHlbM5bj#W{!$X8$-74>~KxS+||a+ zQM$m`n35woKDI8nA`rROW9;^tcdEJ2wO0$iYAlq&XP)>6W2YjTu+fBZV*Y;tiKO)f zA_^?f42WFlNPd(l^0-^Xzhgl<*PWT51a6uXP^9keyCzn50qq=p*;&=;MSPwSSqMhc z>1o-hD2A<9V) zHJl9l>pT)NsAhgVF&JYeg98V0mO&|*f+u7&0Dn|up&E`ZlaLHA1~Q8N@x}jnIHar3 z+~0DHVNKLtJ-zIp8qdjPC)Idn=1Sem&RFBwKQJEEFWFBezM+SNL0-b0>EW(+Jsc&i zPEV%xq%h;$K~J%xi?w!oh}YwZJd_hz2ukCxp?9Am4Rroaqe~a0Cglx5^J|r`*UcvP z^4q$b=rTN*mgm*H2i*IOg}EN%A!ZcMUSKeP01c-Af`tkVhv>1w$3x8LLpd^?O){Og zl9WX!K9w;o8+6RRRyUetHrq2Y+aL^wg)l5TtOj4V?6eyE!d!)uy$UDW=Km+-&|BY+ zOhNQGEej;k!lKq7`kqtYBvi<&O*`}Vi@ET)n>>+u%+NxIZce+{<8IWA?RxBJn)bH? z_|*w3jm3ZAu?1Pah^EVQFC;kS5s&*MR08tT*m^LtSvT*<=-4E+fjr=jwf;|AKxzzpY8@H~Z=& zXelz9K>gSd>JP2pw)rorG!BBuHq=qwNL~?Oz_`QxO{42T?bf)L zwZo(t)3Q9aDdaua{n#aJAHaeoy4&cIO>mYK3U`2>!X!p!4o$NhXA?_NW_yE7Hmp%B z9A$1Bgq1;ImucbK!^f3=2La_HJ#@toaAkXJ?qV3w-t>)-Z2#8g&AnSccFdwUf$% zZ0~Ov-Q0RaV8ciguo>91Ww7kmY}VI>tj*dw6R`#J>JU!zN|(n9Y!x9Adx8!TbEVEl#B(J1A2>Ac&fAHOH~6oBWC6iKTUfT zgo5k{QHMf8I(3U~LU*~fHp1|fQ3D&A_T)`;?SlBX^0`+iN{5=0)^-Il9BBkPQ7|>v zjk^BjmQIJ8WUwzccx4x^VTZD|H0|lOL4X0TW<3@MUOhwb`sqJ{*E9=WO`nF>4-)Xo z{J##bDDYC7_@}@H@EDT-%i1-yC%d{p2z$SBep2R;DHE-MK%h{aDKl(1yAyhekm_cwY+pCKNV6FHevynpmg(nwW?vKn!5yvC1gKfS#>tFKs>6x>} z>aimk;rgC%zqX_vKZc%gtOp`Xi&TOUd@e&eVCsq+O9{uk! zAWvbdY>n6I{V;j69bWg|+o~N`5Q@>0iT*d%kpc4jEUCm-454nnc{4KK+i3ZXA@tM;nay>qlYJDj8c0CGYO;_^WqfFlQ`K`?4H&F8F?czeaI( zF7iXRns4Q5Z|n%4xK_Zor1cm{oG#PF6LhKG+Up&?8Kye3%VXP7*t5V%aGH`eQA}blZvU-Ja1+h`i*LHG8N3jv=F|D?75lVQcyuFZ#zX$XIZhFLH&+X15@_ z+I~s?&dj^UMkeRs>O88`qb|xlG8;+r@u?c%57Nv#qrtI9>{@_= zFRj0xDE96?Ktj-7{n9KB#QcjL&tSOWGun~{0&Vtq-CIb3_`S}HBX^DE;sJr}f(&<` zFKzry3mox}rinMeM~kOMCT9Ti!sf@uc?&;ToWl@pErqf9S0xze6T(32qr3Hbd#=FE z7rC^1r>&U-ip`UG7M`jT>3!nWaH@hFN#Xwh{*u8-Bsy54Rb%Hd`Wxv8)w%P+E>6j) z_pTR498tq%J~Q+erML2J6!1x-x*EOzHMy5!IQ#M6+|^j`XqzVW!4+wLO*JlqgotSq zN7YoZV8rq<^e(Zws-n8)j~YanMa5SAhyxW{S&g>IGsPihD6w-n$nUFBH(-z#Tfz4t}w z9+uB*RQ*^LOL&i`4_zul8}T`s9#TkRM-cH;t;Z&F))inUQqv4Vvdcs7k z@d!|0V6dxcZD;PZl`l{tP}VL=bkm;cD{H10Ins*95j#O*tda0RY$`mp_CQ(iMdD1@ zaa{MuKCol8kmfhe`n&g%^eK(#OG}}H$?GdXTwx+o8*Ny0CG6>o&dC6>&+&7gT;*wb zlFD{F{}_>iIB6?O-eNGo$XVJdg>p$@>HMx-9jInGfIRi`O%X@&W+tObve$dz#~jZZ3f~dt?C>?XMcZP(6)mdzgpEh+;)5^ zQzmFBcnywTFhAkSwOI1>A--2L)yu}Kqpl;N9J*oxNyy65o)lX`k5LysoJJHY(d=R$ zi;Y6H&(>pXO`Z=H-0bQ6%zTt61N@!h)ST0DxR^Fpb1t07i~GnduGQ70fL~hH0j;h* zSIeu@vhZ3sqt%^rX>~pL6&}&*j$P-Wh({ZFz@ycDkgJV6snu=!s#e!@P}lM}xz)9D za?j(Gm32a^JDJNh!lo=<(%NSzRJ%w+9LSD zZkpQTk!113A8W<$d9}Qw9!+ec50L(t_VenzTIm)ouTv|P7sps@ly29xQdD|-iL%HS zCn@qV%hpTgWtywg>S~cA<-O_AvbHmV2I=8u+LwnM1GC=ZVKZY#?UY3(z`S?p&buxi zw$Y~=9&YAiM$*7Y8U|{Vft=Sy_5!7W`s7iUHu4j#u8T(__w&gIfa!fc8M%v_I5$TQ zYOZ;YYOaUw(_9OuYpx{|HP^JU9?dnIsc|7S&|I1?e0(X(x>u_j2hK>u%Px>YcQ+5C zXW-#<@%GE%pUPSz6u+u=Nwr8RN|2H>F^P(BFxp7~IZNfCb{?{EkDO`LY=X z3#0gqn)}Ui$yctN!~)~;K06Ofo8_kil1P=1N>_0P^f9Jou{w)6Q)dzNG;5DmT0>qS zOl)0`W}^tr(Si%?@P?lr<2R#8=jn$buIr>td}y&ai+j z=1U)zrKbH8wGi}LT(3OLhZl_3vTA3Qrz9*?G51xiSuv2cl?`I}Cb&0n6KHuR2xzc#dlGtq?wCP zq|hhw2~>#3+#yEJ>*e1Ea&uT-9hBOrNR48@bfa{u^b@GyKE`eKR_@e5PcYN2a^MJh zE2N^?(nHi{^}b2E(kDM~8pQ%cW&JG=nxsp6`3_+5qcTv)^P|!YaUdy;1NT;W1nW|| z8yd&w4bpsI8=I))jV|6Mw+_~P=@zl#_kapa$6nCF1tmY> zl(j(v)|v$qO$Xa0q2eNUj$>hC|BKcF&My&H1?)cx>fE1 zje@eQQxeC^%SPUm9+At384#tSa&2z{OM()zunj{`)J9s>ZxvreUZ~c9Z8yQ2i8{m# z$dm*z|E-$CYoT|{>l!&6nD>B8oEcVaJ0)n9UO<=@Iqcx)6uKPiAvp&n$zS60C)rcF zC~C(G?02X6M@BKJPtH$)GL86b+RESa4Kp*v9*E2wo1F25xd&(L=}!juTQV+t9T zbFIn?AuA!P*CzW^zAkFQfLQoPmjkG~ifXuZ2AVPwWjs?;RUvl6VTIV)Q~iaFp_e6I z=(Q9XR%?kzYPD+g;8|kqp4E{`aO}C(`S0$#h}0yOCgE>_yl>Ji9L+6$(jU2ftdEQx zI!3i*mB_*uBkC`^jNl6uhm1xUwRo!yOS`_nA(;rHp?lSEaRgDB2LB8I(HF^JT4hK@ ztqyG_^X%eQn9ly;eP*Y>tK5YLI^CyR?h-@%h3eA(?fySUGYNQqR{t%{ zv}N?+iCiX8!>pN6NSBndl%c8zeCIS-7~A)i-7N1eOY75QehTb^p-Qo z|3p|?xYeuOj?S>=HnV7|4JilO4$6>-+e;>L+cs}L(!wuvj>J}@(}^s!yICI{)osn9 zS+7Cw^P2dJpw{d7*##w@2>c$Se`@O;*ZF08MA}ArAAu$&!8Xz6e zBu^wS5VnauejW!xzy8;Si&Ea1$nUl{va`q&+@ zP5zUyKh~!*G9|9llAhz{Ggu})>H4C?wQjtt$If5uFZ+a;=YNWw%V3FyegQ^~>Ta|4 zM@sn1-VK_$zi2tf+U=5Xf6#EgN;R-9w_Dk|lvqym_rB3Fzj4^_ZVDJ5V;K37@S#jL=eXG16AP!?)OH|GC$A z8y`{}A;g_7xWW7Z?0n!~Q~5H=#iMe85p2P~VtHvhuMW<^bwOLhG&2zH4H)}_=C}Dn zfGzRq@@}y9e|BR>m>J1>5(*BRtAYwRbH&?47|Mg}ajq|Nll>G|CF1)HC(E;YvC9@O zcyZaS@4^2IoQq{3O5qwqmi~s&@8s-5KcmWx2^NRz2BNwm%fo$*czfc(pc_4%j-Z(x z4w!)_d%;7G5qI|>G1Cj9nu*a0NHL?|Xht^g#u^qs5U2xx8+`R%v3CPsI^1W_TDZ?* z_hQUgCxLkA4y~kKP|83@TUlV|3x9;`32xW`zO5qToRSmcN-?lKlRBTqPuMOl%> zabwY_$P=TCMQj*#2u>uGY)y`M+~J()Z3vp>Pi1hiUZB9=Xb^*VTu|0}3*!Wh5^Tdm zV`=3goRU^!V*8}R0=PqE_fd1f_?Q~!C2FQ3%%xMVT#Dym%C6)|hCI1cN?k5jS$|}X zTex!FjVWO*^A}_ORCEJ1k9c9fgv?i4d5W39t;Xpu+k)59a*3W2S|j_X;Li%dpK8G! zIRnjUvTJ!ApiC!13jPS+eT=```G;IdM0+K1{vni`DSLU=RB3=7K+QG4##k5g@4=*0l8*;(+w$PP~Eo;@_nc zaAd#vq7X8RBh!4tJ!<0bkCPqKldxwPlwXIBjstl%cp_g5L>|iXViw!Nc%XKFRfz2; zyxvwld{B`)_R*bMRRu3PekQ;+F!*R(9W0aRU9WqLb1mnfeGGjK*D>NBB;7#rhTcH) zhHfBwLpM-8b>oGziuFPD_Cxj7=&^o9_MV~r^6T{Oy@FAL`UJ`b%lf97xv$f89lzIO ze42_k=B@z(W{?ZW@UqCqJn1J|Uc^IGOx7pa$1Gk94W^(u$*RX<(u7`_pn8pXTdlP1 z43us4m+fY|Sm!ZLB5+NWIQcl?8t)J8zXYvB_ZUqLmT?$SV&zK*kN-}Btyiw&aqdPY zljEBlxJ8_)Cb(g;S#dQ6#Bxk_mA;Xpj(l5EL^=|%HAxUqkQinZ;D9C znYBWGvsn`&3P9E-xX)R<_$Ys+)3DVXE)?2o&a0%i4^sgWGWpI?puR@hb&#S5hJVd! zDnV3)Kmu`_Aib;TO<6wxOsI1&^oD;>XX1`lJwW#(mAk@{Yi-5`ZN(Lw2??fX^kKek z>uc#_SsP5tkFa1u6^p+?A4Rq063fQpuFKyiDLp0%KkFH%))(&ZaLt9Bp+&L*)SbCM zA9RT?eOG!Taah%|XNV&Hcgd$xL5~b7@H54?!q*JeFz4rhN#Fx)tSU;S&;@m{)70~? zHnniSR`orZ6QFSttt2>gqc-;lnf9`_HCjzg{8;=B0&wM5B%WTo45qUG+Hl{ZP?pb3 z|7I?=Fuke=(ADyThyZy$;P@}BtENWzU+w>L= zN_~WV*R&PCqc(x9Ur?{u?_l`p-@Qd?ej3!13pu+nM9y+hy9o z>f+0+zb-agK}y&KmK_-5Om8W$JX`6j)u&=+%j%pXS4AV)#%QFIKGc2Mir>iCkn&Qz zcse6fN)2Sba=~DWa%Ide{-|*+#EgOy72`Uq#)Y#TvXcg1VV@RuG7Kb{#62i>_zKTy zAo|d_vVMwNTr;UsEdJ;pjHmb#(D@P;Sz=6$p|@z=>Bvp=P<76k=%m_Uv#_YdZ;yzr znB_O>8|(~+B&O^zI1QiE<(GOMvawt`w;r z+aR|h+CwdH`967~1c7ZR2@ZWIx9>=Sc92EIIRV7BP>xrd`H>{*ZIq~2GgTmXHn%Ea zS3AUFl;|jl5{I;zgvOE*7w{`cN)bcS_u~S-g5~n-S#C$>f?}}*jZ-nlBxJCPH!a4U zLkUksW>kEZ8=-(mr;3Gn5Ta3hgbUZ0<-C%OUZhWW#8}*jyycomZNldkzr}T@eD+b| zvywwxSkXI{3wube=o-p=1mQ+Sr&Zm-;^eSiUMP@=3QX+FY5GPrv6^>Zz)i}h61;Lp zO#T=0rI~l9UI;(uUA>y~YRy^Z(CT(o^OwS%THVoVt?r$7>4SuhLXju|q}WJn;XNf> zR9$aqi@1+g6^K0Y`~2wU;?yv%7_TLoCN3%-Xp5xjhJ0!I&QziQDAZ{0TFv=TqP>Uy zVSCOiK_a+Ls5PysOk%yEO(L19dRAK9&QJV5zoH}>gZ#!Iy%T#XC>~7H7QYZZ@vg=e z!d`JNQ2{V<_MR8Ne=m~ELmX)E@jj*2D;TD^y+o-&_p#qcp2DDUp7V43r}qj=btY&W z*YdpU5%=0(Pz)a_1_I+Bj8@dc&o&UrpqX5wmAB%tMR5A3f~3jtx+S9dVE?R&;o3-t zo^rp`c|b6ZD3v{Qzg3chd%cX zIad0NUazrNZ@~*V5ukZ=iwcDyr&C2beoc!k^h}X)G%ang{=UxHDnipxFHwO7 z+#DJ1&Y`C`Ge7Pm3dB%-n)9FQU!oSWs+d{($x%GKKMf(mXFgcX>3ylhNkX4y2@B4V zAf3=SWJ#C>YLW|jmTpcykG75gxv1ARh;*OSAJubLEBv+8ZfbAvna_w`ff(I8??ITA zr(VHNubZT~?du4e57yO_R_T+9EyQcV3ZgCC-iu2FsH|$N{3hlmz;iv~E8Pv2dpUX& zRYYPDa1>w74#Yy?C>j43R)|7n73l+X)`>ZQImJgqxCcp3Sv-Ld%AC66VHAXfz>#b- z)W3E?P`&IG1+d$$joR zDgMh(Rhf(rlyI!#r)ZUM5sgrAm<|<<6B_RftP=J>o^s4{dR7V7zz$mshYSi8HW4oo zoXcT-tP;ts#or1SBA-}=5c+hApM48G^OwCTLLb%OHCIBp*Z>>z_d)ud>HCO$7BGXG z1114Tc`)+uO&kelek8kN-q3jl2s;aYrE52zcenu5+aWo<|!$!*< zDEk->XE#eG4>&t4BC6(tR!Rx=G9#1dXF=O({LnZ1Y>h2vS$V$heMFh?cfU*4A(XXB z4gt-%V14WLBKCrr-6uYwzB-JTDlQ9FeS{QP^KS|Fq%O$^3m|GC5dW|ohU1MOGSpT? zDj@!hwRCnw(Gh?3=;GN( z1U-e(%9+wZ&(qck@@cs#dfJ|_FHdQ%VFaUBvUBa`cNSg`7Rw=-HC!^{6w3+) z&do99grMEFwbL%q9&J%KWX_a*)Uf#?16$}vSp)1=bLdk-o14F6x14hZr2JaGEP0Lw?*eW_v z0|HBRDY?9@m{ozY!#YOb7%?Bz0w={D+%~v>Ck3n822(JO!RW?VVG76x^9MF(m>IwO zT~=nmILhXt>^8~>Ol1~R6v8Bywn#_M!gvQvf=!tSEe#^O7=47S!pMB_-4fLCMcuGp z8?LNQovVF6s;v<75RcK--5e$(c6&3O*_QsLIn3k1}Zqdx1!8g+LY#AJ=MmzrpAtKTh3TT8S( ztS&hxnkg;B;jyAS2_C9=pUxQ#G!*;`H6X7jP9Ob6p-Xo}d5FwJ)XMiZAb=*qJ_Dw$ z^f@d;tFTL{*V$OtnvRKvIVVw|e$h|?;p^1b<%yU7rCz#%uMbpFk$CaS4eBfJb{h6B zrI#|*W*|jm(bf9jg-5rdm2Je*kq$W17pgBfGY(ko7>{6q3ZeB@<2;blk3y^)7r=VY z_{z1~il0Ml{NY|(=-NcxUUSUFp7Afq`tfMf;+`KB@2{R|i z#EiSV8~6$SMGx0ud|aE(d}!K}-x9+BiK{$YUOR(-fz&N5-XIpe`JD~) zvtPR{Hp#T#7YQzBdkAo9P=QPpsZNmDN!k#p{v54&0nseb`2tD%i0T%w9&l#}2;i$A81_w@k7>|ZhOBF~=lE6AbPTRV%nC@K9F zZ;{A|f=4SU`V}7(w^|4L+FoDb{?Kb|5z;=HS_wNmkir>#ESW3K^5>J{15*cVW67vQ z4I(lY33BK|Mq@){UR?A`7@vFhh}r4PHj$y1KA%D`1;pgqO7T`OFhzO~A6i@Zj4kBK zC*)MWR`ob9I>e@d^F^P}ytET(jX_o{_IRggnC`oNAmd_y2w;$u{G4u$ z=HJ6VM|PWBEI+B#oS)NMD=eLi`S*;O#>;Q<_baY0ei(d&xx)KQQOUX7P9HUjrMO9QD302ov?4(ii=sJobi(#qAs)-7|@6N zFfWjRm67xZ9D}EMud$28_8Mq?mlM=2$mLAO!&0nZRIML`?IDQDoWXrrB%qla!YxJ`QNu#O4QUV6?y(R4(6gN41J7l93i|!ZkMNuJZDiR3%e;T!MCKxGKUE8r+DSm zY<67E$HV9?^0`Gs_x0k&ZZ!FgU7YeZ08XR}>E(&aV49IKf$dffup~o?1|@8&N7yvQ zbbJ+YkEzxJaj$UDa5pni@UEM2z(JC-T3b0$MD*t5eu*%Q*biCH&d%@p&8Z}TbT{Si zEUa5{50SERn6?d}I}|~_IAH9A5%!x45&7(i%u@6f6{xI-HEKPq8NMEFm-TQF77V}= ziDff#^NG~%Jw|JHt2x!y-Ga&!`iN-n^S(8D#J&_J{W-Qw z*T5Z-J-NMV=r)7fD~E0g?yQs%tb=;~u@T6+DBQ_<5c!38L8<7>;n{GHgvvxG`>9cV zWpGqrc>3zAIdhiv&(*c>2i_o_)$s-{7duuD4(uR>bFrRv!fI*D0E6t~Z zgTSDg^()bMJcW(O;G&h+Nn$rbyQ30%65}yK4ZtM8n!_Yq^f?hv&5E*vhx?G&Vdk*n z>i`e2^HSZs4Kjk5Rvk2jnkb7-!qp1T7c?Kvbx3}}2azO)s;&8i4}qMlRl#r%LrKdlTHX!Ue_mMH?TIt2EKd#s)4fXBjuMN6E1%_&dp< zHB*=wR}nG6`4faMaL!oA&*v%lHU(kQoZl9j(PrJaW~@_N`8!g)lxX4nnZe%coF&XP z)r-SV$yB~j2J4eDxIkW1tIgajMLjDV@@G~`Lf%bSUBzSDa{nOO>8#;WwW9Pn>Z~5R|jyD)|CMSt_Dp3w}h-^MoO1Cf<_CwjL;h^Tzs&a z9@>{_E1#v7{C>5!Ot<(62)1JreR39Ul3@lm0%G55yoP$Oz?2kwfz}W)U!%j#2U< z6J!68z{tKF5-VT|5NxHY0I*oG>xG;!_iKchAqGQues{k}){&;3O|xuO8xd2dbqYvm%Ibpd;|sCIk11|X2Io9cRf<@7h~ba++8tvN2a<0*Wg_*cg}&k zuR$wV8}&|KVQc7h$uoyu>r1eP&!j+khwtxtBx|{W5~t4I-yobJ);Q_UrVVZtTGg*) zW`}d>LMe&CYjn9AAkAIcs+C0a6Y?xnN2^-Soo+5biY$?62gvjyr%;TmuM+#N)`9WS zV}Lm?@X8_iQ}hZH`*<@9%uW~>=#jq_R!YePv zxMwkZl8!JYt4hd;q%<-12Sg4O+#c`AvZq9X+kwJ*X$nJ=sPNG>6cm+GE74#SA5A<; zrJY;Mi;my%Ls<5XUr2S>x|%=e6LZbw+`>?^C1;7imtucb#a>}qleDCcq$M?>->ajIm}Gu-8>oKDWSt?dlqRa! zx@JpE0Fm57tWb=RyTxm?#NCHP(A=+8pP;|NvRy&~jJ;l?2d)qs+JMp7`8iI!a&o%A zL*#EPxWV%kV84==0fg4(3f>`ElZX^C_X&Sl@99`t`4+T#ONov2Y9j=LbF-{&hHI^E zWcVYzSmN95*exdRI0xLvofI{XuuP z&zud%t)j8}&3kPLKQ&IkmN*LoP;`xKt0EK-6XHIhzDf9i=Z)D69_Xj*ZK2CKjdv=K z`$2pm2Q~h4t&66-+WEBA3#9>R3l z?>;xx%>ELxG5HMBHufvkrGO3Tl&UviW+kc`)<40POXTNH*^oh8^`yZwS~+RMu45V}5Kp*@=82DEyM2+mbHg%3&3Ad?%P zqd}9aWEowm#Dp+&PHxJJ$%R?uiCV!VJu zfg$3(Z~DL4^tQy-*6`>(kmR?ds1n zZTyLE9l^|aiIV1pvjT+-FPk&Rcl3sSBbdQGVv0&Srp(OO`V81edc?uqXH0f7eSTyw z;!@kdFa*xN@5PwQYrgXUMABB9K=IF>P<*un&Yzmp6#dSKH*dN=16YpIXWYfi8jMC} zHmq{}kdNpCMwiH7QD~u*HCqeU$xuml(@W1~D*VKz)^_uJaW zE9}x%Ss4i|ZJe2Ys{r0g`$Hx6Y9Yc5fEr7nAWo$vfI4yXDUj~LD0yYpTjw7iE=)16`!G?rLVw}$ zi$s&MX}_w;*;+jVhOu|#YgyDvkmc>ZvKAll>%_yuT*Q1JRuEHbLX==;l8|rVxj^g_ zkL`du0IOpxDrQW>|H3skqepJ7G3Hhl$bSS#pd5eelB~`eYY=V>*!+ zjnFQDk%w|odt+)&cT2djoi%;aq)~((!&b{}LsTgaKDKu_^*hx(&BoQO8P%1XtEi zWX;Je!_8W5u7Q`TtyF`L(y+Fo9#?00Ta-%cy@(jA9^yV+>BIj_VV-< zI3|JV@QioxN@eG~9}$Y0>{0&tO|2ypoWA#JvB z30x9DK}V?8D=x1dTRXv>J_U}t^dxZHpeW`raMY|%fMfDaju-v`I8sZJz@fdoP0@8Z zo;d@gG8I@bc)7d)8vV5ZgQL`nSr#nZkd8q(pwbsb!U`Afz_ekOte^7t^pViakL}rv zT?B^%!`84JjuPKIpdsc})WB@yDIWKtlUu}zQ(Ky?k^LJ*v{U0 zW%7e&DXbw}5JgG@anUmL*ax^gNr#D<^1Z0==Rc)pABpU~7rW7CYlb7;V8LHD$PI}N za2LGn;s+t}{I;Ha1`z45D{EJ1_Q^Z%oc1(pp118|6*k8s(0$l~mlwq^{Fm z9UD8$R^eT*z3Pk|bEKhGvMJR{x zdq93r9Fx+Drn*lgFrLYx0G2`nWYw8ILdGo;ED-7=7Lklr$3w&-JqkF=X2eB8FLnY} zKEa?Xo)SwHHPY`|cs(j7F&DJJ}pA3oQgd#r8%Qc^~ z5%1>lVr}vW^ic9f$q-*s1F3i=g+WPdWd`*Z2;h&bK|%SF=6`5B2U!F%WnZ^{=6ELG z6nMq5Bx!B`^ngA$d_an-cCieS#?xP0xUFI}qjA4y4W!Orcv@TWEo-*_XZxjP|HnDt zbtZeQ5h6(naX29-O8A5N+ubD+1rhA>teC3tTQnyi!?*u`U$!fpwf{?~|5+ z*K@I)ST)H}tTek4(oAZ!(kD_MlqX=`GUqPnm+_1`^_%u*sa+%z2n)fzjy=*IB!~jS zkYTt@FuO_!)}hstv~Sz5*WBuO%eCkF3{hUkEBn$?xLAs_!)opFX#5fG=W2N*H`TI` zn!Dk5^VB!-yR4F{6ZcYhVxsVBt8iZW9|$)(mla11s3}z~a`WvN|F%k@$y%wS07Htv z4XDFKAyiLTulwmL$=UoJb*lw+P^A`!=A0wTexyGN4(AB)#O+Hi*(Re zHW67SS}G1vzBDWQAZ?*WtoE6=thz(C<7Wgf;@46;Uo@ZtVhYD|f>QLBP%a|kPNF?Y z#!QL$41@866Y(#-hFF8jsKKl?ks#2_@kP>IN2E2d#@n19t=d=b-A=_Rny(F7$iwRV zX!zX4+OMKS^0LGq?pk)I&@DzYScj?Jh_T?D9D9s5cY`iDw^Ayu#^Nd5bFt3(lHlZN z9(OZp3!}CZzIdlG>vg2g(-{)vhf(th;(Z4Y=i@*LpUomOtW*477IOxR zof2_8EOyi)lyb*?;T}vlg3$#NMCEW2LD+Pu!8q1&9fvZKOH!$tUuns1wIthEqJpx+ z9sf(p8J3X*`nT{wF{HbZCxTg`fkqwm{n%U&Ml~#w?>C7~ii^Gx%fJSC{~k|jd9p-F zl;p{NDZMSlcwV%EeDl6Me4AqXas|myB|?k6SlMQ;`<7Y$a4L4-`}lWAEWr=T&pT8w z@0RJ(fLD9;%qM8D68r)xG!*aSQbu0S%TwCoFU-~MCzQoJJP^jE+|V~&7INo79`2f} z%|Gb0-pv1)i}{E6Im@egyXelxyXnr^I6u2Sk;ar43KwTvXmMT#KOY~V*rOlC<@e+# z@<}(PPxHwG$GG_9leyZ*CkJZUDUZ)`ce0n3y3_di(9Z2VfH!xKTtw$;`)cND@9m*~ zuq;ci;Pa!@vqk!_TRyLm&ujUz{UW&{a_M6?1X*R=>}#j%9E+FO1n@paiEdVMXNs#E zLiQ-+=%6q-g(_TD2nF*|Hi>l|O<-06CnC?tY=9$-a?3UZ0ZIg`ySu>*@T-S383be| zjHo#VS_bNx+3V5cF7>;K;89+liqvL0YX7LQCwc$VHeKe`HpS-ZMx)BiLbyKb@Yp_iFN8T(P%)K0Gd&uEpoRM?wMN;G-)<7!$imrK@$g-1$)sXo62x($eshGKiew{D_ zm9ZfD6B-$rQUGoWl6%ZY`>p&(N&7KzdB)=Nh4t7gvgWjvyJT%8QlLh3=!$=w$JnX8 zJfj-vfsAkNZIKDZK1ARB`S{>{#Nd+0r)!&b+@@`+DDLyP&qQWH7q?0Jq|XDf#z=6w z1Tv4ENfou|Ww3H+a z;LWTkIdnR+$qyD$A?(PP_V2xV;oFPTc&@*}(IAER)q%nTeq)=q>LErZ#%jbX7+?81 z_RL*`1|sD}m%vF|DH3fY>@t465F_U9$gJtw$^ez<@H`1P5}X2H1gj+ykr4Z`6DR{F zX@7M*z-A=07%BkyN*GUh*WPYA)`Avmtj8je_O4G{^IVa^#BDY1%;N&Kb`>R#{a+Ch z^2i2mnz8hD^Wg_j5O5k>hb=4i+rYQTo1$%M!~m%Y(of28l1NNQBZau}cI$@(i}8$C zvt4-$vnV79=-Vj8+r#(CVqv=c9xmEK;zn zs(;DuxvQ&AFL?*=WC9@r^fi&}FquGYJ9N`wui6J7&$tOn^mwWWNrG#Q2{72fYJ+sT zWJX8qXp0#w0?Vq~=!b{Hp#IuKW=1LX6fVI>S`NU2@}0?Mfvu%4XmoqVht?_i=;H55 z@Vb4X;zr)(BOP*rbBGjS4f^u#*x8F%X6yB|qF?sn&_fIe@9ObIYkDiQ2p&^-gn&X? zpsh1IK@Ss?6)9cQTew%deXlxJ*xmzEu%uY>YYRQ_KfWF1EqRE}UKBL?w5qxEpJfje zv|oAGDr^j`1D#RYvj@&vqphq`Q*#kp%QoEfcpSK{Q;8~>N>E6P#i&J?RsT^xa4Ys!e zg`Bp!jQvYiVUmO|Nt?D(O!~o_sCj2bf=vX8@Y*#L>GqY8`_KDm0%854oW+?6OFL}! z;T62bDGMJk3G=v*0X5lZ{lo!8VBi**Iv3S73W-U+y?bB8W;}@>H59&8- zeR+vzyi(I@E8pcYvpIg&ci>;JT61wwzgTf7tYb(^RBvs^;%E_lT;d{aN*W=@>|QEd z^;`MUN?-=KisQZi&IvtnwwC*&KOy=m9xdW%NX&C$sADuDnm!`s7rMg#4x5Dp?@|h$1{lYNW(T{_zQJJ?HQCpwx{)8FPZCju&V~wm|;+CqD5pevhHHLS) zw(38jHl3uCI~DP6_oOLRYUhpWSTrE|DkiyO{4P4G8~X&qI>`p4@N7MwR7C|gEXH+< zzveae2(Zd0&?l!K@JIgDQ%C^bY0SmHy7#O4+nm6+36#4sT8wd7%a$bjJ z`nMj~BVlXCrNCCqgO3@Pg2itqhGmPd;}s9@KMfmlSh%P2svKX;+b-oe4RzAy{X{F9 ze?XY3PvqwVe$K)a&BJENPCUUhLHJk`*v z6WFhcrD`96Oy}LqU!>+sZtvpfX4rxpEW3p9>Cvk4nZsb=yXD`Ut8M9p49yseQPPia z6!p2A{ATG?bsi$V&ehr`vBYwpVVko79Sok8C24J{cwO%Iy6f1=JnnYCc}M>`TPTwf z1X2I6^Ez?)wz2pF52P9mH+fepZsztnSq77A_7`+gjc{HF6do*}ff=2IXEDp4V9|K# zNW})bB_G{%Zy)>-&BqYVl2x?HHmw(31$+~hK5bM<@->KGt?gRfy^3eod3(Ce_>5N}sr%DA%BEN{3xhZS?JBnf}7<+Am^KThe}lU6XCwAb;kc zI7!=7a6c)lNcC-;XgTw}bDg#wbSdO89YQoyV76>K%&d!zw_^wFgG$k#q&D;4}kd%2Bl39JS70O8D zw+<-Q)`{Bl;9Zbv3x2J;_jrx-outHpe*hJ*sF_RXEx)l@tNIAdl~5j9pkL^B^TsPj zB&yOBlOUy=&djYXl+8YF6!)NWJgTGce__2k5)Kd?;P zOw2i{ReggC_P*-&pwaBdnP2D`wl}@L*s)X(5vug?0h>?4rHhtEnxATVHaG=ZQ_Z5+ z}Xx?NH}cfB0FIEJN$ zBEl&_jO9c7dMf1HH=k$%41o{rf0Rns%ey~P>4<+jE~2Zs4U}oQ zR>rGd2T4u3TuyI6TYcw<{L?fMdcLzmU}?O~QN(B7)qgsMJ>nT`dewR_5R=5#K5$qX zA`daRvWa!5l$iOA2x&K^Xupg}3*grVzd6koC_G#Kh|kUXW0FlzwQTs~I12rUix5Pt ze5F0Im`IKXTKi-DX~q-1^|$rPBFt|LKhZ0d8NS}gHwWK;-AY=_+pnvaKqo4sjDG^D z+P=^qeUbF9w^?Ex75SHV4i}i##upu78VCQoP+q-=z$C_u7sYf=agUQRY8Ttd<(aGn z@n-lT7ZRt<9PtBPBm_5ZV_WqsgQ;vo^fh3{Cyux!Bfip^MhRCis+9XB=~t;Q5S^Xv z5Yd@32XLmJr$eY0tk6XtPn1e2vWFsA>3<;bfSeY#E%^#*h6qMNu;C>7<}n|)vEsFt zcbb7qZ19uYZLvbKrJkwy04}pl@BUb6ez!mbNLLbUKv35x!a9$ZcTE=!6F*2tI)XOe zWBRbo7juVdk2dpdd{ez{9_%q4m+MAUcQE1_-Bw|z;)>bm?*o?mLVH@Ta z?rx*)Cd@s%N&tuOR zT8e$HNRAUW82(*~>B>1ifQboA=O>82|=SG5mvG{pb+e|w@4`rw% zA|(Wp?`CSn?M^)6&hW39>pe{KRaX3o7Aq?EIi8;7>5>eJz;j4+?&8Bdc*yQEmt^3H z9r|s!a(znq7}dmJe7fTl?WE{Yiq50u;Z0zNtF4eVa@yO>2@|^|bHd7ymzc z1H2lx|B2!7a(6m}(%7Z~QGNqnP)tNIrnhV1kA+$r-5o(JcId}dGE%z=7A_+_N%M)3 zx)w@bFnLhpI7sKd1S8RlDv*ZDAAw8_!3&#BrY%Y zGE9kh&+SlSu!*j(@krW|5=R6Oy_V-Xxt458exb(nK4Ve?61hWSJPXprp!H#B+ky;~ z7u?LB{Vj9C3rX?0aY2sI!i;LJf@irTDG5E2v>>kBmExtq zaW}L@Lcv3ewB@3~AK;HX#xZx(#M5=Qki%#y46X^?*0GV-30USnXTdTq!=usxU=}>b z;J_OJ10iB9VA{k+j866EKR}<~)ZdCpb}ZVO8bN32c+=dPvI4O#aVX zS02>$8J@ypp_Spv1~dxGL6g(o2Ej3crh;RaVJc%Zfn>gp@9^%QZbD&8=yhrlDtZG| z(CFON|8zZk@XrH;#(OZ!C+OOel^y>9t|y~N(IAR=Ang`@ngP$w5f?m+7Ct~_5*Ln8`eAsHMoGTcTolSGDO#<+XJL1LD#kAl>!H7 z`=ES|iq!J^4Eio397f+23J(H7HWO(ynZ6IgU>JQ*-rxQGwSk0dT$Qs2dB|`}xlh~E zVA4X;YnA*l{VPp_8b1FUd@TPhkzlk5?OU?%xQh3NRTk0k+I?==53$9-!0QBNZA$2g zB9Fw=_;3-z7V5>e`C`0o&oW${?o#V$&Z8;{nP@6@ZG4|k&M%cZ)5u4r@hHPZpK~a5%5a3QEUSRf5p#DEm zQ37k?Hm!(#`D3l7i>niwd(5+%yZl+FR0MFsmDKc45v=2iNW9I0Te zgf;wh1rI-)BQ=a2s6k3o#aQ)qj`|&IiA3sCwW{v}z#v9Rcc28OTLHQ?lL!xOTFqV? zKA8P<(=a%{w^K(<3MkS>YEkH1R`S{^Sk?`0QW&x!xFgsG31vt$KV!&#G2i`ofE ziq|QrR3t9r>$;n$GWEg2?uy@V@WSL~dpMS+7rwbzd9rXu*~0gigTkYUvQCGx#jt4S!+Le^I7hfkOs=(r*DKaxuck1P;s}fz$R$<#IT> zlE`b~1&a--uwc1#8A4VPRm(?2K^!z1wY+*QZ+B;YLjM3jCPXNx0$vrY;0hk91b-up zv`ThZ(TI;}H@~@XGrpC9!V?w5G*uEnj~7 zihlblvI!T)wW`~}Z@#EyO{+D}nkG$9PsW0a^LKW*WIc~2z}Qq4b4Qw4V#C`|vX3mE zByaG?L@=mMXG!N1#GCUR)$&_Z&0@i-@hon3=w8p#rFmmkajJ(1&MRHz<`uIRKP2A=bZta`ImC+A2fiMfZ+<18AD` zSFvQ9%SYj9zgmI^ebwV1o|FL1{AkJa`!L}r$4Km6=;23%1TmrMDX#D7Lv2MUngqV&8g^5ElA76->vb0N3 zv-e>5J;s9s2Rf*9;PfN%$m{WuA+hKtBh&I6a6wk_c7iLh%ADz6*r&)q41AU7Oq+@3 zW{Ll`Y0bDS3vM-bh-sMbwSh(F8_glILC(s=+XUH;vvW*I>>M2D?tma6(E{E2ENYU3 zZ`wUs8?}2%H##8;c(4nF-NaAnCZ~2!(Z(EkHFoe-(I%nrrJFzxT$w=+H6`Vr|HqXO zIjsDP$@I%IoRbiLmP;&wAc>z|7^^s}637Bdk8#+7BlhnAIC6|77Cz6Z`#V4?zfqJG z?Rxho7~KcT;`s0q{Lu1c3~JLp@NXJ`NpSRsL32t^(1`h2e7O5rq5so@?iNWgIzVp_ zof5L@En-2D3OOJ5*bX_Z4e>9s8(@;&hztCv`A;Cs7iydYKXB$M*>beIn>D8=?9}cC zV{nUZAayiP9K6_yov6HkN01jz^#Vn&b57W4JsPDRA!4|@mhagorTBKf1kNZJ2p+sf zoaL`26Y5ZVHHm7a5TRL{LWlU4cq}L|8W8? z1BJ&cPGHD{YBbu~u4mRMg7~&p)ggu(k@V}f3@yj&P!L_XB4uOOs%#YQxRRgv^gV3D zpW?4ZsdeBr>WtuKm8%`SY}3CRp#W06|y3+LJlQX$cK1I;aUQv!8kj( zIsV3*iM%8D6~A+yXQ9Yb7K%Le$QQCyxDLoiLu;j`H?%_5$`^@pAn;6XzlP$f zjl`1K8akks3_IXwEE&@FeOT^N-(O1i)r#q_IG%sHYUf1lnL6^)cMYtVJ!-{_=!ywi zXZpqmn~C#x!3Jh6mu~bS9hxkc(YuEBEAp>}k2+9q;jj6S@rkas+lV=Ba9& zfQHRfZL=ri-5iCeAOv?&oPHzkJN}>m6Si6D36WUUfD3xoL)*C=@{&v9zwmP2UiW*!l|LCJBW{KYmgM$G!HkQA)J zSmHNOnTl1M6;UZRgvnMxR1xlr$59EIpyE?%2fU++gAg;>Y-K4qWF>Rlr$lzeor-OD z-jeOc{Nd(Lw5N9@Mn?#09=t;&W0i8HxRwUL+?S_p&jl86hRFNm{G!f3bh1R)-W%Ri zMI@e`2oUf60A<8G>XC8*Dc#)p1Kv}W zQsQ4}5p?G0GJs2#%0=`ocjcdEM85&T1&YpTzv-?4BB|v!sK0i_n3a$EJLEg1JC>4? zky3tXtRow}9S0eFWxDPe%J3oeY0gyQl~pVxMp>XN%6uf9_dt)Q!HcIri>DkaPxVJB z$X>K!zj?U2FDC<70Yz#FQn1k$S~C z$+Ff<(!@(U?_n%68w(pM@1$`#$KRYMF&f zmwez4Z$lH=Qa(T6ZkuWber3m$<(K>v{oJnP&pKkclH25fIZ%`4RL>@T@{c~M$f8sq?f9|GKh~E4vP8=Jq4{;JVwYUS z{Bjs%6|5SI@Oh<%dWR+8^sHopYXr-kft5MrQxc5hDeTW?=EFKRM(v>u!t#t^<5`J4 z`6|D-S1qSS%7M&}nO ztMTIiAfc8Gs6=~O`R6dE1I|KnOC-)Q?Q@o(vLh1OX?`)`h*2J|bdXeTm19Ug;D?wy z??C!kGL@$gEH@p&AS>psDfnxrRneLo|qE(x7^ z@-wZt8-X!s)~+&&KpOTFg%qjXbL`HL71a27?^e7tMBF~*&k#O3&X}>?FP?%}-Hn_E zt|X$>n0KU!LmmPuE4D|HX!GP?l%>J=m_9BQr1qsGxW)bu7EIwjgA-w1!-q46s;P zNGmAr;x42xpE*vwXNe$B1MeK)skl za8eq0OM)kNWwSG@M62h`xc0OGek!eWO}3d#JKn-%tY;$7XjSF@&u@?Jfx8|IlWhWKb0hioxFT zFA)1?5x9vh1L^$E#^N>j^BFTu*lX zV-82_Hhy17{Bjanw@qkqiwdp>^i0*)Szv@jpj1KwRuHI6?i~TP z#LTGfEGtrDEnp{f{U?9qSY`2>AgR8~6p6Uy@X%$5SrWM7Sptg4`krjAkup{C05w%1 zRWX{4-VAud8!P+gb|`8>$%AMpswQ*alKYB4Kg(HUQs@Inogk*%joK|cwL36Dal}4n zP#KP%(7tzybHufD3Mr!Q%I5B&Ha?3JD#))0Y03J};qd2Vel~XR>!8 zu6dMcoY#Js09tQV?c9^}d?qlupm|EaIx2k^a;+#?>v2f2O&qGoSGj9tUY488qc6VO z7d@6GR&TjG#5{5x3!&}~fAQ(h(OaQvE~mn|`C|QX?%nlV$o({bObnA%=hrh9zg*Hn zB0VO=?`pDS+!qyJl7hLCGk-Z58N@L$Vpg4752@qr7Y3*(1>SRTLh;lPigtIz@|%+~ zMgp(7%_oY6h;jsOl}~PpSF^l(dU3RejpD0WYozA$7GSqzXP4M#@F-iv8WtRJ4x}W+ zp}{64auMhH@})}Pwq1l-!>53~SS@lytq8EYUUC!n- z{B*W4)(Ht7XXv=SJMLA&W;F}P@JcQ5=ZWV(MZU{~r_%NRgg43q_l)v^b;2eS7yKnf zuF}m%b7g6+e{?#vX>~za4|Ag|7uMCr#*?dcMs%=+p%?B?tkoGRwp~4HxD%GOYC-yn zvy!$}bHDsA7Ghwn)?l{ue_E^jS7?VEKb5nzlZW)zskItK?LwSMu9d=vlhe%a|J(Ii zAnWzzWJL+$!MW?@FMeaPwNfpavn6A_zJrN3-d>?#rmdIHUN7BH6Rn3EXENW8&@8+1pu64!#Z z{Fg8wU?pi`7laTF`z^$K-!#tbeGjQ~vL73A=;Su%ON-Z2A>DLn?oZnPZnW<`>J7dV zK2kkrw>+)%_*DR@Jm;%MbnkmF#Ys{JAVr@uTH8;#OFOH3*~Qc7sgnNtHQ9UyQh`Ts z7Y!l-GJ)#~u>gIKzqn;A9w<}g=e%=W-3#Z}ZvS!cOW&IFsf43v3Px?m?6YpJ`SnMv zif-J!s=T&YGKevs0$3`+ow`~7sQuBu%B_~a^g!qZkOs_KR9rsiq^dNtOjI}Pme^(7 ztIBmlb=PNYlv_Yg+?eL0vt%`K)fl@L0bifBBv<07-uTQVZi3h_DH5;lB_rNQBoDE=+_s5FVWfZz4P<5yr;5a!Vuipd+u8IV9Xb*qg}HL|F6>B^@hBn221S^U+``A;8SY+(e6BN z_ERz~f#Ad7BdcU4pe`Rk)&Y9&Ti&3^WPUG_|l%rcS!Q7IZEbx z7!IPX)tp}6JCaW{tGvm43p&YX&)jqSQ}uO7J~fBQd=n%|O{LrmUS~&m(eLs?|KB35zlIN}+q})>@9g}fR zkjn+dC%ZA-{4!TjytjIgJYan{@Fxd(f0E9NcDh8o*4d#gtpVbVF#mk5S(xp?c)M{q znirSBG-OuQg%<5QFOJ{)8{*Zh5tY@%<2T4HuR zF`)X^Z|p`&Sc_auqiD80<1_t{66CX2dyPpPDSu=P0S=TuGMWI#$sZ{sz+v)73J7qN z{1M3blQ>9N%=MY>NRHPS&;Oxb^9L&cm7f25H|v6BFZ zP#+SAZq4m-vq)$qE;v*MTjPj# zF{QIzg6ln?A7G^ifS^BnkG86Rmu$6a&Fv+2mmt2)e^2%Dcej_@N$~EK`uO+l?!t8c z8$C)zsBK=i^r(ZtLFrMl{rku_@1u;)ranq-m1w|RhOL7R(f_=b++#I#FVy?^sbuHIyE>Zo_;YTx{U(XoK$2lOLnP= zbzb^-So)Y$&pLsYgPPgwZ=ubi@NtRw z30Wak<=N$@zDcKHe22OLD@M>;pS49jpm>DlvT3vJvL21S`4R+|;1iNVj0mF@kKWi4 zm;L!zY`yyYs6AYaXD>Y|YK|KPL=s}HvY$OnwgZ&o2l&=~x3^dkySQd#qAFKH@jB_n z6!Dz+B^S{K02E4`hN?k6=l|=^He}F_e;uj)0&4dK-BKSqb*AZg2F%EZE?&RhwWK)gwR>dx}s>vtxkYFn|x>4;Rr99^_BK1e!eu zaNd#=J?#=qOgKz9R{$_X6Cq(T0~6iZ!{+~jxl53Hm1zR-4en zT8E3i$>GkC;l9By!Q^vj6HtT+v@UZwmwNW2LzT)uUTYY4HEg)y(S9x7{E|@D7=s^M zd4Iv)i&zf|f0h?|6Q~<9YO^0T+0dGEjfkc1cfl|JSL6H5zZ%~!pZ;Ht@3#NV_-3OA z^kYZWsLiR7eHdFf6I+^YM_jc3e~gmkZ1jVEoE$1FmF4-h^0m>+01u0_wYgrEu8ow9)hmcXIFei;&bdEej?MLz+ zyN$?ndD|1_gHRMVo>st!Iq2ix+HaUh6q%0{%8_CunpcrmkrPw`VF`iJq^TA%7LZXl ze<}H~sb=LXnyhaVJ&TJNl7AGI?+^Qm+x^CCWK$>ADpQ&Kqp&rIgwh$5Y(}e2y=~nB z@?%$_3Sy{P9&DfrGk=PiNNbsGcF8uNc*@#cm%JKDh&LgYW11Ra#fPQ z2ur@MB0aoW?l@ZeR9n6}R~E!xKp^3O^>Y^|8Et9>Iwp-gKdnGZ17E^8AGYCP1Z89z znZ7|NC}kJ=g1=N4opaAig;F`F3AU&Ne2iVZUc`1itKG|LWcJ6K(_hFl+A()(xrUBy ztr+gsw&G?Aobtjncv@E&B%~qPehaC_XxrO~Ae0e}p2`ydaiq|Sh#k)JYmFU#<1Gp9Ees5a=}FjQm~~Ka=&pwE(kXZG{&4>{s>i+b4I;&#K&Eum>^;*!Wz~C+mVR1w zed%7~P~~{+h6eU`mkKyF0N-0v+V`Fg_fJ)pQ?vl4a1|uneQAQejOn)C%JWM1YJt7R zfxY-XR$6jXt=tXVcdN}WZI+XXF0c%x^c}74fPiw*&N0SY(bFTX+>6JySLA40+hrOC zsi8CSz3+KJZ=!vLi~}gQuh6eO7xP6wzElr?(1(I5_$4WC`T(un&JHCl>Mm}_qRNQy zX|4KeFL5z|c{iwG_BX0w9xLsy8eQ6K9IyOFX^R$U>Ao`2e``|D-oEhZF^Ta-jcwgu zC~YxLGp1%N$r#&2y;=1h6GpyZZV`QgquPb^LvE2T=r3{&BoL7lF&>`CB3qA?-1L-O zNy$r3$&-})^pt!_DM(K#kdzVWDI+9BrYO}Go6%pC)?on8Izte zMpDM5r;L-7lJt}kNhwQD!HB{=VsB;gEQt84b>o{HI7QU)8!r~J2o?8}AheyV(4B}I zIUky?*YssoO!2jNSSjFdy~V>LAwMn$Ak!l*xm^ve>Gx zH>rO0f5_46o}a#7rA{raanhdfzxQ(QmWUbEai3$Ou z#=GU_2--I>=Is;4i(*UHDHa7rIk$UFBrbU*tTJ6Um&uh4x$h095I=m@`bkm&>C%9Q zJBuHH2UFpdZqt(IB{mlNA)V9erpuWyEx|C+DT`~?k4fkP(na3RWBx|!Mtps(kZvCB zA+>8Vk4EijIayj=H?NK=RezX}*x5o0&@H;kSd_7RA_<{AGEqKR4dwIh^xA0WBVfmMov*a7|*>@6e}IQ|6q*jzw)EL~{}_K+w9>wOr`T5z1mzQ2+{ zZF4*M1!r2&E;+zA_EG7APb3G}!GdQv0}E5I%g?p0sDlhf;^!)8=YfEkaBmd`Q!?)@{wq!di-J zK_Mo0Fkt}6tT^h!&k%ZCTBMX!Li|*@SC>RA>lnL=x0UXy=9b*X{aYAn6^~%e?$Z6$ z4WJUb02hu%`GcpL6`|*tRu6*5;rFuxMn|By(~sGN-b1r}+E1IA&?dLv*pBTeUM1OS z_WL7D6RpbcJ$;-Rhba4f5TMi=C=(g72J`lS?0sKQ<>X>0+hqTruLvft;N49B#R=RY z;VlhNj)n25g?V4z-N;KE;jR)U&hn3h%z({i+XAE3m^+Dw>Y7TTDc>^9+L4!%kmmhm51*CNE0#=8UCyon%k+$6Ja|+vf?-E@dwa z6ncSHNqKA_uwo5Qa-(N6iOn`au+6KQow0?a1QiruqjC+;yU>EMxt_@93%)M( zHD%=UuPKmx+elPIL8Q%vhZtJO8@&d&q7gUuiF$>e>0bl%(Kw?yl}1zUHNYs12|Jv^ zPiU7kAeqJ)30eZw61whQ1H9815c;Q@3CWkgh9oG;5EkrSw#w6E=05p9kT{KP&RyEl zx!eX37KC+yz=?r2k5Rd%T!g$KugWS*egBNaIY7wd-JD6r*@o*5FRFp1SZ?|Z<7Wmp z?>4Re>og!cN_G}oT)=XSx1_@h@|A6Z-9Lf#C!6l|B?{ z;H-b@Q^A8kfRfa1V?4MJy?~SoB19($fCbS90-!*2fdKfAu*8h~y_UqhdBN4nq-2}(&O{lLbDea7p`87V}Pe)t2JL>ctK$`l^#F&hNEZSe?n z1%U?mtL`u%^%je;O9Fd_VXuWdd$0~EHw`jKUT2f-Ku9+qpG6I*=PNh^O%7JiDkE3S zf_MV@`nVua{4N*N)nhJ}2Dy60Gta|<%v!b`Q&oYvN|l_z$+l~RnBq6OFkLI{B2}Lk zI}gNrEFR{hJ-({6YnRbN%VGtw$~d%!#i~(bvB0c+5h8>9OU!8ZcYVRd(rrDwWpNF^ zPOa`D8qk;71(vGfUh75KR|-d=JsN|bA8RoLy8KT8H>gAnrg*#0YEV$8wf-jg1;zhz z?6TjBtkjl!ZE*B)mD9P$Z+sZ*e;VY{uH3E{;(bgzEXqo>f`-lM*x1#odf8iMT|_2D zHx>&}jgucnF=*6d0~_L>xKW!$3pTwaou1@X{=h}a>ZXLU6~OwNJh--+Zm*~r z&1;2PJ$LxiXR?vLaohZaH5H@jJd|%>UYm^HO#rTgR#g$&1Ykxvo6mrJV%7bjbtEMz z{-=eue^e;oJp`1cGMEU8w{Rb+=g{_3pC~ndA0{{E@8^#)uU6s!+I|2A#b@-Q`u@-g zh~#tERFwSdo&jo~+q0(sKYF$n4X6a~p@I7vCb3rc2M(HaxIQ_R$ciWs_WKIokg2?1 zO=W7{P;ac7uBH;OS7kjdJcPGpDmw`X<7Qq=V!|R3rpbMRl58W=B%k)kr@u--K9M}X zjj2?VI(K;UDN#XIQ(EHS+XFk8*C_Mq2IfPQ`0FY7Lf8y`S$=G|1~7pGD21?+vv;;p z8Cap14DFS$&h35ewI~j0^54EHyzDJSQZ9XeTA_8Z;lIgNn_gW^6<6uzdUZ55-_j== z_E7A{BRCZ4i9!OuO%iLi6v+(+wktQYv?-!3$@9pOSzq)%-|6v|qIcya8pmTFQ_vSo zoLFes4?{1kFN*OMbB&$q#OES|cpKieZG439TgJU6-=jwgL53T>(RiWOFrqa2-g&c) zJNvYTyGxyR__Tzx?C@C$XWQX^t)a5i6+J@!@8I+ip1@FVX>;Y%R9#oprJ5cV#Gi-Q z%mPZYJkH};3Maz$3nO7+^=1bkZ)dz5s!A*AoneYyG+{$~!lYWcvmHxhDi zx`zhg>VQE$B3e8}?8Vq!)RMtL$b27>zg7NDPx_3{xDt0`94cW!9K$I1k;MY)mdHG2 z9Yp<)0;yZqMRHt@1Tnlf_EQ~{zbOk}7G3&MOIEAMsV|MlE2oF!S)ngb;5&WU0|joN zK)3GI8URi)e4l;YN}5bnHPXOqSd$Z>iB&&;6sJbHdOR!4HXbnhnLp`-ZYh#Z?mPk}JJG?N<0ar>^@gP0? z8IFe1=#$i6fjQ6Yd1F#le~GFQtf?qM`0mX(4Rw4P7>d8GbJ@EakF-tKYJZZGlo+_9YA$;a zi&|IIbDDhSxE-lhe`RNuDMru^A zP_k>rS#AX1nv5GE^FFBkD8}Bwrmtb;#|6m6N}^m08;sP&V5}O!7o$ya5v*}doZ&vc zs+MB+(hQa+Pq~b@!teHsJ!vQxk)>~yYipXFZ)nT+E1-634mEgJW4Np-;5_NizV10H zFkTcJv#9afLPz+r@LMNh=%sQ?g)uJ4GvY;}*t${nLf?CG=Q$tMmzCm+G;${EO0k zD^#QWv?w_s_}O1jX6$k!dtgpkWfQB02~;m0UAn&lKgruNu|WFDuaNcSH^=@J#u?Py zW|v;OLope!-~N1}MQynVE{tV^UYD1habKAAkufq)$|5gT)E{EL93-rU|0Nx8O_a{r zUOI(7gMH8uv)rZ{h{O{+Le1H_>)~ULn5oBihmcNEjy+*zj+iA5pTcMJLfdV-ztO{k z_$rMI@kc;K?d6L%d9PREVOr#eeDYg?8l@}IZ;MTtmTVKZ8IgSyyYgMZV+YM$GO%MW z!t;e}wlpIOu|GeVu{Y)6%GjUNlyL++u$;jFbw8#I8;!7Fs9IxK?sHHG*h+5e8bgnM zmWLU`n7i}^xn@F`uyL3EHjiM%RbK1m6$JD-y)j<2u{*`D+ihQSVkO#bs4U4sdF30N z?(6>~NDDR!So-kG(hBB{hW{29AzsZr{ODqStzm2J=&%DsQF4atAX00l+)w3oC$-36 z3hU7$Sre?>M#B`e3H|8sP8aG=n>ou4#qrVHyQq1K9BOKQfT|2rkO;5wn0k_s)UD8{ zJ(q{s8dl_VIl6gXhmDfJFljY(0nu!tG%Xit8ecgqXw&_))Ev$sG_)lwNTK{=HUv3q zXkspOqa{|b8Z#{@ zrPb{uUC0B=n+W*eS6cHSu1E1*?+y2#w;&fzEbvpP>%aJnK9JAax)wWUV^4A)v@B^_ zX4l)Yq~=%2Q2DdTkYj5y)bx5XRP#U6ZI%LBY4$6MRtSWGLW$3wrP(TcI& zIs0XbeAde0g57%&x=Fu3TNpp7wc8{U@O%b3q*a&DVKvQD4+)(| zCF)4;F?Laa(IR4Lmd8=b034j6LVb>U&*envrIT{On+Y++S94b+~_Y#W%zK`C8;GtnSS&3Uy!0{3%yzaKyeE z?jKt5m99g{j|c&g<3g2Dxz|kaM-B6S+BY7PlS^B<(f*;EN>odlw&cGk{Zh?Ry7${p zwD4oZ@Y!zO0^R9QER0w{a_r6>Vt^<(-UYNM6BB?3TR)y!x(iw&GECZ*39*M-H=HkS zaK{y0w7 z8K+LhQ#r(|N`2NEl}p}msDz{qyx$Xeqfvpu5ZU#r639KVA5sB^K`P%PxAX#Hqg13D zbr)39m^?m`ie)T&{J!8Mm#_8}wS!Trtrv1+WG7D6wB-j`2%q&-4aH=SSyya{C#MbrGWec-x(xrIx7Ah3a08zus%zMjIOFPgt>*fEXmuVa)+Rc&$f0uE}Y+g;6CJEWF6!s49v#jok@D{_p598~LUPzXfM-a@#BaJ}^IQ zG#OrEqxnjA3*C>=+xyL4Lr#J!&}ysvlSf`!-Wq$R#)0@6T+2c zXC0v{yGIR_lA-JXqeg%xj1o7|)c57uXC>rVU*n&@3VXa}M!tn{z7umGY zx*~aSIf3+Mn$&qGP;_!0+3v_$p*`)Z-66~9D}6<)FJ}2g;L4sTa66e5T#g}n2u1o# zKU@D)7S774j14A7L5m3Q$c)H=Kw0Ofay%zfa25pxJ?RpAgcE8+@`-hqf4^VKOAk~I15K3OfV!0MYmj2&gV;M1ku_xmOKyGdC_WuVsMBlU zM|7*YD{x#-R<9U`@dGcaoy5Yat!4Rda(Q85kRfrNDoPS_=BW6NbgM<}ed({AAuIF^ z*&^?8NRi@toV$q$o&S|J}QiA{oKVX!!({olj@?wl1x3TpsKZ=8g z@1*y60|PKYS2hh*1Ko<^@_NwpXfn-;S^l%{s%IU@xm#lzBfx!sc&H4sC5cj_|R zq1ER~uD--^1TT^KpffT%p>OM9UdyrUSa}mYW<+3jq)pTyEKAN3m$J-f>=lf)CK~C! zggL9DfB}0oqI%}KiT6>GSc)82agxX>R3OTnodTph*$XpUT%73UP;Q5SaUygnTKnh9 zLbfR@nmdqAOl+)0bCSCVvX?J-i%3tkAxZnW9qBWU_=;Qn##ubDEAs!z*!foK@WBz5 zMM~5~Om-_S4<@oPBeF5+mTaR^CMFqnCjzG=U5zL&UVnzbqO3ZEM#F@C0vHjsB z=IPGNNlNU(1yj{r+1GHFm)a2zfO4241{IfoOX9do5rK53_H?!u7OfatDn0TKf?XGr zB~e$`5W-Ayqd@r(s?*hGkYfb-_Gcnyf(sIeB-tT`g-`(?+5WVwDqS zbfSrkKaZX&uzM1JR{YQDx1utPg*y>Fm(Q`UQ;yplV{Nemom`c;;j~`<;a7z=(I0z- z6!BB89tL(JIn6vu`HTxp^R){l`;;8h+-HY!O|!!e<(cN&b|~L8U1(E~ufQ}Nc4&lY z=GdV^)6BC&MU?oW$~W3H+w9O7({$Tk$C;0HQlHki%f7d%&TE>R>?Uy3BVr;$_<48) zZ!k(0Q>F<$Nl_En!n|MS;{Rf#(QhapFF5FZMx2%ZRgpP`CA_;Lh5zf}YPSP(pe=Pp zC3HomK*DQF2f`oSKw=`j4iHQJ3G>SMn+#_=(&MbMIq2t!O7Y);!C}CL&-?HYp0mt6 zmwzWWmEJOOrc{O#YoxlH^y}egG4~j;SBdM3PFzf0bF1WyeHrLp6z=F;+Y~8fceEoB zhPgW^M-17bVpLc3HmQ>HBl%iR7;dyIYgXtQ;os$amlcM;y_V4^tP{J4vFVF3U}5wq z!3@LhCmky=B9%Pl(l=S=&_%lW5bi7CZBZQnNptskDrE!L@p)i!su|s|zq^0@>ixP| zor9RmlfAYl^ggFDBC1VA_E70viuFaE@<8z4Rm;?*YRTuaZsIMZ{AB8x zkmoiYMu}qw$u-{KJVD1~eSD=SDjV>$T$45d=ENc+a<@zclwKj`@ms_X&5P^7<$`G$ zpJZJA22w-iZw9mLj2>jNQ|+WQ&oYNiAt5#CK?1Mb9VG#t^d8>N}EYs|l&Ji6_Vn zF-s!qWvFdg`xHSQh(E{!akY2OE;a8~eXf^X##7Ov+hv@pOl?#h8?nzMtG%Ck{KijK z7*7dFAYeUPR7WYGrU87|7mhn^Io42)u##n?urmU4jz~?Dtg_3^#|qiPUNcl9A}P6V zGkxkXYmsjNd4dpME*F9WtEBFn9zgah!Y|jz>8~1rnYI;ri#tMu3LuaNP5I)*tXgcm zS$DbIZsU!*%lGjMo^Nliav^2do2$iVysg#WN!K~`vQVZPhwKw@pH@!0Yy)SL)fpgD=O~I2oMZmXs7mtqD*e55xQu=AUD3pAO z%0)m_I1S1BfM|Il+9%hK5yDps9QYel&KRAO=&b8i)SJk8oO_0Xg^8$3Cf0Z{FAK;n35sH@UI6(Y zSrB*eUYqYyx?P*vkz8AR-RpDKtJRmaf3g={#b!NxW0u=^aXLeg1E57#az5n!kQ=k^ zJtB%?P(=Xmk+SjS#lr3-Fz-AHY0H1jp2f8ujD#WczYHq!RKFLOTH)VA9>i3|okD2| zKS=}<)}i9vUfVjjH+&?!;xdu>PSSe-_S}{OamGm^ED~=C9TiMszFT?CQuBp$gBQTh z%2n^PwoyMZ+qmg8zkU3k<@YSV{n|$7Y!Eu3aNC}n&xZB^;X^?VT_vwp0b9u#8mV3> zo60sHfIMG7&uzG)6Ook zCewK70~D7Hj?}!Yjh7_!@a3$PzNt-llj-v(eC#g2M&_IT!Aelf0KiLyLup~INr3n+ z?h!bWP>=S55h@R!%IOpk82mycnDI!5W6v$I52^%9v`=CXFO8WU_Zn|0Z*`{-H;(lT zcY+?@vqg7q@5*N@NO@(B^?B9_MK56rY2lY>Sd8&}Mh|_(yAntRP_=B{71qSl-qo^b z9v02L;IuXIYqf+=1?_ z}&^7uaF$)jDX{^jS(neG^|d2pV{KPFh5$IoNlApUHpca zs1x^2SPF*~iWY}BkTm#HX&~ig^tT@kA8|T+6O#=)xXkCnS&tw4&-Z$ZF?M0Ku{O;A zgHo6?_59!r{8VeKI;}NMIqN)S>~24XiBspP*~TPXdQRd0cb&V9Q|(>S!fp|kQf@`% zgg5nvngP*x-j-s_a$543CXT1<4;T2cu|1p3o;dtjA()|C)HMb@dlkH!#HkUdxx!l# zV3`f%#N31?Ft5DoDuv5W?gZ%N0Izc2YW4RIlMCA#tu`ZVB<@GI8On1H>CqxturFt~ zcz!Q;YJHJB>T&S`J{4zy?7Y3P-j1c7-;X`1)Sq$LhS|ayzmGj%By^mKiWVrxlm5wz zz{!($0&0BsS7vL+nnV)qn5eo8n}vy4CBG#~hF$lu{b#QT%z0gagUP{_xeAs*p&u>5 zoCRM+Pyb}sy^<$m{z<$;5|iUk$b|kAQP7G<5@Mj4ojBOWn<^&SE}}OQxO7OZ9k`-1 zk@B@8iNJM7C6LiRRzE6IO0DP9FG>u1DTFTbRp;P8tGrLN8UL~8kz=sQvim3LEk{&7_% zVM}n{TdGVOnGm$3OsAB2k7&}!L-$|h2ug#ff{Q^4u~#q4S|kI~_eX+zoS_=tdb2cGx7G|lYTrYA`5mLY!f zMGEYuz)rqon5md|PzrD_+2W(ZA% za)S2jx?BNiDy~36y0S3Noib>~j|6j`-qw>k0G5$@u85Xh3?Bo1#5!GQ50 zI361^l^=fB*SQ~_qX?w#(3L{Rhiku3jMcXOPb}-ij?z0$ZNd7)z)agV}(F z{4oN_`>guG(-|rX0dfrq?ci${Ff@=(6SM&IGuY}&PS|T&y#jJj60z|zU(mjZeBoE1 zo_band22oEU_XIxysFjjW79a&x9hZwojOaRA%5xYYVo35=1OR-&+g;v4vM92? zo!sirXj}Ed-nMWnl9&a8y613n%2g;HqMkM74t%Hph($N2jxc&eXJ<90F7^iQLxDro z25&^=`ATOSkO=gBfk;C+`qg$VPwKt)dc(cf8hbW>lRh-w&mYZw0G)4<1I`t|?qua>k2K*Pb#!BPvIi z?t)JQR9F3-+S5x&*|d~D+LX5LBDt;x_J>NBjJ2mFNA>xoyEK2hvW>CYZ~Q&{a~CK0 z33@27pmb%jP15UP{breuh&`NnlWL*{8#N0ZMC1BGnR6nZ( zl|g2zY1*y&t@s&F}oiZ_3bbU;c$WL$v z1T8V)4h5DPPAM#HnurC!pTPElGV{gCnW2K%bKitLYaH{Kx4V?J#z$qh*oaTKC(Bf* z$dEp5rDt8h_<(~Xz-9L^E7#FIJo%pRpq11t!p-NER&KeFUgx~|Z_Fpa77Amm{FzbC zSG&J6Fu&ogf>vc4+e23%0l6ORo8TpsHC~OL85!-q%*k(>Kep?)_Awlx<%O%qfn;wh z+~w9b97i9_8M>I0vD#>koUFd8Yl%z@;~#HUJl!NG`(j*8z%a{wvUjVXZN=MRh_h|( z6Wxr7uc~p%8TSTjWEIEm^p);dG?Ic9!xfE_X;4?drXrd0&>+R_pe!p^BE>K(rW+l= zn6XQkM4<>UiS~@a(=6kfl79pRv{1o#L>l50`%t`3qWJO{T~UGsVSc|>WB*>a`rosG zL4HH81tOSxMM2{Gti<<)e3zxLo1;epr@(kp7nn^WxcVuD`Xz6Mm1?WPRj

W;}9; zWn2tW1`{rUmUuA`iGKY`b^B_OLBv4CQvi_hH?=_qlZ?WT7>O~T5`>i+R`Vmw9~-_3 z%y~oZj;X;d3O;cnfUX3Hz6Vr)O5s3fvKL%}3gay{Jr;kaKS@7-zT({(_dBxm1)mM+ zb;h|W3;KujJ5NeV+)f!+z(a(^FXu^L>7md*P!4?CUgmcmRLDk+OuN=_z2rsgnY+#C z4;`C;o`8C;hV&yOVBd5;o17OwJ|Kb&WWv+Y6@qW@9tn8{U~N$iU}VKe_MyvJalU*g zyO9qS!xFQYxIyhHHFKhev-NCL6lA&~kLu>_BOu5K18UA5`)Bk~P#9jgSS?8rvyf0dy^KqxjTPo|pK| zctVhvSGnYyA}){SmXbSNfbRE8lA-`MX=bRXG+ZIqn0!6KSD~j%I7wMg(6!~dazN=7 zd^U0|vRKJ$5n@Dn>i!+4tCzUtGF$6I4xC(@>YhY$?6hoHD~}cC(RQk=Wh0%AuJ`zm zjuMD@CVRrM&-s%T0qcQ~1F9;{yY9ieQ&)ib9D7m-(puyoKua7)EzhCW4h-=6mlZ|o zy1&l1kMy50lq*Mg2ESd;kypB{Xk<2_AW4K!Pq|He5bWkkBt*GWbmzeUuew~|f_^TK zGCQoo4{6fOAs}e6+ss415M&gUE+mrj;9j9V4SX5;Y1c2v4}L01PkCk3BOO-dSU6-% zgJ&tmZx-s7`WXG;7v<0D2%BErlsif##A&awB>)1Nd*fQc}>NO zMP3u@U^_ATE$=*ryM&NwQ@3ZYXjz=1Z!Z@5HaQ$Ei&OON#X{e<(^B;9#X{d!X*b!l zYIH!USCHM>W}CjGE&5mfXiTT$K)#{q8g@NW{uNB7hsWO(GYmBKi!9r z$xyWY3ExXNVGZn9><>sph8L~LqR6*HlJm+PsNQ{u%2f*9w_o>q{oAog)SM;P_qM9v&kHl{)D(Nt59&{QH@^I4H~t>LSqyr%zb z^>+r!B!~FUtliW@T_fpLs;*yBSNKf+{7Dq}9x^=3<0bnUra zcs8_#x2AOghU6U-WKE{ACdtZ-cVZKyYud(%mmp}cSlX8Xj3D34w0yBkRj!7I3aPd| zn${bae6Tl_qv|@Psr4Wy3i$>W&c!yJSm-nJcO)B(?L${Ob6fqD*>KqNhRMa@cS0IT z<^Dansfj~lES9;FzI}yEGtx8FN|olINw?W&5PmUw?wR_1G4qG%hxuIn2;|#^+H9M+ z@*#U<4mvv{b)tpN1D(^O{@`wMd-ROUZ8V|N?k;Uw^aVL1P2Lu_Gx55+SYQr}@$@wI zh0%e2iO+Zs!k=Pq`HJ`YjkhBQjeAyOZSDcd@uFO}B3H+c-*`%(>8jEAx)FCix^e=8 zOSfG=OI{63Zn#$j~|-Y|jzuNCAHi^JlKmW%od8oqt@C z-jyWCIP>>O?1cPzUy`5(%|9uz4<&{v)!9&9jzLE`P1yb_b;#G*t$e|_{b{JQ^5wyk z(xCbRx#-w&zU(LAJ;~Zh0)&{;v?wNS?jt;xO7Ek%5PTjuGh6!!Rs0BQ@{drGo(siT zOojdgH(=F29>br>h5T879&z>cye!bHx0ge0!dlJw%t)X#YTmQDVhW8kaT%rGM<|Eq zLP?$lap?Q}x2HmslT)*xhC#~dUC^+qbHh+)ahlLp`O5#<8UZ~mj{s5o4RnO9L3L2J zv<-RM2Cvh=zLU0LT9&q$Z~Pi8vi-pa(xy=x33>cl-xb+(LA0+VH#-j&d;g@oRdkYuak zILvGMfU#D+qB~zvLg{+xU#n2-`owLtc#PM(C#SXNHh!|sd^k7z;hfR~RTtTLy003* zcg@N9*^~21+p7lgt@{FV!iek%1$YTsewZ=nM%)&)1f)WH=^LeORT^ICFkmP1h$MlDfOPG>V1vPL58kZ z_>{h%-Qx3y&9D5b-vi_GRe)|_n)Rl-k2nT?EDG614{at6tdG!&Kyfpm<;zrE&6S3p z-LNq3Y<$jkzcu`ixXBTj0mYw;92~E07;%BNd@Hl!4KG^Z3|%u8f&=7S5hVjU<=)Yj z0}VJtD#_6$*HGGiK_(#M{MiMna$b_m-9xY|9a!rP=GMYCJLz@C{muj0hTKx;tCG*< zsLHeRU6fi6JHNlyWoP4X@_09go)M7z(ypH{AUlVP8gr>}r{CGGZE)o{x4TOZx;1}4 z+u@+nQtuzaxc+|o!}mkBm60sGjt@sRfeu++@F0zHW{G@Z2ArT z_ga^3c@;zvo*hS3&DTWpffqsAKCYPEAR|n?fJgk;^Y|~S6i>O8SLpHAlk|g(T(Hz) z4@<82>!ASAB88JWl>LiGIh9gLOQc<^;$ua$O$4%n6LV~nDv zdBdEY0)CeBUV2tz<2XVO4p5nAY%C$>Y=-Ix4bG(0o%|;DVot}t$k(L3+U3$S5mve0BgijPRZ4q|8dOf6a&wiu?lv-o@VMZj7=K$E zTkr?jY6>_2%vcpj2U;@iqQ~}sZvbe?kjI;rCVmH}Qd>Tm-3Ca)Bnr(*=3|0cwlQ`9 z=J}xgz09K4*fgj0RUi~>JWW`dJ5DbNII0HsMdfVfUOyhikn8aNeYpW!*llChHJ~UhJHkdE%%VV z;=a<;+LUe1o|HVg){q@;>OoA+9~C371uRKZ?I|j{@%bC8F%+@%d`1)fe;Ung2i0iS zGnzo@KeWidv+F)L7}Y-+4`klUa9tzr0+Yh)ec21NvABj5y#D6yABiliNUf71tCMy= zgD!qC+L`0*0nY!TGZo58g|byhuyg_qaF>zy#`^TrEsltonG6wB;2dc;5E z+yeezK3h8l?D>6|h8XriO5uG1?-Q8Y1B+0MV~Xh>o5Ofm0>thkSsAw!6F-Vi`?2s7 z0Z(o7KL4W)AE2#KJXQjz@?Sg^HY1|&Q`S``rcSO%Wu6k_qsly`_*wai7}%b|pAnO0 z7r&}C9)#@nR4Z6(pOZXB+gSR!4~Qi+!B9i~T-H3iy+8CazJt^ClZAdF9+5|5RUhMy zGP~yR$Gma_UWC)aPV;800cdr%%3_;$02-v5VYN3t+;*epF;#;W*ubA%I&TaQK2{i?P4AIM-X;kCDC}vE1kE zH$qs&t61#9;@;vs4B7KV**`>{W6?hOf)QW$;(Ww6_|hac>6|@=rvs?`yVN-;IIe9{ zu(B=ZoRY1Rf)#D9NkMlTt!0#at$QkEw{1h>eqMvD`m9hl8nhv*<#uaoj#(}h7qPb=#A&bKsgTkUC)>r_G&T&0E%y+!iQ z00TVaGdg1ZyX7Sv^wo*U*QQg8JkP9gH;hg!5;HZLnkQT1Zei3Las$CKoY%DYi^Y?R zJuNN9A||YILtcPCXx#Mqi^VRaJu`iVhdFa^$Y!`vtxIFm$F|M1-^A2?JY9CwET3@zZ6c>{LEBIG8$@_pSQr+0vToiST@3 zO`8wlA^i1zlEK zHaXW;0Qn5jO+oin4Ga6~Es%g{pj?zHH@&Y`eXJ+B>K&nBtoW>ysDG^D_9TRnn$H6Cj8=W=Uf8t=UIw^m-wB^|BEai$9@N91 zW+OLP4`g+K&X=o6uw55fx8{bgn=2#ntjE2 zh(JEdN6^70h>fza$Xygd92AE!@#5poUGCy-urM&;dC7kGb4d zx>zOMh<$6Xv~o{tqW=NoaH2=tUfgwy)wVGrYSnC**}bg%QiZgu<2Qh>q%M z!JP?}5Q;P@Dg+nf3T61^TQf`0H#nbk|jlmz)^~{ za!+LrUNO}-eQ)PfYusHP<1ALB;XrtrV9=}G10jU#OOYy6@U=UqQSd%sKUm!mH!K_rm^cSG@lHy8B z$x$hT(^7KbgrUaP8+x90mB{N0po$Nop0I*h|3WI~7a_?3Ml@%MD%%Hmj95L{8u2S} zEv!f5S$gz+ExhO%cBD0iS=Q=0>3#r#qKgB;CL9DPXKKDEO7(c2_65})APm{~)t)WR zRzPg)ISPpRkzk+kMsc&)boLeZdBY!OSB&!ZzN7GQ`tJHU9a5%kb;I?N0#utrM|_x? zod2LQ>TH{;wOpGL+&gFyRmuIucpf@Ud1WNnn0G?rX9wba67L^~^QrOMspuFR;%gBZ z?z5rw3H&w>7Vb>Y<3fhw&khxMhMa}uRmaQHqnlg%iBTp`<{GBJ2T3R zF?$eqB`LeX!q&8{Mqe5}(uWmnb$o2|!MireiFX(GjknwdBf@=J_1A6p4axJiDKm zr(>zyEnp#4WoQq}>mUrvAhzvoc?`@iMjT8NJywR8@egIk<4veRs{GJ$-;`TZi|m#O z3vX3dsTPS6qfWWBbhXdiY&6{o>90w%e#gf^@PLo47DXK153Z&5+TrYqB5s)Ls|Ew4mLb!DbXl+>Ke zREd(Bo0%$6Qu8uXB}!_3W~xLjCNiE7ul_;sBGgBo>>NT0E z5+!v^W~xL<9haFZQBq4XQzc4jS!Sw4Nv+A8b%~N%mzgS2QkQ0?N|e<4%v6bzx*{`G zqNJ|OOqD39t20w2O6r=-REd(hHZxVCr2Z~5RidOmlbI?}QlHICl_;s}GE*f=>iW!7 ziITc0GgYFbZploQD5*`EsS+i1M`o%-No~zcl_;sNWu{7$)V9o2iITc6GgYFbc4VeX zl+?E~Q&kiQ$7@9KZSo`lcpn)gD3FfaZsuzB^qZd1q^>4)9jRj^EKr-re0&7pn#cT4 zf!ai>QpxAd04%ZLOXDyk-8?Rr0A68{s=PI>fM4?-@2&CBifQrCy7-Ion#2`E7!N%Y zSDI<@7ZptR7j8ISnN~21d5W|9xGgZSSF8W(KLqsjG`Y>S3N5hjU~yG4qug{qa+aaQ z)R1>5h*1Oy#OlMb*kzLi#|`kH)Jj1FOVnkIIH0yDA`!uIX+=mTP z-htI;Ur-3LjTa=J3~x3%gG_SJBe2hH0!j{eO7IALG(~{Pgx>|+4R{2G0-wsr*CY9` z83Gha;dd;YIWELLqw8 zA-Qq1VCUAIyGh$8X#&csp1Yl=NNbap@YP_qB>oie$V;|MlG((af~Qq-jmXHgLz=#9 zpy>lp3&M-G0D{!2Q^!FM=5fXg*bOog_27Gh^LYI2DOK*kyuq0O2aW$O^ZBWezWl** zfQQC=2Lly!C^sIvoco=8!j*@@31u65o%rGsrykxONF_Jr(2FQgbsjEi6{SyZncx%e zv-0MW8vYtj$X}`*lIln{;$kAf^uz4R`^39++WGSa*FRAwrRvm=$YnL&eY5NWyF+i9 zbx$mn@9WhME`-V8zgdQWvzSvj)OZtQ216#>V6wmE#lhE~L3?M?95qTuRE_yJlV2^b zv)vn9(kbb-Gp1y^;K;!zK6haTgyC zFB>yxUTi$pk8|}R3kG?l0f^m<6md9^Ca|Jh+6otvht@DACI2S>ee#m zqy2Q8b3eg!tt@Ucw)MUhZj>|S(0oGe3CH7`9Ce^NQ-spDP$+%;0l+o(o1U4)&9#fB ziS!BAm*D+4wyexEdam~Dt3LnwP}`!fW{38{$&L066>BxoPI%X$6>h6&u(f8eg8?I- z?KVE_4n+G$8a?Q}nVua8xtO7ux^bf7+u^=ALE}@m`GeO$LCsKW#pTpNn%la6%rv)E zHwMlosOE>g@4W0dD?t5wz~@?HGxs-J#@O#J{t)V|_S{Klv(~tsBTPzq3P9A6;Vm6(<9f_&XH6L~b6uHTAc`*y>(w)GpP+tT~w_UX{ z^U?nE;?3>-wf*sG{4Y3aWY#{B7$^{Aw%J+$r%#Gd12KHut-3M8#XBhUn+fK)m7ti# z#|?W|2R20yXK@)mA=^fWK*XYZgOAEyF;+e*S2rfdgO94K9x->rwJg3wK8j*Ve2FB( z{&D4HtLx9OFTwaWGce0nx=XHBEpk8vZG)a!UbB9Q0u99x4sMqvuE0t>FH2Z~qc~rd zumWT8zbs*acf|#>g!Alho`ltdg;#ZfvvCdrH5OYcJI17$jLozU3%#!cd<yj9&}_(iWI1uOXTV1%@N^Rb4k8{7IT`!iYd24!pc}&+8@O;g(J&X zg`j6BZ$tjzA0)eP&Iy$rn-Xu0M|l_RdNgkg1&LsLu|##{&mz;HEx(ZN1*|{Fz;OPq z&bN&S!*N5U#)ow+dut@|Ie5gX&^dl`<)>vy9zXIAD_ClQjU}?A z#N-R6@5AmY-jxM4JLUGsm6nR%{4Sv*6jny`}6 zh0x{R;4c&a7ul153bp0JeiP-%E5^pV9wVIgX*E%6{AUQkOldZny9}a2Is)NGVoE6% zLZzJw|DX$Z8a`yN598V!^GOd4mz8`F*WPc8-6`slgZ_>MT^MBugC+fGd9^ z&ja;^@^g3n7zp3}ZSsdE<{}+78`j%gbRcKLa1#yRL!@<+cJMXAq<0^d%%XJI-$724 zAZL?HMB8SQ;~+T?k=9MxL25W8>V2=-%Ja=Uv4A#E^!HRZU0cFUvJO*wgj9tUz>gr|_OQNV5j|Zv z(uHxER}woWv8~Nt2yiWqX~)@)X;Tt}{!wozQu|3r?Jx!}(!32l%mZ*A=Xt-+c-L19 zA$#8>EB`4@B=mR8Hrw>~7gy6FBzR1lO=KT75#!XzwaAa$iEh)7?d1_U{jU?pQXw@P zt;#OCEt0(sF-3F6G!BJqV+e8c*qj9f-Aj)dec>Lbp-f6RY4eRjI~JCDEAKZcx?li7>?iABeB`C8dR_Pv$3m3+bNJ}0IE z?S5hjo+m&$DiRq%wO0bAZ(xrUn6&F%^vwgtwm|W5R1aVfkj-WetT5N@V246m_qS_P z`q8|1o0~d7KlRc$QX#rFC2p?xi09UA{Vc2Wv>OtPYd~30HPE z;KbGzm&l&bjP4%=it!lu;w-A+-W$M2eWhgH@Cbj!ras z5Tj*ZLX#|o^Aip2q|%Bn`b&E&F7nP%uS9KKwrpf6q>K>DS~62T{0LV-Oa}Rb+e}N0 zaX6!V*`zY8n#Pac$_IQz=29vuRdc2r;bO>c0^BTb|L5tVp@3P3$mzzlX5AwSfHf5W?{)&7p~zDAggoTF_%?(PvUL2c z#j!}?XS@tZ;A3}^T%uk-HohcgvbJPW;>B&wR(Ele==Z4O4(W9~r=x>!9__imVR6G3 z+zbEW_F|k}CD~lE^JBur3E;ibILgVkd0Oi31L`=-mB$(|T=j^<-QsGK_SHU4UKtJK z5cFVRerY; zH%X#9w1v7v99oL9v%uxHj;vU=mc0|Ya)Oz^-W_>Su30X0IqO>8cCNH_S$5C6hYG%L z0}%+?pzvtVXIO!R_9X>gv)+h^ZZ$n9ksd^v8r3w|7oaw^Z-60DaWSk0%!ZsC367M6 z=k$g`y2))OmkF!z3_rRxCBFBF6inkpDDGX4;@%wqFHjh98uv~)cXT!yBSK%Ok|rg)<^hv{R8|vvi4+_SMFy9 z*0c0Dg1)dRdbEJ#g`bDG%D=NreKcvRi$2`hPh5bqK=4=cKEUJBmdn;~r}OoEP>3*% zmt^V<9(%I;``EuQ-tmd7ZgT#>p7ZB3ABwqQlNZIR^8^AZ3ca#(Vs)_<2(;Buk=C%RpVxt@6SFiK=l% zJGI1!oD3RgKxbE_hNVHL&b5yOebifdh9tq>sZP$Gy$OWP(r_m@l^?b zPdP<377A^uN-+LJTaO^_l4H5O70Hs2AKn+1j+(xykU8XbklI-^h@KL)fn^uP3DxBb}dU^(!POT*5AS zg$Ks>d46Gg_m6C!;HOWi`IcMDAFPpE%VR{x?qMHfY4un4aU5TkC)I=GKcbTTI(%X; zOkgcMpGh3MM_t_F&pWc8c-LwE2oLfUhkL&kpjYk8lrN~>0T5hMkCLU2aOQV%({#9{Lvb@MOho`asN6`02jWBr=rwMQWy#iPe&=DY`Q6D*#^l+Q%@%q%SiQyRv}q8Q}L#AKU{xxfCD`$zmd zSu0;V$^wU(jhP50oj8Vr`^kdC27@Sm{$jtIpeb>->_ZW%n6K@}tQ1R6c@3@aQr_Sj7>CuQ{9Bq>eVIIJO#X z#$l(<(7|A~9AfS42%TdRHn^{`UL*~7%qUI4ATpbC0+);ZTfFTVrD(QiA1^LH&)}KR zNmk8os7Qxozx{U|Db>tPiaP+-YcQ=~%j9Dw$0_)oQ)lQ)jNEivbGC%t+aWOPJOUF# zD+!GC&Dr9t6Zz&|H=<}eB;_t^&UTCrxVLAAu#IDAPy|AeYw}6Vp348>H$_C;H+=dH zM=6GYi*>&~48L^pWnf3&hPmU@o9in(xMPejIHsL(#y!g~Hk{4c$Ui}_bkSWBcYK#7 znk_Xk)rl`V$sMI*$o@b}oQ<{^%NaZAT;Wf#;LC`lLYp=cfi2hl`W$!M#gKj)i@N@1 zSu1Mx$h}wCda=mSTNuD`ShkyI+fBh&l1&qX%~rIDQwCE6&l)PPV|2f9ahaeFE1ngZ z$BmP@7)$kz;#KdmUa{$`M;b=GBG@3xF?@Rabd{3D^b9!-I{(lez=oo|qQRr?UXpwm zG+zH!tLA&uFyiqz;U=IHa4|NumcgR^wZ~PTw+xrwzcw6o(sAnjYr|0|TtL`x)Ct3` z{k7q!6UMdouMJ1t8MiFzgqOjvHQaQPJsxy}c+i)-PnaF`*_-I)bn%7R+{!OE=M&5> zF_jh7K}1wsWiB4nnbG2;SYW6-E$0f{v6CftD?jNUk(~)Q zaNZ8TAIHC;7zehSrg-iLG`oC$8rRJD0gKv89>!|b8Z9ViWW)G@dxF@Hn}qH97Xl2g zcOlU3X(uA-Py5hMc`Cq&surZjAjnk(=b;_1P?@ zJ=aL9B^16am8DN5o_7+rW-i-TSMUPI-Q7DvY!+abFpU!SiC7RB=qIx@U%KBQluIaq zwF!^8j~Fyu2|9??yVg7+liZ)e6g1qnHJ)y{e^u{k%Xzo;MrKhPf@kX&SG9zuQ*=xg zOMTG-_pU$aSnz0fDE7vvTYG?y&`NERQ8&t6rja|2x%Vt(W)N#p^WA6x!QCcUtFa^| zvLotF7agNLTwJM0bLg4rsKbaKhmtm>fQuW3DlyH@`w}LPolraj#CS{;wj16S%mhTTm{gsso-rV)n4tXyJsepp^?h>=>W-UH zR}p-v>ONjJqqku31g&h~cF)zMB8Z<_?D_d&GemwEDRg(d9~OLpA09(^q92C2?N0K; zrxTv)hw}+f_rlXZO_idA=^%!-=1L_yhRsU~_Jut5Iozpc-r#hFxr$n`p%)f(>y%2k zQ!WZESbmYN;syjnVA+`jXpsBV6{ah5qb0h z(=(|~L_{_u%^pVAEvfZnHSjQcAEFey5q;92-6*97f6nLSCS*UW2Q!1(OnJgGcOw-JbDM2B5tu zpnk|U%o1nyQkIe&wXARnNbBJzlfWS!W|)TIGuX#mgBsBqXs|=5)<%Pe`9zzfU!#HJ zA$!Ui*vrhRiW|hE@|bpA4DcFAv>nl4t5=`i{CJ=@WY1G6TD0LCMBc&CK^Q8~6?Lyh zK4b&(A>2LhTNIf_<-yOC}&HU3!=!a z!KP(PZj$te)M+TvMr+@_l~1yJcCq;EYt}4AX{RrILFMz+6D~E550*^JULxt=A?H01 zA$&YyHmvH4G?csLnzfWR%gviK!+m~|T8c>rM5{Z0km^4VXdpT8%lJ^(=6>i_>?wro zmnvqXI<2VP!~t#&Htv&5uQyd(pn`c9aTlI;WyF2{v@1=i9ii?$4W8u42ZQ`xv^^bT zAO!)Qu)Q-J>_m~#dUS7KCmJ`TrA~~A1dn3_=eYG~f8e!L|Cpi^R9a2eC_1YGq6_R^ zYtB|HaRS$@TzbERu*nD5DsYz6#(unSs%&&sHrnxXbL_?E7T7uG!Zo*3-Fw3JJE=Ew z?AN;YNm)H?FFbdG6>GL)$C0#J8x9ltW! z-nrvQ%cJ=5VSaMMfo|41oLYe6=wk5lLIEQVv!C~qh)<**Q!r;5wy!_85DrXinGvY) z5vzESZu9P7RQxla32nC5ng<~};J`&S>No@EK~HEhfVHFe@eke7VA_s}?dAmH#f@Co zc!)mYW5)DeVc;;frrdGA3_&05kVo^7oxt|ub6N}d@8nC_OyEW*np1w(YNAX6LDtOVRV%ditlo744|4Zr`bxp?p)XG&Kd!|GY7h9 zgL9sHZMFxMXaVWR8dy_1CB}-5R6gT>q~en3kNc)Zv&~fqm_jaP51-%8D6jPRF4(+D zaMJz_m7T(V7WC*`!hQs2Ypi&8)of?^g9fF^SnSUGjrJ$c2K69*TokAnyKL40zB9_d zqVp(ODoEK|D))=OTm=!9~dSb>fL1ihY*#hq45uSFMZ$RxT`YT=k`^Ur!#Y0=>NbnHCY=J)64 zHS1zO-ZV8cPk+3X&n}@G=2;V>PK8w%wa1N$+7+X6m2_d$o;NDriCa_b_^9#8C3j?1 zpP>T|7uwV5HEV_DEct7xdL092h)z$E%+${FY+!i#h9a)b851pD{-6j^4q{k!<9^GY zZIH&)@lo2CrCTX!yQP#aX*(k~R&V6SXs{7>!Z=@)Z)r=UkcXogM(!coW7+cVCL|?D zH^hl960XTdI*f`x+`m**N&iy4VZz0^%ja}l$5ORc{+_nPQL5E3w7Q+7q5HG5=&1de zjwNSNkNudAZD&yz0&JsW#Y+&9d`3-j7Nz}|`oZ~TfC+s=mi_#1R2}C|bfHX46;Ji) z{=3F{yAE0evw!S#dZp%D=1mm@DWBSRG* z0bPDMGF0&q5apL6LlqwZMSeLlRCyy}&b$$jU%D(#+k&&zo8qZ(UzWWiAAi4l~043CufMc-C`pnSBS6^wY zK=h%!D6fm5OMmeMfO3cVlqvimPMn@HrE_iJl^(O7GNl_~ag|PjO2@{T@*->WIkb1N zfQ?ax^b=Ge)c=e5yyzIKu=V1~zaayF^Tm+8@_Lf38Vy;j_&&L6<^opk+Los%7XHGo zPwLYD3DW{hEudKXi(AP8)Qd8;=rOv?{t)PLmoFWebpjHWGc`W@CVsDz;0YBRejUVy9j%8Fo3|;Fd}#T+*`SppO1~e_}rUfcCNePB8ejCrIUAW zYJVR2j>9w_Ql$9dj&T-RyNDW!3=7JliI>t~l6I1GshNUV- z>gGW>^8w&)8wRJCa;qYPu!?nl0V6e|-JC|oPz@Zc?vOUb+!q(|F6Q1oozW^}w9s}) zfAw={`CCulU29rt|KeeR6#qhlNjKijEMKYF;`bG8cwRC47n(5$b>{l&`*g?lX)w=z zTc0)kVoZ31PHq3`pV)qrI;{OB~p35kCY6cL6 zEo^SSaGF&1ZF3jQ`n~(K0lpFIN$V$+{fh#16lUryI_Q&a+||KF0^S2W#lan}@eS5Kg8qOLoRN8C+3eC5^Y>3L@8@;wXU_n22ZdmICKk729q zJU)3d8jSbjKIc9SwCw6UdY?uf`TzAxu>n9Y3jZvLI4|C>8arl-;L6gh11k>V*GeCgO#U;{MAJgwL9uWz9_? zbp-FNcrT~MUXklve|L_2 zv4CoV<<||~goAa}Gh*klHT6QXGeF2n!Tu422}6CDj=2%R2&^|!DnW!)z6Q^0ZS|L* z`5L7T2&%A!dn)Et6Qmy7xVX?>MG6D8zCFEzNOHA+`lc6Sfz%HXa~! zpPG-Xi)WR-PGl#nQTA86iPMkFOP zAd(^|WKu9YQ`EKiPyRae*qM?fH!M?Y=P}xvYz! z5i{*P+0_bPTDjI*@nhAW&WQw$fcuL;gRE6cP%NoM=VT2lOQ#5g^+X;xoYyaGSI2Z9 zo5KOej1=2Ldnom;MM@*##!xD)@Mglzp;U*$uut&mmwLxCdM90}_pPNbXk4=@@_CEJ zkw;&cPc)SJz+x?EM~E*--^(L?y7>`3`)Zt^-!@8R=XIiDx0kx}?X!s;c38ws22gmq!Dn=BFMr_(}CY)ZuW&V>=@ z`x7G0RfQfmANoeET1I23De}}9OtQ4}bc>HybeW})7QOva=GtRUSy-Yx0`uMs< zK3i1Wd#~As{oA8Flh|0Mo4Wccc;ZlR5TNM?k57C>@#1Bu@EDyqUYR}Lu(H<+&@|fv zoJ)xX{+`K#GA1NYE{hd!6rkw`1K2gU_?Bhk#eh_QhyjTpHT<_vd5jr@S{Xu;`KG>3 z_IxTPj!hQO{gq?u+3#>}@9_t;8^R4+Y7&u;lmE9=KR&>w6)^zwm;*BLE#m|M%sgTJ zj@uLOHJj2ckv~(5w_~Z3)S!(Gc|<($MjTdgQB&np$rm)hY`vx`P&O6k$K0qzsTGlR zLGGaGDy(i=k8Tp*Hc@WBN0{H|WeRFIG z0-Ng_6khGqLbkzZ*j@|*h<3|uXt7|#jv9ASV+_X;%wX1EJ)y%d3uBd^pd5YM*z8m6 z8zQ|9S&Pf-d`>J%KYM(hgN{z7Y31tB?0FC=c3Wyf%in{+6So~_o zZ-@=2udt~Xl}*rH@!}=EFP!=j#T3z$Ccb&U_W#WHT!2 zjiAi+&XV!m1Ve71TR9p9^av9>*`HJXX>9a&6f($j-CLGqbwIT;3%anM#f5bOXSl(m zB~j}(RFulv!8lWFx zPx0;ZDCI*`qHg9sKxVy7%FW$GdNG_xLMi@$w~uG13h5+`_+G;M z2zN@6Y-$!MyS{=kMu{?Fre^~d#EV$pHOFH1ri$1V?z|slB?50@O%HEaE%9J`wD?@6 zhPla0oyc8w!V`OWPJBj1jM&R_uo>;oQ6PL=*xdcim7C$7nf|W&V%$E~{|du`F!)b% z;>E9+K`9Ue`G$Is%H|F^7Vshrq!Ml?A!45hCEv<6b=X}J^HlQM!wHf{%di5N=MtweYJlEq2SC4$wjF({wBc}AM#_J5!h8V9#{LXEu+#Iv9`B2%& zyp|K}raxlMaK zW4thzx^p*Li0Q>}Avd482``)wE55#PJWBkE6k@iquplY}1@XcQvCvpJ5etNhOo5$M#iZW5s@40E5|IpzXd@ui>E9SgWMJNB3>&LxQxh3}KbWC@FhjTfMtTA8HM)RaQ}uhoT?- z7;_&tkzx}=fYZ5Nm1{Fqo(S+buV7XA{GqUa!9+gTQQbg~b>jKSpAuO^0O_&E0L}Cm z$|WOH9;A9~`{5zIV4EV%G^7UjJgg|33ivNQaMj?!A>iO7w+<@6cf^%>Ski{S!@o?v zJ6?8xD33 zsbw3?L?c5Jm-r^pqnx{SC}e&YRb9fI&mnIiyX5|4lExZ@!_j(5iG5IU$$F zOkefYSn*4&w~M`Em}8er&lIEMCjDEloY^^{;7grw+nX>pE1VAuwe&Qt@C9%@pdDD{ z=e!T?N$v4obV+umkW4TA3+04@n@shg*56OKx92jxNQ8*hv72mXlWk+ykZwB9`}Apk z6V6f=zTAo13)2v!vb=^M-!RaSA9;09LvGI$W*XA^d($Da^9C9MpVDv0>63A#e!v@j zYvpekJ5gos*mDL8`(~yvb{>ZPgY+`W3k5f38g!J#6#HXx5PqybiYGo8XwV1gIb;cL zFgcKVNVq>_s#IMBD)B+QIL+w)7x`F{Q&^IhJe$dw9`98=r%)9?UAY*AoWg<1f0|YG zb>=Dc{fYNsHU7>_{!D#a@u6|~25%U@?3JQnoHkGj zExwl$h793B#$!AU_}cIx3=GY3z4uXuu+tK_JVJ$<1_thP^m-Ksm-_m#+f1ja?k~PS zq|?s!>pg+a_9oy2HT?h+@Q3HJ*2fPn{|)ARjW*4`l@Y{4-|U#Si93?H?=!wFtjAfceMWxrJfpX^9T&(2m$2!tjpR zM?^ehO3FX`O2BY&9XPMZ`)l9!|}a~m?l&7&gm(N^@?F3x(7bU@P| zYaVQdf6>90H#6+q?R|k8%S0{i(dCTdcNKgSQWy8x3|dnRW&)s5taR9~N9=UEiuc@u zp|k?NFyu{p`WC$@J{Go~4wv_pgj#z_!ZsoNF<2{pPi>l9N*AW2@eg*~-$RL3f6J9!5vbPPl{9NZIgtNXE4QF%Qa>Uhz< zirev6ioZxVJSIRR{5~00f9vTfSClX>ePcnpaJTsMxS1tL%=y-W4#QXi*^VWf`YK=P z5KlDZ=4DeFjmP3WnR@}<3=0|)TkaJo(C@3X6LypLv5r2@qk;STi1VnXt?{oFM?@pp zo4shnW7(mdAB9pMjhOA+^7OP>_AO5~>cIE{cJXF7^PXHAu|L2OOK$l^c;7lfdx!MD z$E>Q3STo<6yrbh+`qZ%b6@x+HP8)+1&TAGb3>xT;0zDaMhyn<;4s4^0lKe-oSwoBk zbX#M+!{^WazdgQ9|K0e$!sUA9r#q^s@ha^g>}HN!HBo^PX?-s+kbbn~W8-ci(>>F;!bScwDu{SL+%=*?qJ53MI-*!REdZ)pA<^tbTBq5ZuXEIznPO`CpfQ=k&b?bo6>*7#!Q z4`;YjzJhxzxKMOw`H=49n(58}Kow!86((fEfe-LETEzN$rA}^2pPusbABpdrGw}%4TPVN3bvXv!@U!JA4VMahZS;tEQLy-5Q!OiVaQnk7HWAJ|x z4ci|i-`3t13!a$i=KV;+;O}hI?|;{Rwz;OC?aW9oZ)Q6iO}~eOZ^Yc|{Em;?`>;4i z$NwbcPGR@i^$8sxbAQh6^LoYQ5*-X44>YmweUpBFZD9ZTr2c2>=P~sMHnBt6@6`S4 z+3yCs-`mc#(`a-0(m?N9$%nWT*9cS~4{Elb!Toje4mLu&rIkt0{w)sk>X0>a!wft8 zWaCVG-qX{#rb8Jz$ErC%R+zJma4~ArpJf{Z;hlWI+$|2<&z$%0e(Z+!tE9)C9VtWd1r`igUEcHA*ay45dtep({C zAHb$vU!a8dLZd%=H~_1LJYv>b;nr5fY)t|N8!abz{JBt7u~nwZYl>?Bh`0a>iu)W z0Rkh$Yu=kJW72G0=qM!D=pq7Hm=j zxXlP4y4VhljOsU>$!n%o# zp$lf;goXIf1#@pn_2yt!50OqHwLv}lW5u)M(c&fR zu#L}LF}e~gZo4|3{_#)gjOV9kz1!cP>d#5P`ycB3yKkkd$#W%no;WqnmFa&To~Pc+ zv(U>kk399K=9!ny9-e2pm#56jGoL)qpPFZW`jxU_b-U8bQ$e1nW2lDH_YX28&w!_V ziuK&Ykr5s`Gq|6K{5&p*M z*>iIwL1ZejIRksh9rstDvx-`)KOgcwzi06o7z{I<`?vV~i7$qrV2aiw8QtPsd!;ky zmZ1Dy4EcIsr+wpm$gp)UUuJ&{=N%$bk2nz}(c zS)PX7D|XfV%$NJk82B9!{a5+=()@Am)qaA!>&y~SS&?CYJMcjgvQO69YD-h2N7Xb}?gDJI8)=ADU~ zK~dQT($ZW0QXpkF->_j>^>}Rni$^uhhEsq{ZG&+|S$SHrYI;`1U!(4I`Fv9aRb7;< zo{&{}dedx^Bie+l2=D^C!q1FgUT?m&s?p7>5z*iIyCq*V@4uxNxz=jEfRB`=BKYSQ z(OIa1En5yKJI5!fP}R8<$f45T@g08jwjz%d>Y3Fso0O(m^A!#|v&K7BQ{9|~P_l6( zw~9T%CcA2CM!Q$>u>YF0M;$fR&ej3?+BcI%G4c!(FzMU>#NXIw63@eQL zW2|#u!)}$>2!)og5A_={vn!p*c&yINr`-N0^*zsSd3vD zWrY)I$&NIdRFlx+EZLZBx;Xu-AM;&srlriwdR1%jnf{xf@g{@^`lX;W(4@C;8#oT{ zkkS6FU?nD zYwFUUdVd5sMP)PW(`~4&fOljwVph!pW{HL+vDR9-mx?JTP68Q}v%a>^49fc0i>k3C zU{KM9jE|WXX#T{W(Hl+Um|-{2x-3sPB!>|8Xsj16;{vP?DUSl{#c5MhZ;vXme}=@E zmmHU}?9eyI2j56=WJn&Q&N6urAQ}1wS8SO#`-Z(Kiecm+nHqz{p;fbpo)Pg(`gbb- zEE=~rNXr*x^N=$d1qMWma_q!59=SH2M4VV2TzejDBiGb7jnHthejaX;eLg}<)@>S< zRfAO3L-a1j;2GBZ)DPN5rGC)D-!}f5Mxq4@-eaPXq(Xbm8oi&c&cL?zn5E z8;Rr_&XakWx&X`U&Q9@f~QI75Y(G5mn6MQp(ohw}GabGGYdCnC#0ktJt z2K>?D)Y;u$5H<7c{H07(p{?lxBPW=;qlD2MKg)XR!h(qXK3a;NOBV_9pf32SP+)u5 z?oN-rb#R=K5<;4Xg_0i&IdliER>)JsEMbViwSf1J=3z%As~^SLG+0ekGFJUI)8?{YEo7Y=(#gHR}(om zxW&!;7b~{q*^Bv7viIWZ)04g1o_(3wX3cGdA%?(+!B^G0vc$Ogw`cQNiC%)q&dzO^ zrV8#Vp>7*eZ{;@JqG%IQ2(+RNA?JI!RTDj!KW7rF!%FrbAIKywKC^S0mvm1iscMu- z==_`kH{ZD}^KJ=Z!1~e+UP33r@w3tTm<R@ z3=!Hcjh8d>hr2v9RX!7)^66H?)z}E=PPbIja!-lCdOAC1zwK)ae6g#4R2GtjarV?9BNhkM>3xHg8A7ct0xC(TuCSZDIQ%nWN-N!&;do zbSILJyrt*OD%CLp7AA&k0buURCD)v!26@5U>|$w*92mtR9`}dAS@@?)aZ>WnSmw+oi%0n?>9mZ&;0+_LHXM6e!_5)cY zaycnIDMlif7#;X!nA~GZFz?xrVx@1y*%o(00j}#Vg)QhAl0y*p(F3@bdZB<0^vpLJ zGjhhVV+b}ru9=K|cU`Dik&P1R!tf*f?hmm;m*DjQx^<{+N8B~BWN<;r7@!>gs3G>u z0_$S;IVX9r2S%>Z>NZv%1Ivj5s6h{$(AXwSd@LSKQ54Z=uiyD*0>85MXCzbzlP3nN4GlW}Ho)+a=QHfu+-`=( zcwLc3n7d>tT4Cq_n*p`oL=9LY9JV{sHwd?J%-pcqcF>3KK^t}=Zxaq89SqF8!W@3D zFFcKnBV341NaZ?^C+0ve^#EOx$g7;cq}O|B68ol+RJC({174p~NPipq9kFZ-n~PU7 zmd$tZL~Js7_?a+iQgS8+o6_IA8L~QyHDx9U8O?0=$_wDO1|;Uv2ei_xnnIXBQTNF( zUpJ$LX{IX)v$UMmS|sT+;lv?4EC6bxHE<7J-<=1vCEyepMjM9}KS@F;6j~e{1*d^LK|q2hi1fDkpnJ zZO&)x=En5Mfehj6P@$etkm|_6aJ-*o&-r^oZhTCDrB0^Y8MWch1hjnE8)k4*uzqn8 z3UfGqcdCDb@k}1};{x+oJ<&X#oTP`3e#8l@U8A=P^z#P#zX7V_ODgh@e-B6#TtL74dq8V_pe26~ zNISSny7lh?t@BH|`tJd0J5)*E{(C@;eo4W<2c(6plEw`OLUQx_2wpB~S7#c@>n5W< zpp{e7WN1aUgPI*utKl=KEluZPt*ksv$7q4okQk3(8cFEyEari5`i?p7^0TV>+#EN4 z*1aJkaT|9ZDkCNC{z;pSmVnv2X~Y5+n#|CRP~5m&a#@{hpCf% zBAmZV^}zlO53NvMaY_@>dK}+x*Hn1#HNUWLbgKszpWlbzZ`d{#mB9lOm|gL#_QVYS zbEPuj3W~>&`yW>IWt`|LG1Z?Nwp)X}=Bm>)mP0bx`yp1;j?tQA@0i6SpFxcyD^!~s zFFrKGx!Xr)O<95YG~B!M>q=&4nLh3yC)H!W)p>=}gRj@L0=60+l~ z@vx!;^Ci5DH|EFsw^=oB@aeE)dXzSesJ@DE#0rtR67~A|=HZR!uz?5r(V$>d87z!5 zC6|aSDPyy}FJRS7BNgwrWjyM#3gR)@EKG!*)|StZTBY4r>D(CwVpPLBPF)s zN|bnNUiF-cS@zD(9DA$XYCkX?a8I|3qr+J}k0^RjxA3TE7_!1eTdFP&+pf~>)k>yp z5yX^zClAV2jItH07om??>CV$4Hbg*c*shsEGWm6S;<3wfkmT!K)rdGG z02;mC{#V z5u__hO}8H8K4ETixM-{WI&ACKa8ax2dTVYM=`gd8bD&%Crf|`r2KAUVx103s;Uc)j z`xcL|n~Hjugt%@mLKXl1M*EO+z1v8p#bd*@O`T&i_(Ow6GkGM3Y?ix^d2Gt+c$JXB z&%FDdRC)wxzBV?N=)AL*2G-B06> z=OsZf3}0YoE%~dk<3Xwu4Z>1^C2$Zo;jhTs!I1sTdg{8azV)^9zTIU#^;rVrzO8$H zFyVq|(bmfSP%{34ulS0*X z^W1$!M~t9}%-hU;BV4r8tW;hx(D3lLKBINTOQL(iQ0Fgd8KClXhy++!=8P*bPIsm< zbX60$y^^_i;k|Cf$ffAz_9M#PpWeS`1dgiS9|1Bo3gPQeEqLz8i<&&5S*kzd?A`Fh zcC)n%!SK?zk?mA`NqjSoCAB@s|t-flF9FdlFt{)+9j2WyzJf|5C9j<5FUN$ZgEg~KOT;Wzu#itVnyMj z#2KRMQrm1K5oft6E$ZF?&w3xYzN*F5dV1H-h0S~4in_)c6?lI7LCVFTwwI}cWA75f4i3{}e||vM1NusLDTw;K+Y4bO?ENJk8Tf?s$Y?6v8g~W)Fy;R9hOU`XcT( z-p_Wc0?D^=WpvD1KA%+^b-#zr)FU$BQ`Y<;o5)$t*FhHt`R53eTwhr?Oq!$;9hpJt zthNAX&&~jFk5t}4^LU4J)}p^jkn0JvkC8(0iw=Ssl~N(;!Ibr<`8mc1j~-Hh*v(Rp z=^}wdlTh}aUUv|CPp^qA+C>q4Xw58oO@R{<{K99_)U4wr)z7KzL zeHT{N4y|lOCEMr!cQsuLwakLv0CR2)izA91@#P}QX+Yd`I5KMB=0xY24oBE$(VH}T z(GGQZt2+GtOou~`d6IK~$aHu{c&?PLlLnFL!?FYF+b(tMK>`QVt-L$Bfk-2fvb}os zh5~v;@}d@Xv=Cb<9rZC7rDK2eRnZeuvzS*?vq)J8Z1uv*IxOdS^RMFTL*@_KlGoI= zzHc==e~r#GPf;w;U1BdroftdHkUf8ixz87_Vd=zJ5jXLSI4cUL@MP*QFZ>e$8#3Na zXz6jcp8naptZnzkg3JQK-frR1Gd1P+X>o4(E+s5~uOd9Ka{l{uIENW~YB8STOFBt0 zou9$IwznE()m92I=}TS}X+Cn*`oZ1lpFYm7mxp?|1Yc)lJKo|ay}r$($WPs`*0866 ztZQR{jlUEoePhhVfa*h8q&St6_!Kr_`6A7Wv?Sc}lcLkzI35;X=mJD1Z~Xj@sQqR% zh=}Vo^-;Sm*@uOx|3fc|Td>jW+006CX2-bETQrFzgQUf*xiEip4|VxToMp{88N&`k zat(-H%njoPl3U2+J;d;jDwl{pKM0=6wP3*Ut4_L80>NhcNNZ>EU?A`Yi20OjZEQ1v zh6cKfo@(_-V~@%xrlNMl1-tm%h`3&*eZOeO;y=SS)vR!C81Eo|Z=VL!)nkQYUy2

;5KiTagMaH@|CdN*@?N*kAGmInV{eE2N)yrB#=ml8;h+E-w{W?Z0^!$9HVJqCuy?cj@1E6fPHtJrH$6+G` z5UI`djJsG^hDZeg=G{2n2_58^n$9C`AI7@DB;4sJrVMA00ojN!=&aRXG|7?Q$*xfz zESvLP!ZftnLZZ!ZIO?qSJTi~Tf`c6mJ#p6 z7liGLBSmjm?oJ8{+n?tKDH41mY?tSN51J6|pu=)b4=vlMUPW~syyXZDFk1Dnr=M4c z4fL8cis>#&R}Y*=#>vfwE!`eU9#zj5W;$o`-hsY}q0IY#r*HPFZ}RS#>h}%uAu=!t ze^+a{V?Xl|@$Yc3%buB2pEaF%Ippm=-hNX54S_+o2%w_%HlDca6jE1qEGHCwwudk9 zuNu#NM%^>96A2&mKF78pQY-Xj;g`+xoC=;?!-!YNMaeLHrX+U&AK(y0d3O+D`KexQ z=eRQmZxN9uB4X+YbLm5iv=n?rD9CY6z2p0dqs_ahg(JE26#}h+l92Jt*w>|i^7Imz znsvzh_6koy!TsBSZ&bm`_cDR~CSNE$%}YL45^`ou==?fK|4NcW(v4nHY0OyQoi$)vcvgRN@;{B2zOV*AfE$c(E68_*P%>4;J~>(!nCb_61Ed*{9jH z=#KzjP=9w`x8_^M7TQ?@_4qF`giqgYR`bQ=;7q%1LTKr`@ ztRW^4Ck3J3o}N_@kY3cRf;Dd5FX_F@%+Mr%o|9EQqjMZOOtT93HicwWUSv`)q{{Ro zsE9H3)xWuBvq2-UVr6G{a*sxi{4bjv72C}xH@SHq>XYo>0k8-=v8KBhK}|dHh=d?e z8HH!L;8Q9QPx4m7r^P3S@%i0zoogNm2X|NvhuNLj@lt)3j6T|ie8PG@J0-%7Si@N# zLTn<`--x;mv#l{!{9!!!279Eg)lNg)Y>d4}BDOoaUq`-hO}zM^eD!`&qP#FcwON6r z8NO;1<^}pSx!@K{%g0Y{OxS;67Z2g^3AI|R|I~M!i_wv={ge9>_R9%3(MLwpcrrGj ze8-j4wAuJJEdMH~Q=~6iWG+3+&l^%w!tTfv#^HT`$IEa!qxG5njQiMJ)#v;!$5^G6 z;bYnn>V6}F+xzViO!LY#Q1|Ph;OiJn8N<2W9!nhdD z*xXDhx*3ZBz3go=N^q22sB{+zI|_)fos=IUPTTDLZo3Q^+LU}s*Ux2fgBXb-vD_Pki!MU+S>K=rhazo=P&wc)DItN zV~cF-MV0EWnkX4d42@xmtXaoaWcPOOfre!hENkaGhL}wgC>{BQ0)4ow1(HSkqZ(4S znT@j)ouH%oP}$Bjzc;t?Q#$q`L5F}4xTqYT>%iG?)zvwin;yBUXz@v+2RP&o$RBc*(d}YBntP|dElN6b0G>{1 zGkH#<2H*b+#fq*48dknClDoEB*9=^gM-F9t)Y9>N#UA zL?d3xT=3S_PI`k|HZ1|`C{wZx@ahManjVzLWG@S|p|mZNg?=8)(oTdgR~sAcKrt7} zTMB5^(I$R`Y- z0O*ND`vtIB0K(hKb_+n`#6gg|bU6#g&{70U&ThS8A8dPDAJZ<|YRcNK==(&m?LyJ-0KrBg<1P{F=q_@% zy($Q8*krJdGGIf%0nLCj+S>*GGT@7jd`iDZ^{ZN{4=Q5nr$>=%Lj-yPNnjlbX?mJV&&p+>MbumAk?N8?^>Ha ztmR|I_qIML7y)vMl4Xa1J`OT4^O-a3Z(tP` z)V#rOwEOk3WrJDp^P$j-xdy$ENUSBKz|2l18|*^Kb90nVg%*k;o@!Wjg6hG)Ywr}x{x$&V&yyO7|tkm3Z}U*c0%wJ zm4`FsB@dR6P6{16WJ_z+Yj5@r9=5Q|CsG4NQ)O?*)BZKM<+W`dfK{EmYUq43?i}m9A&gaXSq4b z*dokPM!fW_vpjfk)`24oEY%!gjO4%(M%X*TF8TDwjxekGOpo=}B-Wc)aGWwAlh|wKo3!ZQVfzNWZ z7%Ol*_hMO`W5w7|9vNs2Y)zdQrR#^kW6ck{GrIFYo>wAExT*Lx6FWZTdbA8%;j8TFNTrR$n$oj zFcbCRAV!uOI@Z8KNn<4gj*(2L^JZN*c!)QxhPRSB&WrU3p2mvzMQipN9}}>5PDGRa zx#ef0FNz5oyp6-{K?b(6C1&sG_#^iY*qzzNLD&*^??jG$ug4X#Z>S|JQY46NZ05Qy zZw{6q%D;>#$cz!#{QkFdh80H_gq0Y2V=_*ru} zu$ftY8_TS0ca}nI3}sze%*v6LrCH|jM8G@;c_J+Bqs;uWlWBGnPPfvrt31&CV4b2b z2JVQfjp#TDhX6PC@<8+*;pnYgO8`2qdPyA$pN5wR7laj1wwI4qKTx1!n(9C)DTNTH z<=^9wu!_qzQlaWUO)@9EVVUe#4XJA1Tly>?@)*EgD?RSWbfDwzzvU$CR7oA#9}>dG z^U2I1;bU{9MkRx7L8xA-_m-nv?1Z5x1JR*415txC&@j=d;Eu|0+HkBvc?^rfa2pO9 z7R6A^fkO$y+7|Yx_<9c^cEt?8Vgp^XsM|0ox<-TSU1#_TC`2_}XHI_3(uGvG+7*jO zsRm^*?+rg<;Jp@}-WycIyf>%@X!XK&r5nsd>7OkDwRoMXfKWh=HFKnhY|?2WrWAX2 zqZfm~Y7|71AQ%Xb9yA;Th!Dkq_=umf_uKS)a0sn`NYvZ0N#1la84U#}u@9Z_hI)G$ z5JT$=hZ3#nfefYfMg5i^ouo=Z6AVy+beZA%lpQbynIjIu6DT+?L!lr&p?sk|sp&iZ zdmV~{LfiYwA}W{?bkrLO6+b^H z2KgE3C2RTB%1};D!FJ_5sGO|K0os%(`TeTE9cxqUu=$iwh_)Tdz^EvLAz?*V`QU^y z;FP~v;9RGGhJFG{p|SH&is6HrVF56_n+(m*0w3U)+{}l|UKP#%vRZp+67M>Ojgeut zh^r#@z<)D{R@q?zd`Q*GUQ;=rJl2M-W8M6!2C82(sJz>Zq(8;1vcJBk#({tfz>MSx z5=!?`BFKl~$7pu?EEKYViP0}YE+<0-1rdKB()fPoRogeVrt@)O9u}d>+g!ef-c*gAAiyai6gw;ffKCoQR zRRU(ndmyuy)bsO$bE@JV zRW97EbaOgN|L#t6I?@vhMP=VSAS%Vwcy-?G0MS`;MT=a*7bvCj=#`DT&p zG9yRtKpy)Lgv8+WAk1~s4Rvf?+)1!0>4fq6my<#-kJ3KxIBC@qW&`qR2r8x2-SB~mMAo@R8fJV`N*+fr5dsh zs*fPZ!w^E1oy=>aN2r?n9@f3zZuYwjvzcBogsR~+`+dOyY&rwHk?vB>!AI$qk5m~k zeANpCU!@)}3W%H2u+1FP+u29AdC=67Ddy9t;EZjIh)<&$-nuE-knN^q9Th%}`d5`~ zXi1Mo-KQ3J50t8H)ez9wTBo~2ghHee5*q7mxNN7yb+DMN_c#GIVtv5uvxfflSg1ao z>hJf4T?+;~NTnV#*(il7?NSMV(BEzUQ&j4`Iodjf7#M~t_4@l%YN-eR4{y!)W`AsJ zwyHnvQKynV7lnGlP^g>y9jc=2ayL9DClTB_m*(H-HUp65qx6EWc2tje7_ET@mq(;sLKdu6s_eTyIASS zS4Noe8~d7`tj3Y&62Lt05P4bl*Y9c%9T4gLCnE4@yxp=?uMEa3UgbX%0cZ0htC_xi ztdr7rc=EC1kbK7(c;Ux7mxcJ2aA@uYZXeH1;(LMJ$Gc8ogzl9Pm#2afVD|EUAK^}g zdB2bMokFPPLO{PvzJ(tl%k)k1fI*pWuw@&U1FX`0Y2bnFSa0xJb zdB2Zvr^3A7$NSFLP3c-$#;WJSxA?}FJ>>^6N_5cghA`5&*BJ5Idx&|w1^r6C)|s1I z|69)6WxWkIU<2ozWxX>WK~m?UWxb8WE541PH&B9#Z**A5vn=bKejbtFvfg&QlvSL+ ztas_Rd7j;Im`Ozh<<|-f4TUKIeJ#?Qx#RpiJPjffT+>614ns|&}}-^W{PR!TOGhW=B3+D~U8gzXsX5y=Ll6j6DWj6Ix} z>X;DVnG@W;Y||tzNKj3vI5XLkSIH_I`R{n%d*-(^s`GQi&Q$D2iXntL@+_`&o_Uej zvP}~IiWcvRF4%EiP3Kic@uu&~>=Ku`^FDJ7^RjccV1n85m1f<%rI^h?eWlU9doh)g zdEuee_3Wcudo@y*c!7EG)-Pkz;gUbf4$b375fNvAFl2E@p)n`H?L<$%Ju}yynb(w@ zN?}I2DY>B#L2|rP-q2C^pQrdMxiVs76Idl9d^X8WwtN;5DQDIcI~gWBp9z<>pX7j|Q~=8(xJ^wjS#q zZr(kCRrM2aL@RyhF@i88F{MCDhj@dCPr;N zyBZl+I~@^Kyg?J5Pgm8v`0}=G+d#n&A;^URn1+|#aV|~I3cESKL|6tJe?vdN`*iQ~ zQ9d6s3QP9mOXoKfTrXlg!PZ$9|nW>4+d8a1ZT2tRq|r$@|Dk?$l4@tN2aJAf4^EL7i?K6*$_Nj1eC_YFQvM;B0F+)m!aW2PJa6CM06RkEK`&$~Ico$ONdS4T~Bhn;LD zP(Pj$o;jT#TzguNZnqtc5Vg#&9L*l_&w1Hdoo5o&hVgkKG;8D||IX7+UdeZu<%I~{ z-$^$JZOq)$1HddwYX+rR1|!0?UZjh22>ata}) zXV&Cn4JxHWn^)9W%8;VlutHznmMIjyuz^BjA1kyoif>cv-UI(@C9z=r>M2C^R3H2C z>D1SGTwPz(ZO!SnAD>7Nuf}fPRkm}I*4fE?Qewrk3hZRAfSq=;?Oc1I{VRoPc2s-~ z6L#mJ3RhA>3sHr81_m_tFR%z+uWupUi2+ch*~tUshy>nlN@`nDk3qx^U&kAgJ=v9W z{ujn!u%QsKSsmq^?a7{z)!*}q)a)EK3O{`zGYXoirw*-gRIPeO?Z-99-TSN!~eEHZnG<*DSsJxD=_(s$yS*o7Hiof{r zOz~O`A1hwn@Uh}mh+n*d9fxI+*3-{9RljIHneD?do9m8|?JjG_QzQyG4`>+_?X3Jv z2v2bYCvOg2TCHc*nmtm;hMI1JOLg}MIK6*by(CC?xP{27B{8{vjQ!G>9V ztfN2_d5!9q*?wwN`2}6FxfpU*tJYEXg|$>*^5*oN7t>-RA`>e%4T>-5kr_qVl1`;B zi>3O%6bdwPr*iTNH+=K5XwvSAK&+H)KCh$2Vepiv1f? z4vK}GCrz(4)Tl2Ow5U#IA4(s(h@snUoAjt-fH}B*k4l9U=(y@LIa86#D=?fW0>|Au z@I3obv}qHsFzYe*aNLcb4*7#E#=E`_m@iNfbIXiAXV|?Kt^YSYjZSGx#N1WxIJz_D zE}qj9bHAHW@AUPFAscdT=O=!9j|_r*9ulGv5~4ld`d3*9*{lS^+8|-GwW;y*))_f} zwl;0%8UJ$^8N;{hH-3BiAI%>Ab9*L#3pa{gkdx>1<8Ov9zwfX{)6{~ZIaDiGeF^&zN^QNOi*f4KSpLJd15$h}KDf^7&t|l8e zHM1$!U%k(9HEx*Rb<9NXEbxcdAJ+vt1_!iYGLrz;)@D|PY_n`wR`xyKvXY|m`6w9; zH$pr47;UtS$*YcH8lA4cKXVr<#PyTbtMOupt*94zs2Lxa=zl=w!`w(+)c08G8i7M% zQHn*iy0s@>+&rTx?AB?^n1PW1U5qJ=C49gp661b#5|65JVJvlpZ1(G%@-wl2)A1Pl z2&Q8J?vO`B+z?RYmf#lNq4wealGg|)6<9U3gwUW@VIh>c6ZY$gAhJQ`t}W(HTOP$g z7lx7a>9|ZeY|(Nb)W5;hAEQtjUd8nZ(+~G-76c(gs5~@$0M#p^wVGKdwlucm*5jNa zb3raWmDI_~=ViWVc_a0ZCE4H()fESaaeG(AvUW| zU=YtRSR3qvIg}5nwm&CntZHRdeOZo6-Kzrrd66jIfi6Ky3>BSl z_Po`#a+VEQSp9aBQS76WvpU}890((EmcY;W8}ggE{bDsGC}T|^0DBT4NErY5sYtHO8XYi_h@ zo4E^yN7-iXl1?xkBu{Vc3g4B>o1D804D%$VfL`R>1*3@Rk{VI@OtgEqh(vjrPVVmu z;p(B{3x01S({^MAUvXFH5qFoHxi-VvMKD&h)rYG14AqVXo1J(~T`*olzcfdSdaApe z@C$W;#$fmbQkrBCtbcnP*BGXs)i=_H9MU&+rayFteM*09{NLUm7Y^@_<*rPXs7qED zQz4mN@nS%Z)WOI%>JGG%~!e(%RPCk%w}J%ux*4 zdvkYSs^(fXQSh2rv8-qtlX=;ZM~vpCA9;9a&?6QB5ozkc(^TEL(&CYfYPSNfY5&&MLFRE;VYi;7w&1!>M_seK zu+FHsRFU$tpOgU^>7WiI=ssvzf{b(wOStLOgzHaDn15=5cA0qbuE7OuD&k49*hc&| z?p3_?V4u2HU=Ww3B}wHWf}q5x$cE4&}dqx_ds^PhLNGCj)4sO0BpmlzMZdeWow;5CCD^xW)a7QgQPMAY28K39AvwmP zj%y~mo%6GPO#F0P?inbog=+t5oS;XYRWD69%{}LWk-~nAfcgK$+q=L=Rb7k!nPdV1 z6V60~MT;6W+KgH+xuq>pS{ayu89M_gh>0R%F(F+?Etn9y5S>fI>nLfv5!JF+-@ll!OG6-*@eECYd1Ge*XX8=f{W4IcJ}}_t|^x zwbx#I?e#!R^bi!@#5Bp5?s^+uBF*K*Q13uC8ePxn;R1>gp0{@T**@x*hNDa*8IP5v?hh?>wb zQ?GIh$eQWr$DFP>GN$$dD4u``6nq+|I3^OW7^DXY&D4n2G8BpBX~Ireb#(*p!ngTu{pa$Q)&>z}j^ z?cuN13(T56vnj6+F8v%~3%U_TWN6`k6v(YR2k}kCckomwwfL|%>JcIm$3ajIS|Q0z zEsCWjU~WXw6{1;6?AC8#bZYUiqB&@BVHe_@@j4|$5{GMw5JeOr(iRP3Tke8)*8U|r zFf3%Tynj)B>#u+}Q=x?dUPCPnvT*qI&m!xDu$uM&W!;MZUE9O|4!QvUd%4B`4hYr4 z(5PU|!u#?Uh5rq$6Uxh{l-EYB@-Ncih_Z!n*1Z7{t}DMOV$pIuR7UKTw;Oo_gef+L zJK8>hnOyALsGEzISEzQeqV!M-p|9ot3sx^uEiJ~`bEAHW&~knFci3t8-->XWG4#j6 z;=&-c>1)l+NLf8^tK=<_SIoCd)LWAQmN;l81AGRTr@=q<;e6>&79W-2?fu^0!T&N4 zcn4EtQ>!W$nMFjcFh%um^I!%5xjD(d`#DiC`hy}k5%xNTn!ulK)t)^lFf?YvpB~4y z*KdroX_X@L#cVgAAHp6uAYNHEc^g~t+$tWFy0?3s`y{-iT8(<}m%*Lwe$8TFWh?vI z`5deZ7WTC)$!CAjwJL4=D z&VQr08SAdYGm949DM;KGjtYMj{Dhx94}QYW_Jv>h&n^Tn1)t?9@L7H#_$)W!v-|?^ zS>6Xe=L4g#7Z{b{9)?zV;q75)O`p6##c4vNFTSl(-qf6{mU+QN3ra^L=7teKty*fP zr@~6u8O6NzaDpu6tW0c+6&usTfLQ#i$&GkS{?&Rg`B&?~W7^#S*pwDr<7Czid;3sTTALajxON;DFOwaW25kXp3$#E0F1FZWyg^ zF6rU=W%r5HOff`>FMF#?g21>Uou+Av?iZ*=6qneirpe|OOR71NxP?r3+P0~POA?ZY zbf)Y~Ze8uxwI2t~C|5NGcT=wX8Wgvu_}V^6rAI2GO*WZ?9t)mCI`iC9 zz2cuqc!DZ{xTI(RSYS1oa1%b-qDMXl3bGIXXIq~Q_>yW9yG$ zK*S%5_5p#U>}ZlZGKio;b`PGMAsl`18GhZZH~Y&(+iXIYFSdUm+c&?n-9Mw@%HP1W zv+sA=HhOFyBA6x1RpK?lucIch$v@+C!406XM4hso7;Ow45$hcIH_QeucRSl-?E|}` zjqP9K0m@@*^w>^M*8w3K6H0TUmJsxHrvGNQK8R35c1~Yi_nQa1$v!Io)yT0}dx0-f zDS}V9Z@k8RkHtsjUT9psvKP$GGug@SvgyXsu?4p@)O2@jE%E{nJT)BC;a zi?{4jx~;(lHFD-mPxl%_mjYY3t2zPBnMY0D} zaHCcL30r>|5i|&O@n#o)rv!L}tj%$C*APX_hozs#*5=lqhAkSKMKy}Cb=%r?m)*!) zDou@b3=(a^?(TO)46coDGIa~5zoR&F>|1o00P!L#>M-x)>y@dJf^Fx?6LD~&V3y57 zSQIU4zVY%KN882y^&ovO(3aqJayvqlwC>jab2h+`t%xhOIv-!cktK}sPh{FTi&7-<5>Y=6eUZb z-fRqCW>6TyL0XRju$YF!* z;$$S(ujA^`-1*r~=q?FiBvSy=OzatyhH-^H8_CabU5l&CgVPl_t8rU$Z%djs?&DfKNeH`y$ zh8PfnwSX~p7I!Ut535xw#`IC2Q266E#!BQG!c%EgD;O2G!9gg?iN4W8oI-?ka9p-v zwn(XTjpPF@5#VD`y$kC zF}~^E*x13?iOo^jMqlx%;3}#wzm`CTQlXkDx_vb&2zy(L6zeOGPU-8KqbP+W76_-BF8f0YdGaoZG9yu`L%_g;2%vT-R<2JIt zJMs5eQAS5=F7kw8yel^n^sIP0NoV!5`ard&+IF*d55`2V zrjNpoqVIa0-bh1dUjmBJtgM-XJVo`yD*i345Dgy=8u|zH#(+~abTN`Oa1&^VmCo^c zk9K$cX^-Zp3+QO39&gs}J_w8HXhB5$a63Q4_sXh1~q@bSm*e1*?y3mIok7k{CVq9=-3FK-sVESXjHKz1~&Svec%j-t0&0C%vzORotXmSuvVl_$8=vDiethW!Uh@sA^}apB+pONVpYxWAC<_+%*Qy?bRq=*qt;`~L)jOhhK$IhML)x<+ z#e@!R&Ep4I#0aT&Ujt6S`?T*gT`A+l_0fw!>qjSv_1dGHj-jS$DPdw{BzK&Gi1*w> zsBM0Lj{AdPa+fmPI;LK8K7tPx$q34eF6f~zta*TbCwimuMofxEq=}y90p6pR`2k0A z4|4XRbV|i!d_Rx7HDezSWqZ5 zOYHW#Q1X0iv&%KW(l58fMw-@_C-WfM<4F}V_+2=t zSi1k#;2T=_ET;^u8Q@~Tc8~-Ac;+04YH0I_3oeq1Ufu1QqWDp-8K2M_$qfI(+ysD% z;??Xu#u{JOSaS>%O4h8zl`fqSLM{E_iXdcO<9=uuw*A_1PN_I?KVGl)*HEfSsMaR^ zCuy@8Y)cs!&_SCd-u>gJviUj9&zw6M^f{LUbs<&x0Hr;+mP~a3J0`#eFDzhNq$(Ry zwM1DYNWk{R+J<6VXY5F}ev8SBv;9GhIYFzj4u)80&lBhZDPtE$I&z3%EPU;FH@X@l z_jTK}7h`HSc9^LwYb=2$As9#Uz3YNMM}BJ~292mLA~JnI>eiQvd|slr;_vbz z{9Rr`7$y~^sg*Nj>%7(s;3Q$2nm(1R4k3i5XHez(vW_Txri@Zde;jRlV+S(KaCBxY zrkJO)UaPEO+Ui>xyJT!-Qm@IUnRvMLmmTF$R(IbdYr8BcRKbfveu#@qOrTi-hGG?mWP+vc^&RZibeX-`i`D_iX1AI;Ggs<^6whO%H`iwjW-Qw7O0j;Kt zaN<|`x?{e^1Yw=#oie|)&8*w4ce-XZn-S?rsFV=mP*_QAr&DZHI+eec>=A&ad z?Uqgi@l(5(kB2_BVM`@G{YRyFn>yuGw6RltAA_Y!%L*sGv)l+Yuwq5 zw`irir#-(=X1GtyFO<2`=DtJbIe)TM?g)OXxK1@xtGbG>;t)TuHF1f$dt35oRax>- zrv>T~=cuFyi!1Acw?>p#3WdY!L_p!Md~p=ho6WtsX}B`fat^frk>IbJdRjAhf?`a1 z*rXVuH8NPXR9}ht7+>_vSN+>R%s5(S22?W0ssyqV>Tsa_`3KJGVFdpo7tI|D@0k4{ z0X5L)tZYU4!uV(#u9RtzrSF?}M1baGT*WojDcWq-g z@sRYjie4zz9Ng-z557gTcK40S+h8lrS^5}Ik|6E1N{K?WNCysE-ksBnleBnI2T zAHN>=g}OVvwVOB=z!rMKK5uPID)T${qaDGEjq<{a4*3{kI8C1IE2Dt(&^c_@#a{sRHo1yMPlU)h#Q*w#ce= z`3kDaUlAaTc^eavSJi=)?X+{NZr+N7Jk*^r=lwqXjB}}=MWFZtEqpa2C3@*Mt}7=g zv`#Q1y;j+?ni#ZBg4AnOLqVK~!XxCGPm$y|mL21gM4ye^n?cz6qECU~JNTmv>D`gF zhE%8UXA}6dMd44v7wSmCpS_meo!@zwlL1~tE&MsbIhx?l`_fcjnM5fR=>(mR!nG2r z(U@Uln#dOf0W^g_?nspi2g#nUZ+?$$yUSVYrhuGzs{)nRf_8+CWGj0kKPuiIaC0Nm(;Ft4k~(4{VsrxWB8Yo}fJl5f%Id zPXt5VD0hsItF7I_94L@F5=ZIG+2MA!8N>T?mbS`RO#RMUV~oxF5~pDDgftcL%`I(c zg&9kD7S77;?10VCmnaQV=9jP7`fAV!^fbM^$i-^s&fuJmPtyYFtJ}GEv@!hRo^PS? z=B(peOVqc#MzwtMZP~xSg&r*O9_3{c6AO>t9{;OTmWzFE;v$Ux0$tOn7A^wOJo=aD zZmV7OXV#=bMHjjJTxqT`3i_oc9OqkxIymj&r<78-zNhzKRZdj9;_v>IZWHlfkyr(| z#A8aoqBE`K(>eXbZ@M8T%hb&z&?7#wOeIDg3v!Y8W#4^fl#ytJ3o#5hzG@v zEs_G65~teiIoNaWa)Hnz(qMph4Y0UfIT39Sz8zX8=)jrOnerccjYe@{A{{jL|MDydfA*Gf!&bo(wQNjLykHJJ&Cj%fK?7)ELdy*?Sb9} z`(jpWS&37&2=SK3MNHp!e-JuWqC(Jo>D52Pm2D%V>n}r)c1~AELAqy+PuLqaw@B6e z`p;J2%qHq{zDF>|fuz2KhVtxoZWhXs-z+wVvla_AO_>k)dcG@-m@#$u{Um z#Sngi*Ro2hUB2wVf)$Au7#orj5w6Mk=tcOO%qH|wxPZIlw}U_X6n(3+)48emv|Hbe zt_neb_{`+Hh>5eIVoExnb8d5Xxs7{l#cb39yR`|db{mOhxHGsKGyDc|k|*CTC$94b zx2krFQ(SImPjS{2pU}piz_0#ZB$NbA*x>f0jng*d&1UC@G$ZDAHWuTY$G?x5Qi%Qa zpWA7CxS65UD*woe;41D6Uc(YVW{K+9qI3NihM}iwy`}kMq_>Nc_~R>C-&~o*kEme z&^mfHY$PDURC1&CAX{nKe<_D6vLhRjE}na4*M~u;Sq&&8I%|Gnq$O_(ZsDiTe{MpBykqzEu3-ysU(Q|}N3@xPg$j-C*{68};-=?*uS7mM)T>ueN0X!7_| zU#UYm44yo`<0~&@YkWSiwb|Qz#U15@*S?E7J1qPL`L?0v>M!n?b8@lUSrcFi0%ZTJ zE`BG^O0#Xz8ynA}Q*YbiDn2<|Bbc3A-#+Kk;!~P`S8Go3DZNePn_G}?HtHYB>OXyq zULn}Knt?**XJI}EL8zx~!qV7-L`qL*i3oLGqHofk9S2u|k97rWI<1BKLt+x5M-pn! z)4~;M#E2FjY>1CUD(H`R5TkGK$g~`!HY13a(h=?l(kd>O+u*GVi)E^5VbKOjB>17c znpeRz`jtJK69nefmSO-kp@G7agK3G2W#l8XR(Nlm6;)L%<`XoR-{E6z+vfGPdX@?* zGBJ9Fd~DcO+(?i&WJbD~-|rEsP(C)@w(FaU?ZUb>U2miq1(+$=W!DCuQ$%7!>bFmt z<{--6TAOfkUYC3v^)x>1-$pc*V%Q$PeBJN)#*SK$qO%o*Qs2H9P`K4V`)3JQ@@7M3 zK${75j3F36mN_3G{3%JH?5X0^9{P@jDQ?3y^h2s*D!D0}58|HHv8mwdv% z+n8iECtZ52$JXwe*DfG=Jaf8>=sF;o{eHhOll=Z^b~-vO{VS!S9$T%;G;Wtt8&s)^ z`_lu(+c@s5Sd8e+K0Zl;iP&y^(A9RzZHt=1G`BW-_w=#)&1iTy`?&%4d0#sHUJ*X-{Rp zF)LGFy40$uJck?eThH=Z-yMr*i%d*?WO>Y4XEsw?9&2icO?^qihbJ&pw2#8*^3G4v z(^>;mpsMVxX+*LnvqVSiD0L=VPNiG8S8b(M*u^bWH<#)zraCW2V}?7oTU(ET?|j*9 zA~Ty26~iX>A=i^Olr&o5ol$QlCP-YAPogbKHDt)<-c`JB_F%*QZFg~daJ;K_zJ#ym ze_HFbS$9~Evi*jAUB?Am!h4}NVVzs=8Z79Pb)-+9pGO(Q49|a@p2kxlPpwy2#Thiq z1~|t`Apw&`WBed}cT>y1;=0cmDf$~I$b6`uZ2Ht&ww<{5f);F&2w}BNG^W{B*&2&a z&pAQ6MP^l&^c(3FgLO$thZ{FKd z^4>$<;yseD;4Arln37M_5Q}$TIA3ag1IdT2w8Hn|J?26Eh3Zai?=Inw`|>Y6^XV?v z6LoR8;PcNTBeOHzu>jSCJ`kq0&FG z{~e{TCsXUw=YM#m!~*$SAC8cz^~c__7gVDqEZcF3`u5t-nIp-vEXF@EhL`iKCIxLL zaum5D!`-})IFzNlLwhQ;IqU1le-Hgn%Kz&)H*@LrKK*mH z2y-U)oC0_yR{I3@QHHl2%*JF(UDk=01kNuVq~xpH>WS)-d2e$%0lYRmZ0F~xerQN| z*#Q`Zyd>eVtkwyp{DnB4BYVq5j1lrs7IQg~DJ~tt1Ik5$6-M4@FZ*ouRYYi3Bg~5- zsYKV6id^%~O2DRfTKIvX*~2zSwM$o(AyM44m)M*{-MfTorZ1Dvg*r3Pvjn|~Fso`Z zo5V?QTjRX5SAxT9M3^dZL6y#xi@Ev(bD)pWbfWG*XMp+ zL~}|h#Mb03d%B&Moe1h2Ht^kb4r5Fb)G5Dsq+xT}>G`WBSqs_8g%yxw~qG;BUsXadm7$lyit6zaM!Uxse z(ICJ;5M%nCefN%nH7O_-fBm7PidW-V(Q#VAv{W;H3c6kWBli;<4|A`L_}3u}iO!M9 zNswYR3Pmj_YsFA*^Ur9U_X?6J!05uwI0_MXweh0MD#$0-eH!{{%w?%+tJAqmp#U=X~F#|Fa6Z1)&-ltJ3~W2Qu43*5*w+t-0=)?) z;gy~@D7S4WAKs6oHc@8t*t!CwqPs>$(O@IWF0P%9qvO;TC@aS?hqhtr@PWKgW(2lQ zNfh_?6~lS;W|x}E`y??>YBRuC(4~d2NtVN(z`x!UD>k z!WGp|$;-TCNdaj}$#Qu)Bw12Gn^N*Ic{wy$Qb3$i@)zhol^2)d0CJwd1>F0 z56R2IWXU0YOFkekZ%UTDyl=^=@^V08n-FGnRy7W6IY^_7)Z!{Tt_%&1<^OLH35#=0}*gim&Ztl1{MwVQiG3Dyd} z;Yd`!P4JBsqqtG4`Xgtc3EAoP(0A}nsL`U=NhDNy3ck6kfy9N8t)g1N;lh~au2yik zFq&0VD>!@|jwv{N9gYEqug5XBy!<*G8znEl4#!5y%df++5%TiuaBR4|{5l*PCNC`< zD=!cn6Kw&9tp*D}QG7j5$dclb&ZYk_Wyt;s3Xvkuiv(7|E+Ut8ZpAcPGj76ZYH~?Z z>zIgx;uELJLYDcaua|B4icj|w_g+Zejege`lnh!WIhc+tkVO!$An3b@YmoJ_7Rx5n zdv%RhZ}I7yea_Eu1);od+&=_qE$ip~L;R6(`CfhKuz)UZiIs{hTqB9=v!hO!s8%- z<4wxR%zjoU`b?MC>CrfvycSiSf zw}4ly?=BmB)mgVFV$^$Q#Qyswm~_$Dk74hMD}7rX#+V{M)Ax}x);^#|Z_K6i?h&Z>`XkL|+6hTDk>Gy1JaUTQ9vFG-d9c8ohcwo`8BaW5ysGot_bkon4Gd)KWWcRRO> zJ?)HrXLd^?TH!rV_F?4ov#7+o^!LdI`&Jk09MEfBK?9m4JOh;0w8`BwT_+}km`v2z zl^VB16{lE(ThDjvDCg^=vfR2T=RXX4=gmvmUG$kBG7k48rc>Ay*~xRb`>7)6J%X|B z4dC3IoAvfsJd?fO96~}Oe=6YuK0O;causS586)TE?e}deiq7kHfhx1o@7vV2j}q;f zvh6T32a-EtUr4!pRWAEERqm{lLe}}%lu3dXd-xXn8Z?e)+EFe28ABraamqd=>NTcu zs`6;&NX~k==9HV)!TvWzh}4fV_F;weu4W8m$p30aec)drVN+!$gz>3FS1AJsXsDx!8uoP^Q>>_Ll;D*&OfIQ zr99m%K}EIGHm60zl6#@;&o`B@`9l~H}G*rYY3wl^|)Ip5zkOVjg~M<%~^PS1M{qqI43%=gNg z+y3fe>zC1^Is;9cp#OO(VP2x;M0c$wI!a-3wF z$HBOI=XzV|;-t1mTb(_QJ$w&*wAGWJ?3zwjbEoThPl|mu4vCZpkwd7(p}c;#w%R|A zEfz;hqCX<}&q@A4qAK5&H0Vb0cbk=84h7I26$Q<%;9?oTo8+TO{qxn6$Mt+~oEnOW z$?v^%p02!LI0%LXO!)wpwk{Srfx@*?-Rq%7lPA4(72S5mJd9LP6#09)N8hehO@(9y z5KW*;=6Xj2i~()JUShxd8e4tcoA7FqHS;30O~|Xx*Tj8y=y3Z4qu>WhLtUL6dX0NP z;p0(M)SE>`T}5-sx$*awTJq!E1oSqA4!!uP-F=3mFNbLSqU@_ZdMgNSD&6kq?ih-> ze?>9(Ajfbh?L2y%4~QstB#Upgw4`v>JTQanHJkQ-Ciw}ULA z6VK}pkjJ1CuVP&95S`#!a}w2}#Vaa}q?~`c#tGf_K=JAF@2291oFDuYT~4l3f69u~ zY}?e->SDVU+RPcl&I)KB4kWs8F)?e9m(a=f(PVCl(}jTE}Aj@!qeF$1~P= zJkvWKpldDTQTz4dQ6r{!KkSjZCl7dfW{$|Ck;lNV1?!MTdyVfGA?cjDX*j|i$_vhg~H z*YSfS>ztlD$~}FN$0#qTR$_?#$o;7W;AZzQc%64<4cZzz6alX z5f!U6zuqPi`yZ+|Gi`q3y0&C?_3A);sQD@*HG7tsX75cqkR0d4F|^@R=d<*ORy>ld z_P)dxawM_gtNJd5__}aoCr?l&!Wto_gRx_|L>I)sXio2dt)9^V=VHv-Ny=u^yWZWT zhyd%Z&BYCRBVrEWib98MF5CM!DRnkB&Dx2Lp4@US7T%%OCT+q-HWx_kQTlP~N2&LJ zwu+(`4plHwxyohO2f7KFP*mqq6o0)Clk$Ejh=aHnR!Q>TVIMT1J6N_g5r1SA_PrBkJbZ4i#Dv zZrbY9p)g#iZCj{Ddn%jbuJ%w@zUFUl9p3hdQamQ9L#ZP-wHEK4om0F~|F9yjcoU8k zTQ9<^;=YRhxL*rw)N9Fj1lMM4&o{_sJ&JH>LhX-iqu`;|r16WYOf-O;N83OQ$2ZR? zvt9jkTQfraPu#_ya`}j$SN_P)R(c{M3y==7EONLjC$J(=J%5FKTTaW~k{@Txxv~5T z9Cq}__^+wH^?FwL6H|nfs?Z<{?cm8y@#gmKro-|k1>w$m%OtK_gL2lQMCY>UP&g-|+$-QZ zoF|3UnbAXgaSjoGeJD2QsX?IJSwT6JvFch!wCz!7*VM5djGoiFZ?w=U;C;Z0He(d1u{6%8JqR1&e-Ist zgxjRtE`T%6uscUbvR5;&^lfdQX#SJMHM5p`7GCSB>5spgY#)JM@HMm=O*701+x9Xu z8eAyvh+o7sGn zy;H@Xpv5uEZD!0EV+*xqM_KI64H06ppxUQRZjk0Akv)OS_AUbD*I84)?9Zatk zKMbvOY3twnr`QyIW9(?wbpqd5TuVcDF38_qbqn2>rvK^7GY8UQu7wwk)`zY}Z<#nT zxX}C`HgSZ`bM{XG|9R(=p<~eF%`VQ=#dZ!#>~ijMVX4E)=@G?ER6tQXoQ1%{v(o3R zMF|eaMZ%Hx?3Ym0nEh>6=o}hwv!cNwjL7j%I%{QGaAsm2z*)>AFI+ffDt|^P&`If( z@=_r6Il?xoe1Tox)3!(RZ!N|_WUDp-h;7kNwe3Z}%56MsL*Ggp-->pX+6tf_giAs` zS$;_*dqHxwuO)nb6M`ml3cjQ{41_Z9Dt+`fdmxO9}2@x5nceIm#F1tpP4{dY(-H zcf6DbZvZwdF+0WnT!5f0I>dGfSlMR|$9T0KY!_y?ePH=6a;l7+9YyXV<61LgmKNf~ z2p%_4N&>1NbOx{MuF$~@_Mm>JFq)6RcB6+#gq1{^JRXKe%$eecTXkv2--n4k!(TTi zOpbQ>QE{eoeqg>=!O>1#CHi_2y6w@y+t!&}Zl-62d2@x|y1DL! zs0oOpHDj#s_!()DgcE;M0zc59eHbK~SzCw#;zGwd0!1#V4s`e%pd<;-W-%S?3wmatpu4MuBx!vl-!jrdDxywSUHz= z>M){%>yfR96%Av#B?daZcb z+TMC;3jXV;`PVn$;H$A)X|I{$^*Mfpw-=|DawvL`nqMUH^Sb4?VyMc0k>qE}+Ui;d zNVV-Ewjv6mK1dGz;1F7L1VotdAwpwAq=l!^hr|RBv1o^hTP(>3O$kejxlz>~LC^ZJ zdOG+kjvpC&`NfzkYG^&Jl_38r{phroJM?)nOkHH>k)+(I&vVB!)s^nm3R}1w zqQrhmywCksviP5uZ}}I|gi_LY&IbQ+f)mpU-_r^|t}y!SSo*B*69cli2$xTYj$3Fd zVZ{)a_3^JFYDI`nPsL9?nwEA-yC({|SYT3a|{GBG6Z?ga>LL~Ma%h~`cqm- z4BrFtJ)ky7j2>}T?6>XmqD3Z@oX-lwBa_N!OkLXUvqdK;g#p9u=n5G4Pm@D?zwyxG zED%%qoMDw-={J7SU{_2e>-9_QqgMDijp%6)Sr)tXz*?{VN#w4b@n!Uy9xP@JdV{rS zE$h%rR;$Fju1sjzrVvh;MrO~GpZ_5oyjawu2v%_?3ly$$v6^G9bhA<~rk~m1P-%8V zrgh#TeoOO6_-dyaM*rY68O`iGy!ZNTJG{kp!3{F7SoFBM>k%=iA@*ndawRQT;Vs@~ zslkOddsBIql<8ygFUj~Vk&py!K_(1Kc=~%BI2eEKAfY=ihI^(+XchJ@<=-aU%rL!pV-HkZ%~HYO;+48>JhnNfv(U(?N?Uh)v6Z~ z6ri^@)WOOk60T!mL9{L2mEgYS4(GB}P&e(Kpgsby; zHhu9=zS%rKVGoOQa?KeYMkajOOS}v`jA!#HTIeE_19t@(u7%-0aT6$8Cvh}>VpOgx z7|O`&;i%MT%yRgQY5`5$f2a%lH02*(v`2kqhSca4lJuHj<2QPk=dJeaXtIeHwNMN0 z<4e$%Xw7gNlkoW>PUeXUFqBE+Ggbvo@i{zS6r-7n&w1sA-Df<55dmKDde=ux0qoQG z@lX5v{ms8@`HO#<1!cB-n*92w{r&#tUrzd)f4Ko<1kr1I{LMFuzxh%$x27}tP0U66i>y>cHZbj#=X~ljmYT!5w2=12&SHr!geT|LRV)ONb<$`a?F%5^ zF)6-)F0jNn>@Ox$UL?g!N@g}ixaP^52J+^~8y|!wT~b#kQ&*F+Fqy*Al$$3hI?fr% zkxjN-yzdx!6UmY-RSB)jma5d&$cwncwvl9M0KIXA)>(myL^BjL6x;(6Vd+&LtXwK+ zEIQ2`p3*bvZhZfbMEf#XM{o=UB<2L#i*?N+*$GE^ay=K8>CJqQ064DNumsDIe-iTu zA^-UNw#HC>i{Z}dA8XIR227@$&h91izzsbomRh)mP%upGd7EXvrqCjv5nfD%OstiZ z!$=iHqO^%eP_pP_@_mu;8>&-dhH$&WymfFZUG+tbmsHA6IAzc9 zl`R#Rt6?$LjiR|;qgpzxLIK53+{)>j)f^6H3S6PJVWEn|O9OY;QnK~dBAH}b_(g17 z60Q6&ViHG*5tH}YUou=7VTmN8t&fJvaOd7D*qVFsbd)(MEx*#rS|)e>Xf#Dla# z|0G`Yu_A3MRb1fZ(0g$fB<7qo0s(d}h~T`&KSQ)W%itW!jEhk|)2rxG8(tX-Gdowp z$@bDG?cS%v--lp&(Hv^bfZ?fgF^A9aDnwZ2F{Ut~O36W;x?jF8d7 z#TOYXy3KL(meYao3G+6e+jjG|klQpWBJVJ6v*gxTc0Llzkk|2X4>k?@9=+Wrt9G@3WMn{@uY{>s+ttKQSZY%6-9e6DyoMklOj${xfr85^>B%qf0e@j z@Ehin*f~&o2v69@q}gi2X?#-tK```ii==B$oT&}(<_@$=s||nNbJuR&t&tbx9>p{A zS(U4fd-+!z&faI1R26zj26zozaDqNeUH&kFOX~pm{ce@neXAjjh%A*ap%03*fF!9f zvQ$2)Rpyaoirz!(RP|62X#%b`dGFJKbi@R@KDLlsH5B^Td~VeM>0^g*tA!(uWi433Nns$*)9B5GK8kTC-LEP}!! zEXaf#<~P*EM8;ownbYe8#%aO3%%1cM`Yl9RK{B_3J};TKf>evmTS2vj=B*&$Ty<+9 zsPPm}BtFIk9!sccQN5Z7XV766iWA?t1)SE_SF6QETfg*=U;!jZ7BEgy=%%zXK6{(w zS~n%XZAWNJiz{QwkXx6=d7&-3SBR0>a0@1aB+z<~zF!NES8rup`e|Vo4**#8#vB*b z8*^M#Z_IH~y)nl{^~M|*=>uPo9{Kd~GA_@B8<tw2?&Aw7(s-x0eHI+F+ z=AjU=;E1wf9w78!Tc4N!Xg9Bi^9Ta2QN>Kf{vfszU{McNUOXCg&{NB?0c!Lg>o>( zVbO^-^Wd~$4i6C9@Twe+4RJyAsEV#j}-%SnI(vQeS?g!K*Je7+lQhiMFlzrwhJa|=za{Ln7 zk83qW%%D9|v#dL~4d$-s4C?4b5IL!z_zfI^yzj>wuOIJ(VmDFTXi_xII877%Wk=9; z!C$>Vlo(aQ`GMU-c)H!l7WyJ}`fQtFdkJOE`qc-25N_UaZo2jWr{bnz@eoojBLVr5 z>Gz5RaY**~=iEGgP@eFB^7t3>bcmnn$d9JWaXooD@RTAxvW}CZ1C5BTt%x!Z=WT2c zzKGLw+5yzQ;u{N=KU#hx4SmCEvs>Tcc2b@6Ut52fzFS24n_RXia|l-f$1Dn4ey#h~ z%4!FLIBQ^NZMAIR(#o~kN_8irhbW1?x|s#r%(cNnvY;rBu2`UWk6+)WRW0iR-u02N zj1~bk_{E|4Fm+LD0OUzVFrr2^v7Jg4diT!1|C^-I#2sJc2d>DJp>K7v&x5HHW`IKq z)|U9GBF?jgza&}s61*}u(75Rq%VMj2Ed*@l|iF0GFdron@i6dxvvx^89Hk|P_#LlLp$6xF& z?wIosUMij2iV+<8kr?Z>t&>6fhL+W*io@w+@RP=ufx| zSDT`5#+o!v+T(S9q($0>ZhVclyHF-frFQ{yQxZTKv=myn7zS7kJlcjFL$0p!$Qa`& zCLD!^aB$aiFozz0_Z$`84uS5xvv{GxmKw@2CyhwhI+j`jP*LNGR{VD#ip~yWC0$m! z57jDHWa+~K6hqjV_$v+2N{c^3i{hglT|l#ig9@KX8Q8O@5Kp0MUqC0c!ojEHvglPP zrf4(u=MbVnrY?iW&fjZ=m+N7owaVS{HpxgcIVyQ(e!$>Lqk8!03v#xS>j5j5;-h_8*O-_V@2=RFc$qSa zTMsU3{gXwqwIxw&Nm;(pTGh46n@&RD8nns+t{~_Ft$U1HQl2tXSigT9Sz0A&hT^-uoHy;b8ODkbY5>gQx%S1^OPV>W7*3f}3$qe0 zqe>lrm^Zx=wDaXrah5$1Jb`_pr4z|){&tVx$zS$cSr`0eAqgQGux+jhy(z3hM1{@u z8nYIA^`%*=OmGJyB2<) z2hLjy^l+Zk1xLySf2l3*i2AVKs1{c}=(H$aOBUedm$tzU@~pJfkwMCqN8LwWkQM_? z>6b)94i*b?hL#9%VxQ5@(3C+^!fCvxg3Q6cWfx<57VC>2(hmojdfKw?G1`J!iMX7n z8rW3%28S#0tC?x$ha(YF9PkHex8fta;-_hWRSD#Am}(dCS`_>uhV(q%0&x)=RcX2b z-B9%&cGkrI<8F~RnE>v|P^B_ZgY>~`jQro6Mw0heDsPDbkrJm{;L&cbd*WjE!avIh zCI_c=;9~7&)x9TiNxcoBG%l0GFnR7fYM_IcT7Wcyi!ETn)zi92=Bmqjq$Rldo3~l; zC`C>ZKXs#tb$#)T^JYH>`#${x9|o~{r*b}ilyMaWXJcZfe%DS>n8mds#(;Pi$3;e6 z-|-M#6j2`Xmf^$C9tL6vBR|8s`E7!`2rG_*9+9maJOaj8N!Tsp%rKz0#HW$Ucwq1w zpEL!myt^3?34OQ-A=OVFfB@uZzfpp*!Q*a{YYDRa`}b&t2(hM#M9$N&{xWGUl=Rdr z4B5>u9H9nJL%f9)MCzR3qTCePoG0fb2)AK=Ha&zx5iNWhpgr$ss4skw4+BR8!zTno z_4k=yaX~WO#5FZRZy_|g6{Qu?^XF=U{#gmqY^cbpILbaW!+@aA`R)YcAjYzz;~%mA{$GdqKv_st1lGyBfKgD11+^41>=I(hsRVIKnd)$S(hZOrvq}(M z^5hK=mzZKIJ#qo&(v=)$u}tPtaYR)TiAdn#?wH@0HCLvNQ7vDIuYi9N$j#*^=QhZc zDYYoc*~%9zVParz9PKVUz|W%dH!w z$}#STala|xjMp;u5fu!XFK1rO$u_NuKR8LvQ1vyeJaxRuAC-CSW02>*BOAZ8@&OhJ zD<5fn&09P77%$`>w+GF;wCS~>|C0P1Dg0ipwV{W;W4=lVwwsGiNWMguGhcsAbvJVb zS5tlySp`^W+u)+_DyV>kr8$3fno!Z!tKi;^?PfJmsp61{t#aao_$Ts|S+goO-mD$) zm`F6QMq24LUXT`gjfgbRZ>R=Z?YhZo*D;Q8-I0ihRo!Mhb$8?yiJNW46G!^fT`h<@ z(KX3+XZ+3*staw-N9}f{EiY}MI%a`VJU6&6r4S5Hr4)7F`KI-$kQt87kMfcQvCSN5 z)yBC;gwsUk+{w=cDDV6gX z!zHJ<&MH;XUtCvSC@9uJAFcgDVI5}()3WD-rntG2s)VVlt2peMyFqY_vxqj@?=u#u zVIs&L9GF`Vuj1l~ERY3Rxb7|r8r9O2_`jkZ88H4R;vAo`dI@#-j2A_;>ocAo#wB3P z-^_e)MHUFSJdqcr4p(HkTBGoeU>H){q=_yL!oyPI#CXk*%&}B6{!C=4d^}#HQDxZz zwLHOt$M!>D-lHC~*5|F3Mak+nRL^9_;aM%Bx-fB4d_|6`)!__zii*z*f9+e{DSBN9=x=X_0$7aWz#1dwW>JsiJ0sG4bZ zQq^E&V_9AwFn(bG3n*LnCJS}^#ak=Z`;7GhI??#T4i>BD^!T;c!41?ZsPTr|1p-HP zn{0a6165%p9rM=$TUk(LoK%7Uo8=C38 z0<;wPLdOVGaTrg$e*NUc__-U+F@SvS<~u%p!SAV#rv~%sb@NHuz`)h1#OGfnk(}~j zrr=w-y%YKxmVTL{DHB?FWdtV)k?(i%6F+io$^`Gb-f>>_uADo@AagW}Zd7aJ@rfT4I}B^5ke$)yX`cn|Ypq_PgGZ!{Nk!z8E^2 zt5yB)WS$ddp4V_3;Cja)c^(}gv~)_I-@s7O7`ni341d;d%pQyxgiHIE%|z64X)nGT zDBj1V)>pij#2T|Jp2}ldSf+y~zfBAOi5r|khW2Opob{r%)lYuL+dW!MG>xD7GAAB3kfJ(=saU#crj?tg6;&$4HvuAW3v$#^!M&lYOAY=;Pv%a}CjE;%wukL??soH>M5s8+YfYfc}a= z@u@zbClZB#9=&HkuP{V`{%{iX9}DRJKDaXk)3O-?AkXb|2e&D(r>Rd2(Q3}fXv`j} z)ew-+xF?@js#&S>0-!GA5e4ir9`*E}BmwW1ADgMWwbDk$^&_p6q5LPt{5TWzAn(s; zC4lh@t>km9_h3e@0gDLxxuHBcYWXBT42vbN3Lb zf*-ABsx`GGRq*4lW-8PFu$fiihAOX+MHL5os8fpU)Jl(|Ro3~gGQ_)7rxBm`&aoh>*mccKb0{wQ}F0^61(1r&7*n&7l3w==ZTVaUc%Xsj` zaVNMUXi_=_d~u8xG#P85iNcWE!Jg9bf-ee}sLpXGeydBT6q2NH=_YQz9+za}m-rOM z2wWNoE{#gTr5}AWF3D=HaA{c*mzMP45(7%_SdwK$7CN9gJ&T15XwJY2631p)i7VxS zm09J8rmhhwc*Sj!z;HWzD72>AT;21zWpyWYS^>9eeLoMs_`vjG$yH~#B3M*6B1x`B zTC2{eUi_oBG3VS`sfS2JEIHf-R(JrgEIOpFbXlto=}|LTuyC`PDp>fwnJNUS#!PMD zcDtGS5x3U5wVPXO-2xM>L@?1xd#|Tb^eL!Qmb%Sa={EB&s%j+dB7}NiEP4#ROPLn_ zp@p$3XhiCAHYyE>{4M(S{|a9PRmXy=jyq){sQCfDI&ObYuzDCtlC0*3%z?4P%}kEl zqf%tE;Q0tMQ|b7TR?c*IA1cblqPd6n(ZX4P!)I+>9v*^l<~;q$xA9kvthoCV>za;s zl008;UFBZ>Zs+-Y{=6{aK`MR4yP3lCe;b9_22rh%9crMg(VY<(5-7vh=q4X}TDV|H z$F8=oyp9bWCOsR*mleEqdJMbdHIb>$I+P2Kq0f3F?q{>Sxay$VmD(b;fsGwZ$3sZK zc}Uz-xe+zkU(@Z&fkDtYi8!k^zd-6Y!`5@eVa@lF^rfBQG_KNz|UElGXcWezys}d|W zA%Vs7D&0wBnB7q#mG$jx@_@(<^DESs9XXd*sdj~jbc(3Fw9XZo{|jEZGUh+bC8Yyb ze@il!W`18?bHn*kfXQ1~fN>~q9GOiKRh4m*s!C0X%ug?qGq+uSLp7RXbcY^OX{S&zLXL5e^#GkU1f1h+ki~SQRWCT=$#;*x)tlS~9qf zxl4ta0tv8DJi(~q=xcFY$w}i?*hdpL60x;->8u(=bs~AlQsB&04dGcq#;^ZjH=hZV z{d)@yAaa!jAm~bNI4W;&a~C_5PO?NJx|`WH7tpHu(#-l4WRY}pt`NWOHcL5QD^aD@ zi2XQEMyfP(810v%28oIL4?v5y8&ZchIp?n?s8v+}W>2d)+u&a+KdN350o9L2b}^gZ zrKyB!UPVe6b_x0q2*r7wT++QyNlPAYx^ytE`#hsAWKLdPjBFi#J|AJo~2@eh4!8SDn)em&xFO1zRi7Swj&$+O=5T z<)OeWt5#`~H_T!&icW2rbGWs?((e=lAxF-C5-o{-aX$?lEkz?jHCufV_)A0RoU}=B zF+Lv^VyhvX=1N1*sL&RP<(D`>*9uKEDO6~JLV+NbR(Rb%fS7XbCr?!|I`5+~1d@07 z7o77MUJlxDrE?%dtK7)M5C{E{YQfOH^IOqe_k3BNg>~T$fepdr8L8lYV%uaq{=fRr zgHq;&BRgbG2)R);Ob#WNZFN`5iL=8U`kY^XNY-wds_IU1n_mij?lrvU0PB|+v)H_P z-JIWuH=9Lr0zo-VE2NTAU|2G^)FJS6gk|~xQ}z@}e^wLARxR8JoTTeu=?XH`gj@Kv zsmb;RcZrATzC}Of1BF+dVR({&TcqGjuy7KQLCYFXL*AMmmz8~g<1I;L{Fc#b|UHCX8G&rV( z9)lMVGO67lq%hNC&ehBuuF4LsWbj|e%Bu!!l5J*Aa*Mv*G}tsp=FipZsT<)KWszF( zL$J_7*TO3vXGmS4F9)F0W@Fh9fMSmL?0<9CkvN0A*BlJ-E_Io57}5F=EfjpzLQf+0 zPBil4GA8y99U$6ABV9EmJudXzKI?@)TYhAzSBlIAVNWg(x%lC#$%jF24;~OT60fHswSd4QKC)=Pcq z19FGvbq{JzBmtig#QV|1h1~mfW0=ZQJwiP#9mPfPRpH~{%Yi+@@r=hGwE7EHOci{5 zPta@}?A85Sw8%R<-7#x*ul!jn&WZ|=4UnV5N;(}0}D9!xYAhl*? zewV8?zjv_>;#C9I^B0)j3)S1HVrC!T{JoyJjY_znV9LT(aSLEtK^pz03216^Z_z`< z6w*dHaD~I7joI_nYM_?Y*qnV7NnHpg4wM#sbs?C$u0=qgnM)*V<0aW>4MfaY5HV*# zM9l&KD?Ja+64aTgnP`&&e?>=%q87cRX_Ldq{J@$tlZennm6A(J5-0W$z)C((*XD99 zzq$`TK<~doPdF9ByqKN2_UsIJvYz}f*1M^JiXP^ojzcYuha+8>tBBgEc*}-ho%w(_ zq&QBw%8YmbH;@mQ1WEBo=%|`pd6L_#dJPGJK+oJdm1cI#5@@oy`=Wn3?6tVln@xO4 z*({(`XfgRSzg@JW^-+|B6EA__T&?tk&ZGW`3i7-~;&YiKSULDaKXD^<6E^ESeAFDU z){cB3#-*Hz>}7^%xg_O6k)!<8wg*3An^NR6>`Nq!5WG|=74^V}1czXx$z0{i9I#`( z8a$%iy#wsI;n%Y1CBxteSqhs6|AU%lrGu}vo;7tX9eg9{7WP}4Qb*2r%y)33rCU7D zEmF1wbI+y+zlU!>t#UhD1{*Q?%4@=-)0DyM6gp08()WfsIo5m+h+xe$M&&d&yvdv| zR!Doyb@3Hd3dtzAR9R52b}f!8f{X!^K=!%9Gv>@tB}#NiwvY0kVpscZ98k5pt0-02-oC&gR;4e)~ymSQ0iCooIF;mQJ zAAq$EJq=GHE%6fB^nIZt8D9KlI?rl_dqu{n748>#rfhPgMQ$vz62C$X1?7s9T(!a< zJ;%huEYq4ln&XWJSkbk6|LW2TPiWIP9yzTQeufw`q2)fzF6+29^)s#XbNS6JWHcGk znsdQAJjwkOyUQy12n!<3yW;770w2e9_t8wQ-}UgkSp2(bH>_6QDC`8lU0_CsR@lY` z<}>$6KJf)m<+=2%dCmPHXa>@32?`sT*^g$+^#)aaN#-e#0FjML2Hwqg27jC>{Svlo zYL$|6a93Jo2~E^KVDMiQ;*<>jw-V}tSS&IH4R-)mFbR-W-Y&zjS8qhi1;3L)2Lv9O zez=*TNXRh=eKeQmyQ%8D_3^c#VtiT%b2gPFrIb~%0d5&))T)IU^H}IkT4el{$ykB1luu$@g>5d%yU+_kx=#b8xM+OrDeF7oPXtgb}D$ zOnBCr0wXk(B!HVCY8*!8T7~RwdsF#QSENeSr+ZJxt>n*U zvX_7`y@vp^hyXu)vR4EM4Q082pk*-c__?F}v*-SbSe_zyiIHuQ`74!muPS&x>4n!8*d3 zTCTj#<+bHNBt5uUP;f|Z1=be8D&{Y4DIa3`O9;_;kw9dJ;EqVIIGS7-D$K0-&7&q6MVH}*MIuH)I*Nq!9!z!iGv#HQ+B4^$0Sbv%`SF$Q zOiufph9@90@aK$29_?{V4Y46tjz(S&)v56*ZJ`ARWSP_M;OOE$*2Y}PTG~wZC877s zOtLUGk%L?+$K((?7;0JuUl(|Mhs7yCcYY(YTy-Xw7%BZol z!vx$RmI>m{LEngpJRt`OSv{+PCE$9Bu}rA*_3^ClmjY0=NZ-q6?%km|C!Eln-!k`I z;^Kw97e1AuXlWY$rHD|5zkqfsEz7(kL#SWMd?j&^IXpKt>bd5zit?Zw#I4~wyXmw* z5qX#2_*s+#vS#_fD?nXiY!@mi-w9^3M)= z(IPKSBwzUd3<6L7GYBkhjL==&BxV%(+P!Y6!A}i^gTI^!nv|Nx$95|6|Jfl{$JYw% zKIR?kArQa8Z!nrBPDg}mERLbSsI8wb91ZfM;IJfuTZ*WeR|7RLN09;!E{=BD(zIU_ zvCb63w)S^Dw@3u$jqT#OZatx2(ErZJoYP8cHrTyVn{`T(4FseOG7s`7K{ImB(J(5{ zi9=43Y?`G&d&NQZt`w9l9sCAgC7&>Tku@ed=e$lC(u5&;Ma~$wmqUQeg=YFDkTtZ5 zbm&{`XmUl^9sI6ny2?_ZLXIi(5VW>Lw18vm>Dmb{%+DYi?EF%GtrTxx;zQ-5aZ%3cUfsbqU`O5#Y zS3ldk{?NAp^g+nY041sWSLQj7qZvzXMRvD`?V**zt)$qpds1xKeq7-jQ!h4EtBB8RH%5*cZxn>3BZ&Br zns`(5m<(^8_lCU_*wyev6L!(h#bw;`brJViV3L9P51 zQGpr1I-nm37(ZvXeK1hGSu_4fx7~UiSDU1~Ve{#G%7}^MG=h?o-jUVpQQn>tA~_FgIX>dYkRP zNvfQ|IF}p~{;i;h$E$fd1oh4G+tAL8b_GAg22~nO)x-mnk08U7F%g8lX@m3?_kx?o2}$p;hhg%=1SZeN9Qk|$9yvE(no?jsF}=9s`JrJlGzYlN zm0L*}Awz4Xj9_-*?Wz27bKF8*8Noj?f?vu9%L|!U_pOv~G3+nNkem8>J>T=&T4bn? zQ5{|tgHeQ{p{@ZU)SM2RCN2m0wj;+l3vn%sr825Gk`h0I`&*Cn@NddL^SonT`X|Pg z$Ot^RY!H)^(_W4!j{Y;Z97?iv4dZdu(!iT>M!^UiX%?{Wmq$d2E7S!SM$6t% zcYAeXEjLIDS8|E>+sVK&)*kRz&b;n{r{fq>DztA&`Nb&`C0sl^Qxn8?l?OpzEp(8nObxs)vD2$h>BX6G7H{_$pn^Y%UxamXSk!*~puJ$%YYUaent$!9jd$rjYNs_*(k7r5y z$I4XiX}`R;+FNs>BG~{xa4@;%G$=DG8LpIpjYrNT7Z&T>U&hxv@7M~aKg9=G#dS~n zbXLvjXehPF56<$OfvEhfl%EyyvsixS@?*#}ldH^hxlXjMqE98y!?=2DJu;Khs;&ln00-CtG70sPqp$XSvute4nJ~&K`xzM z+>Jw0F&OXRhaiK@IsB4o_mF)N+57qzWqa}Z2P3GFn^!+DdsKMrls5G!=!Xxfk_4E! z&8Gf&-n6BmFVDM6vIGug-bgks|52Vp_-n_wEqU>0y zsi`6?2YA4%a4!|S`mR}%LjjX7AQLNj^<62f-pUQ66Ngb+*vU6pauz;EXS!oz`sH$t>KSL5l44w%_ODkNFVsEBu3l-Z0waw5OoY5JK6%;61dZ*>eecL9Lj2{(9 zAQ|Q4*#%4YPlF5}fAlA302}(4JQ`m;rko7%!ss43jDAHANO@GG&9N z$l6P$JR^jD7;|*%sH^PjI3BXsLDDP>pM?1HW?!bYRnP$NmC#fA;ZYOPS$14L?Qf9t zL3~}u>{}RgD|>DG;7~A5+lv{854ePov{#2^!twYSP<@+w-MnV7gX2woM;L?TW2x7b1M&X4r&Pb4u)*85O|lDbI{azRAWA$0`J&9yPj$NK5P5V*CG0$0v3%( z+Dah4m$vJ%fMZkch3?sv`G*g>9e3*A3fa@5^@!@1Vc$Wz-g<|gFb39>v2~b3@>8&k z0+tL1z04rLwX%P6DB1N6prCU5cr}67arCInSkg-+{VyJ16x`!}p#y+l#Tg?7`QASU za$X4FWmBNHljozO49dXy=qBeZf2XJNh~t_5Dxu8nMVyaboUoVi`HIu}^zn&I2fw8a z&@?fa==!No8KRtrI3GRa6?1aa!Hb{xWW%5OBqB_KX-TF4XQ~IeV^%haA_7`#J=4<8 zG=TIeRB9cVC{A1D|Cn;xqVmW?dfLjDiMUSQp-;YbT6B#w19C=@8OTW^ z94xuS@aG3>r0fYPgXN)y<=QSw)>U&50JCF>3B(i15RLvMwX`>I|W9?A6`U zXS=SQhxF*)ABYDP*WV8bq4s2@4X?BKyrEV%-ex?#_ncjR^L$C{PG&MW|9FQE#LnX$ zl1ojqGl8GO{d?m7iQ7RTxN649*`2(@GpJOy432`Wv}2L)2DDNqoKSt6n)S<5dv4am zTczRsO$eA5aLKN*YqS(rl`Jg#shAd4?-mw`Jt?>=nt0Dx*1~K@?KlV3uFAui7-E-m zJ-qmrjf6!ddag%-0HczQ=0+(+rP41_QKX7t&@E@@T(c&a0demn=cOhO8Au+Pnw&L| zJSsK$ERuEiLT3IiG^cEG$X>5SBTuXHhE58XFZ+#u_#}TRb*u+`{R($@Tl~$SbofPj z^(Q*Z1?`N^KkyUwz3TMzekohWJ5p7g+O#nPEuNN|Ja!;?Mr!i7f#lh#$zO8&7cSh9 z(myF$`d94sZ^&QSKbCKk^ueCYgzm3Ak|a@>&=c`{JAb47JLdH7#QPq%e>qjjmWkb# zf%eMb1^j)*PErE{se_PQlL!r@CW#fv8zEHz8|8pCf<2*E9?^0UVphTakeR!O+Fkzc zV2S4{cR-o>P4TxT)K~m$^pH6IQMXLKBxDai^c|2ZI>EE%k0hZnVseG%Gbmt+@!wI6*<2IOm8c88h-_BCW(G$AUaf{(*~kB61_$H zB+QQ2;?D?Y30B8?ErL_rFX1R9^%WSea|hr~SRL?_Dz^&f&r?3Ua%&NR3}cxH0m6&7 zzbS3wzAKnih8@%+7${{s%cJATsP`Skt;K8%`8VH1lcKO95zyZ$(^ap5@Q zQLaH(2w5Sfq;QWRkT0%qz-1!f6gNuPLOy{O66?WdYDiC%0ri6{nHg`4U)m)%rup<`$lSipgY&3l2uCI{R#RP7D>)Z zex|Kt_xY?8F!>`Z$LLp(2y&=|#IpoRU85wP)SOP@eUb*YW+zEJO2I_16sT12m4ep% zlbj7HE&szev_i*3@bOXLNR-THcht`yV!%JUTsO@ z4kuaLWfuusUeGPvPFt29(NfK4ui}BfMf4se-jCv9tzckPxa}a2a=xqFEJKsA=zC}` z$t!rM3HcmOo>YUL`(pH&9JzIPa z`1_wj3u-9-G~;5iPK!@!Noh+xPWx3wQ{P@~-$9{9VlEZIKr9x_g&I4tP4)D!W8`5^ z#xXA54PQGG2{(bdb>u%5M8z4u7Wqw5KVsb(*|xlA$|^uII(0&jVzPnUf}Ov_z30#- z88nLS|AYLnS`;=o1ik(89W~yF#z|u+T-w9yoJFCu_hbgDYQABP;A;OaZ zlVoinDI^7$oVeR@UJXpUkhi%-((SB^Nzs9{YvukKTUdzRN}ooLoZ)otg69cfM=w8n zzXXCteivJ^4wS7d)o}B6X}Y3FnpI56oO(iLGX{@l5OM5Cia5rZL38seQbhndfDc#) z_mBpYxIiDO*AE*yUt@Jk^-){FLueVqJBc}xB=%r73seGibnkyCxz`?nE5y){OvH?%K7O4Q*OEY`jd^HONKFRky`J9N6 z_mVLSrss$i3%jWorY7!HX1u`>3-#1yIA%TZWvDd{F@8}$Oc!g}#S`eH&dwiXDmz65 zBXxc#3wJvC$BhvuSP<(JjO!kwY&KH?Zlq^&N(+R{7PKTyp9tM8URZm z-#eH45FjJ3j`yj*GiK!s0T7zhjnihB3C1mz!(kmF_aWPG0T1Yy$PCX%Ib${~PW|sehF;(bE+6?7#{t4mzPi zJ4iAd8#*v-C~N&k&YXH5{Ya4t8|+mfSO5sc3dl=G@8J=@Nt7oQ+7VPNC8g*@6ZaQ3 z(BIB>=`;eb)Ys{scS_%7b)~K^Y>!e-*q)XxO2f9@LoB_JwEVQy-vb)+<}~Rrpvsoj z2u9n^i%WR!k#}WHID43Roaj-aGk?%XbVfUjRp^KMJ{aZ*c26FVwwGPOcU3zC7$eyE z_JJI|HP1O?A%i^QbqcC_&H>~Z-4Gtk%leO&I%xCJk2dHGfM%WNW|=+C8jKvfLcVrI zF-H6wC~+J4&7IqwAsE0fl9-;gvqQ2Z&nF>nLtR!YLliRmw2VWa9FH1pzV<@~kHCdA z8laf*0^!GZIBlGX;9yEh z(a+%SLQ}URY&Z~K3MLUCI?>=MyP8i2+OWbcUF&CJyepFROM{N-2+yo}&KWNm-5EGi z%0DjCbPS!NZXz{+gThAz3{9M?Qpko|Z2+C0pRb z9tSAV^D8_V|2I)Ja8{aV&U};at3Db4&7(wXo^#M>n#-Lbfme;QuP0yz zvF&@So)eg$VSD&WpjjneZ=WY?lYQ6u<`t1I((g%KzxPUJ^5s*7w#;(UU%je zPuPz3;Xq-B6bq7Jv{^jfNb}H7z`=-=2@41j*g~WAI>fV~{zS1X_(~<4U^*(TgfAob zVuEUwC<}QUf~nt@{e?U;c%Zt|I5dpyINVy%f23*K2yTyDZI9tC7N3P$>N0A+ge@_4 zh65xfST)|Y(pqDg@SDs=N6DA#LWx=?oVUaOW2$&YVc%FTRf*p3NC2rb>_F4-rMylS z(m7ERa~(3wS}j%hMUh`gtA$?)i<7Qr6l38FD}Yu9N;5;Lx8uA69_S<8>IW#-#LF;B zv{Lgm6k?=#-IaY=^K&P>-1QIAvf)(SDI9RWc~nJw=C+7$Hy%=iF%!1$kx|bM9rUn{ z4=O!_sPcMXY!))CTR{`IGU?~v2!x%_2Hz-hE4B!%86Ci`Kv@y<_^K?pu$_aA$^%l? zXop+-4V~nxO|TbU9eV=t)Rjqov$(qs9j3$ji}6vH0y^n%blO}^+vW8$^GGx zByL7RJmVDwM?zsOZX(pAo+Gf*mh%FhL@oYys;69dHytsct3^IHQFg zQ!F~_BJ=zGw!y>n=M}Nf+Rm9;4y!4L+K%`Bm^?|PlurB+1Hmwx=?$+KX{s!n9@`q8V^4`P=W8fq9boeZ@ARiPqP{;6w5kU>UC&5D;z;QA- zyD0hw>r#eFVM52NH_NCIzOp@eV9b*A6(yyP7tv9O|GhsDk^d~foqIl_kveOaDlX50 zqS76IpAMuk3)hB>rYKkJGe(eohAgdZ$&lhArCDI+~3U)Ds@_ z#E0XxOY{XUQ?Iseqh?XDt7_s_%dN^?vT>2M?7Qq(s2{In^-X&?E2Td&RNh?LET7Mk z$k=3GXxxE;{>TtRHqV4$(I$hp1b3kvw`p(`m0xtr&7x2-QqgQ%L=+zFTTgS$1o6DP zFC8BucvIov@1vM*4~Sn};U_fHUvx0c-6D=Ta5=3cw}# zYd0e&xWkX<7C0Q%@FQCUpPhqY>Gp8!5O`oUT}FZ#uh=+80+O$(V+8lWWh2P`#&voL zO6b*kqviv0_$!;C%e)ti=8fD{itlx@UhpmnYygeP@uLHeuU#%JTv9v8es@En~rcN1PC%oV}N ztJE&!Vvnc175z0YW|t@zzS?F9il!FVB*jY{89OffCt#tn?>(cY4c$IeSw(^4B=?(7 zoe4EJ!k~erc_WKDGGvHcC^eQ`PLrZZ|BLs)pZg%wzT44=!OzphSPg)rKI=Z=@88E6;KpY8L&rlh~c zO|8&x-9XiVzr{l$Dfo`6Ih~@^s;D%VKuvTGfzMh)mEL4_8d;+kz(sGaYB8i+#E0pD z`jq|8*jf|(5oPNR_GR!1?jGbOY;wX5bzaYB*bT@r5}AaU{A--aXG`R~`Pa@r^}s~e zc}J7+zlDSbv`-vJXl9B(10=}3zCRBMA6@j{Ktjs?{{IL(l*N;3#carEwo1LX~RGZy`Y5&3Jh&wJRF8?KWL#N z)4s=p!*NlmtNQ710ftBHb~#w$oHbu-y%n_3$N?o~eX#hlrpN-H^4al2rHdab6+cW- z{4nLSKXTM0)C zca?n|O;;#+frga+8(XWQms7TbAL<1^*c~!x2u@%_l^;@Q_@U^E_w&}9efPIS7sxyO z+#*N*ZCqZHkPnm|{jyL%D-v%?{43nAI&k;7VgMum;N6+%0b{UjHy(fna^|kkFCEw! zQocSMdnGh)-!!lgTSxsnA~|?-!ikN==WrUYLD5LG?Ex#l`KrI|j4I~0(UvK5JWrP_6!vN1;UJN^Ss5Pe9jqYk!n$oAaCDoWlW zUy!%sOCQQ;=O&gX6UARbt|rdVL`c-^&odJ2`?h>Z9HKxCxIs?Lu-modTz$g%f0L-= ze~xNv?8lvY#j-gUc*%OXoNV2`V}1NDd;Yly)X zmw{FLX!+SQzd0mhLy$6{>z=z-$hndWrjy2V^lkD?gCFmsI*gEc37Il%a$aP7mpgbL z88eT{C3K1By6^Hka5wf2tSYj+XUxR>cBe7>Esf_o#qgffNc%kDn`Gw2p~ceCs^_3(U`=uOj9ussVJFC1 zIOeWA7@R^dp`+F@s>zelxgO?E<;VRCL^n&RExyoc#6Tl1Ws1VFCQi5m{BmoBEp^$` zMtDsp7_w)2pywB!&xbX(%sk)0?z#H~97l86#NK>X2cR|r(Czrm4i9D`7F}YZ^z2-X zJDYRq*}@qRG?u8R2c3ubL5)HloCq8S=0N?S*!o&&z})7lcsJf&SS6&4`&3H)r&2Ee zRLb~IrA+)(O2Ma6u1QakGh1OBtX-kxP;?p>vTL-3s^moLa%t*xx2Z~S*T>(PYb8cV zF~(2o5rwq`HvF8<0&m%8uEzXRaSFbYK@E1$(YZ!J1`M;3gL92Z#!H-ff3hO@uA2^v z=LHx@FYKeRy@Htca#vxI^B(BJzurLR(!JY1G)iCMOj5dUD#ej;lJU9}R}+**y4Ab@ zRsX`XBBqn#c1m&1djK`pk$;nPU~Xn2hsmAmNqBiosAsY&p9zj2oUzE@h+>DlrZXD- zjq)ZhINRVU-L@fW=78Y}!EPpk3t`lt+ur+coa zD*8U5kR9%uYj)2y_j{U*r&mPZk+=Kjde%p!M<5LE-7OPd-hjGBhBQJx$tb^|>x)vJ z)IE^6$ZLnrU=B|-*yPjxZJ}!);;XXJl0{N77VQzcXsKDcp254_G}`PU@hytK>l-~> z?1ra1T~M}_kmE+kuBZUnTTw5BJ_7Y_c%%^{(2dJA%;S;43XU-ufy6z8RT)B1ExUjm zf?WM2McJHJJLbP9leIq~h)gsyM9K zp-7wn(bK6Jq%p{gF1K#;R(_m=Of;XAcwx}PeS_x6yq;U8PoEwU9fyu@g&RH?!(GCz zOX&`aZc$<+S=}$>^hgn1U#tAsi|c9sz7HftNCd7SbN7&o`d@>|&0#lt+&5%cXAPEs z&X}NL#IBUbP4}$$#0m9mLU8GSEk6J@o@GNF{lIoPmWwr0Z(FVxgmJ+YBvdD4@Ws@VzRO)b zl&5TmgZqJANX=ba#0w7QGD(rxhE{?3eO;YrPsYI3KKE zxmg;M5x=SHPCb7`U~8Jqu(n)#SSYhzjNwpdjI3XUjV+_Db|O{3Qg{-bcTaz4anoaP zro%9Lp)j2S%f1+zcTDnd)pcLUgXhvMc_Sj8cOZ_hk_nRnA6Dv5+6L=hdMein#4X@a zqb9(haBp%Ash~CCx zNq!P{vRFbIRFg)Uk8TaWcdHbBJESS5wJhxdrD=P_EZ@oo<11_D@SU-;eoRZy2tJFX zQYPPT1i2lmLDU~*kiz06TqoZhpg3f0Lsh+_TB@_HS5lqnXYj7J1>B6p5yV-Qo2Ag? z60_povTJG8T7lDnhUbpqf~!%p7@(-^<3uhhPsUaSMGSPB4Q;2;>G8C5iY98fc?zV8 zJkOGcTZV8pH6qNQxf0s|!sT)WqoaJHz*1Zs4}a@74g>J&C`!D$bNFKMc40N8NHbKa zvw~MqctKWT42?G%5l#!J8i{6BD`m1M6IYO@^HzR9(O~$*wb03()%@_4bQwRfR&4$Z_JV!VVl%LY++YT?Mj9?KRIbm7JBtHKr|($HlTwv-Qd-e`i^VBd@FW~E&Vn~g{h z94m!TMTt_2?H@9be`<@Vg(~{FG8Eg!wT~S-E}6s6m7be+5ub$Y;dNgX{^gb|4`C1C z4P(jH<HX9@SS`-wSk@T@JBXVq!(4tjyu7VEIrED6ONY^~NV z=SYn)hX{92PS9*}FcAf3@D>z=V)k~)hs{hL5qq8owl?0dWJz?Lj~bLvg;y}6owxA= ze+ypVJ@SF2O}ie9P|W3EqDWqCJ>lRQr1^M?alopLKe@m1J# zkL33%r!Ig{o=ck?%Hh>rE8vf8UT<#(glot>JnX7E%(^7MsYDLcCEVXE-FXo|_576A zs255Cfz1`XoYKnA)b_M2keuj2ap^>&Tk5SE_PWf-0I3T0(#f32^X6CA!V6*it0Yd7z5zgp&ttEPe& zFq$VbgbtC+igTq`tY5~lqbP<&Nz5=3)eKu=9O7G1nITfvdCmIjt@ z(Nz~yKnb{z&rQx!{SaNq`22u)(%bK zxV&PS@A$GVb19x8e@!fPnbQTq=L73IU>-F0$lXk{PDexaB|}|L50Qlo_os=21=djdIuoOqi_vWd9xq6OTIzzGznE23r4fT?c56=4LBHmebvY?@5qvoED$Qxq5;%L}>O^D*#!D9m(Y_5Vi zrAtkdjV+N-{HNWlf9Wn=#JrB3Nm?K=2tCf(PIgtgh`l zc~HbRf;6~%YliIwHvS{)0a%)@W;6!xBSge@a#FS`mW?r!nv#O=j--jKT)&9ovM_{^ z6upX3akbBxOu*4bl7J9p2t;inazi)ZVa}s+8GI@&)VTsHVbGGUQ$kL4Y73aX1pUJB zi%^&YI*-sLscorJut)894rK(z%e2m%vFsS1`o&1y7j?l4q_E(ZlB#GkoqmK-KrU;u zK#`osWF2SqM|{11dA;Xl4P^UE%RN-sjJy$3%hDEE?nl#?`-$Xo7m?JL2g+lq8xmA*jc}Kwr##$`=ucn z&5EyN|4-roSr}b-?7H^;Kl_@g8%Zu_%^_wx-tp3F44kuMuU2l`qM@>5ViOJ;cSiQh zK2VtTgo2<$Wnsir#L{XM>?K&BbbIt#FcC!PI*OJnT+B*P4nQKDUACT+wNm6dAfMPj zT=L&o_G4BtM-c8piGs$!`s8F|#mC4UxR2>50#Z~(<6oE{ve|B=(eb-Fe^2^gehwpG z66d|ZCynEBv*=;Zz=44GtBzX2ABl>=^8bCGynmxy(G)r+M;IBHkVo$U=l#3; z;vFQkU+KK-OXQ*c+ux^YoFx88AGtHr$$_C032r;5g0~32fjZ}11tI&YkH-lZO*}7C zPe51K385M=B0CpA>K}&eS9pv#$0O5;<-fu~2`x7qAlK(b3OkL&zjGc(&rLMs#3E1H z^sCV&#o$KG?ZTi9j=}1^Rhuteu;rjTlq()P{J!o^ zv4@1-#trtwA#y@c{<=WWAbf23rsq&)zfqpO)l1&R{lb}BkiAuI5c|z*mQnvTSN=CS z7A%89-N3079fy|qZ$*#vs~AW+81-!XHmmguncBz79%GXfZ`|0rxL0b}Amtm8M!%W0 z%pC{+;`(k5&5WfUZ33n+MgN{-hP%K29+y6ynfPGtn7eLJ4QoLE0n;1)#qFmlq3j~H zvvmXf?oJpk%p4|0Pyp#1&l15LufMR>s3{|?zO*2je-$e1xywu7*P+7hyUr%(S-cHz zf?Xwl<HnS-&OS)=$(jvdGqKe)*~zS9JGrtzj!a!7iW$KsEnq!Gl0aS zM&2=_>G(J?;hNWFGfQr>8&?VEH;{+A4{H2;{w>{o#TuPKIU!Pl}6KxWSc2I z)Wj>5_^U$dvdd_CPFk`jVB|d;Kn_Hi&l!2hVNM%OeH3|$A|=yUBmXtyf>(^DgOo_Y zM<|f$a%1C--0x!O;XW_gf#@kT6rs3T1caY95?9mXXklAfG)b?kscB)zqZq~#*WFvA zx@!|3%JP!e7(3VZs)?rY92QJgr0~F<8)eLG8FR5e6vKCUPuSNI#?FJWWEaB-s-10^wo5LuNTF& zkX((C;TG?s-jJvzX-p_3#$O|X2BhtH%4|Lzf5ufpneZ|lF%nlY!JT1#2K711m)IlOc2e|F9mu&w7~2 zdbn5C15~7}hkDk+w{$J+D*HPZ^f-?L11n|vQPvb(8!3G0&UgKyuqf6df)Kzl?jmoC z`u2t4g&Ir#Rl)Z_c+i4t*e(Tp-v@lB0=}*f@6}|x9^E=1_a=bn7#@sVejot)+g5N>VqWh1L;6yaUPC$-L`GQ2{B^yRM)cu_!ixzRlooWNcXPdOoe4( zGuR%9VWE#3)qDLL=}|`12=8(c@SWca%N+pu1D|rnPL#4YhV0uh?}W^Ha6g*$?H*&+ zx#;}2a+}HU6?Jn@s<@qa1L~uOFXSbj!So2qqMztaa{;xX?CWB8DcsPW#c@7+21O69 zANAFuLSSx4GkD74WDiJ6fP>OvAW#K6TdMUeoj0%K@ z*YixyPXv2@_6#hZ9OS-L7IJ|V!{zc0`e33nwpv=kr-zRj-$SMO_7_|wXqNA|2WWu7 zJ$=TID~S;guDW|h@y(;zP67F1!K(}6235D*$2E}z^rvS~TJBmYxw6+&b|YNx{+5Wj zJ7V?$pA>*sJ8tov(z4vfq?e_MDP?^TBZWGe%=Om(T~YB4x6Mdg!dy{YLTX}~fAO$0 z%~uE8<0C{Q083FIAgSWk`k3s>0v|Wab(gp3nBUwfm&CJh*zk{zbuZX7E$FS_Q<`}! z$)1WlljrdJo#zF&GwLj#6nNk*dhmVXO{08rxBPyAD2S-)WToNvS z6OF|fngWXgE3;s-uoN-2d?5bBcL%j)2lYRb`h+2&woNtrfNg*f^Y+q;P71O=@vLqpUf{P` zeXg(JGQWS`-eQ(_(0n^+JlT)6&48!Z*J#$hLav~_ew@4vn056;vB)rPlN9A^B<~4y zb{pD<`6W*`ZFurT(0+VeF&ZmD^BvyrbuLkRngYK4d`~lj*b^$IN?yL~_cR85FZn&& zg1!%fzCJ6?F?YY;v!7OO*Y=6ScWEDWKTFVTLV4WyiQLut$#(9hl-3LQjecM>S`U7s z4@fJywAzipek|!?^p7Ah9{WC*Z%P{^Gxx9xia0)%AT2H^LQvQThUz`)-JWK(T#_scIju*)>>B0}4q)chY%gCn5G=%V^u`heLTRds( zAt#rcrrEmQ)@%}{bSIlsM`3OnHI|Hiaa2lwUUDPtd{lzOe9>Y3nx+^fA4?xVP$kFR zUiJ0RnLe#v8oB6WC$CoiVX`AqIgOV#p47@e_GmWRV3dBC?1_^}2E@%IS;uOgmy_Kf zfzC=Er?VeZ0!h+|Yrp2UyGPo6?L>(M4cbTSd4Alc?Ursl?@Wc?D52njqBofoR0n#W z)h0eK{n)Jy+^zk1`z?uF=r)>(k&e8r9icSo++pd++f$uv+H7)3E8Sd9l4R8R$u4ck!aUwwuMq^NDunx!T#%%Ik`p{*SK3 z(C<}_fe!9Gl@n##-NRCNkxuz$>+)Q* zhR93lsZrV`06Ug+$?hzZZe4R7`a!qO(;(1}J?7+8a2?w%B><@M?Q6~pg;9Y{X0mR) zJEgT_v`giimpjk370!#2tJ*&A%qndxx%35z(BXD|O8TU40uUuH=nT`%l3KY|M|XS4 z(A!IL2^Pf`$)cS!w$&MWU6HZ?NYNg&YnR_}x_l&)FH4VTpLrqecEFX1BiycE^k|=% zJhJx5N*&wlWL2OY+mlJfr6=ANXc>EAV2MkOieSpumb%@x=Q!Q9TixysAL4dbLHg1x zH>UjsOFF1>7xmI-XJ&gf)<%EmCN#VayJ1v$-f zBZ{0}(M2f3bO5MwcEsdHSTe9=1^MpMF_k5=NFag_WI?^4dx$R8)cKxtA(KZQz?#kQ zP2EDkS@K!>6uW7f?X>P9tYyhIh@F5DW>?dwvE&1|HQ;9FT=2J(UJJJ#BZAq!X+t zDM?#QI|dfqg}N%oYIWtC<+3bwm9Le{uCy_GirX!@S5tCrNMgFz8zr<_`T;tWwd(Bc zYX$x(yI1-reO|=eDnv?s3UZ22q#5PvepNblAs`};UI&l#NplYDT(shb}5Jc>Sbfvw7EzI0Ms#F zpC#FI^PFj|r$ZOab0e)p=$J#Gz2m}U$!hJq(Ff_)dxk<~gch}GD^ivUBO>i`aG^l= zqzm^t+r)nD1s#|7^jvx&LzWyL?K%-n(p{b&ljoEBgi+e+^mo70Us)LtxKes~-57U* zYrRfK?F#2vSL$?lcI={Ot3 z6LZ|Y+H%H`Mh-tP!hv7Gdwtn2NsMjpsPv43L*IuIJ0LN*3cVlFs*+A}E^@k&vi#hx z3U(-8TQ8-vnK?V(g>-|lbgVGyPlT-NHPeQHOsmx2k+5%n#5`_2Aa0W2i#z3A zf>#6dRWLO1g5R{dImPpMSB~^gtLtwBe*f_WV)5eO(jB1~E>LoAKtyt8s)vuy`J(maVZb`MT&mkyoBbm*TYe$GrROhu< z#=xG68i?J&Yf39}N-K~mCcG)iTw3uHH9XK?TBDD;J9wZ_#9(e9)Y(dxMFk3F4wE|} zo!P^jIQAdv5Yu*kc{uSCo#!wPL913w)cUQ}$IlnJ=b@Tj+*%{&3F>b+t6np==wZ^sbYDik)p?Q08I zmJB7$lQwlsJl~z>%g&?QX?=DZD9lo;QX$u@6v%UzM|JUNKf-tEJ@*SkR*;rvt#M4U z5i6KtUA~6PJt%E5f5wex%u@}gF1E9b2`x)&XGlMCjLqGZCob+fNBC!3#*mE*)BE0* zeBKT8;^GN=Po4rsVYb0K@`hpn?32%9x6FI;U;|e78DsJ2)9{Yh)3^a=<{7^3%AT*5 zU$yb85^fNSCKda7wop>}zV{2e7hO|`W^2=eK;eEPy1#2uy1d2?we9Pz?730xpr9D% zH}`jqPT@}$?)RG~77T@ztMB~#j`*!V^e`I!KL|hBUw8)EdmY^}s)o>GBm{%~)xP;R zjG;kgLj%TUw1m4a#{Ds!WsNc_emgKcV?s;WS;3Muzj*+Kj(`XroV*yWNWv@~G&5Z(VzBW-st=QL_ z9F}94dXr`c&DKSe3X#+9TQIq>$%r;}6{N|t?CZPt^;GtbSAM?{<<9-K!7sZ;6gK(I z4;h|DBT5lsb4XHa?g^xTj;gn^KK-|4h*GO8{E5W~m_Ft2H?7SxU}u7~hufW02K7g2k`N-stQ z`@?e0I#qtjP!(J{duxwAr)}+qWMfR{w~Zn2`ds7q8$3IBLa)x>OXBfXF4l13pMQ+V z3!D%&*I_po{MGsUBp2k+3!E+Ie<-Jp!ip zz2@D=iS`Uedx)MMjGhj~zBUm1hNHLZ`f1s~;+Oq1U_K_u5+M#7wqOIJYC6D-_ssbD z(bx$zN$P|Q2{*idp1<-4+OUpgNl*q~ZInIjGP{V+JPq8Cx8WnA&AulRI~6wTqrM&# z3|Kqd`a^{PkWP+CmS&j#V2 zeei2sfpOr|(cDHBE>i5b@R0BWL|w9Uzs8718;ZG~xg?J1Mv-a99@auA;H8SqLP;@?+@MYN zsB(jnmH1y8Oq0Erij_FLtX3CNBYU-d7Fnnkaemlriu(5B_ko2Zc5S0(H_8kt`wK?T z+=X2VfP-Y>%Hp0FiA`oPtZIZ33?UZ>%4wM`|4^kGxHP zv-PvdSwBq!>t|=#&mt(}q1nf5I9=8@refkchPsQ!lp8jDpwl9s5kSoNB;M2*F&A5BZtSgiW7v_y@? zsvl2F)L5)~U0R~XV%6)@5;Yd9-jJ54u~_vpX^9$(RoAB_YAja0JuOjVvFetzM2*F& zpG`~DSgg7=Em32!>KD=yH5RKrkd~;iSoJGui4sF0@&-HS(NM!$*`Bf*J|5z4XgB;; zLcA*B>XJ3Mffq*NG#8Zpm7C>A?=3P`G$r{E)l%3$xQvLQWGt#W5wvVMn;BI#REuJA(0Zty*2)p5 zvce5Kw48v@!Wqr_`=W4%L|F7=&Hz8cf?Q$)L=*%b4IyAG+sO&;LztfbcKSRgV9BbN zl&55=O5y(^>kDROL56buGoIJ*NiF{nJGAr&<@gfW+m^dwuO!Uyf?0<@a0a!a0AGuY zyda~E?@IR27|{awv9e!ZAn8YKl=|b>Nh=xtL%#4^mMlTP^;9=K+Q1gbDd`n(XfZYT z4)`-2F2|~nwRsIG5&QB7l+WQifbJGtl&VVE_vx>Y7GYy67kjmF1i7k{SS55UMt2%| z;HV|mNX*!}o#12oqTYS6j+odWPZUTg<_qwX#uJK~&nrKL?!6@4d6%}A9HH%#jJIG@ z3ukIg-;@yNjXwUx#==hz8w8lK zpS~r5Q@nnwm%uRz$dJAK(p=-rAqjA3JM%t)j}FQY$D6))`6spX)%OW-dMiDQT!oUc zeg3+i`#2Swi|E3T_$}@;i(imzFUn;980C}Fj}XQcP53XZ> z)_Af}_&9bTG%OU`6OPqbr&%@>U<(`xvx{)8K#?-K+9ul*RsGi2Cyex2y=hK`{z*c`~Ib0C%4q*ul$2loJ~uf04oj2U4`=y3l~NJ6o5Y8PUis*M z9;@C)q7+dCz$Cb`q4%tyskjjsX#pzcJ;%@YcL3kzmLNz8D9V&;7a6wSV4X}>p+=fAA(9Jop0av$sV;B4{hPRuowZ_wd7xWb8LwdSBI$jl}mk zGe@|2I4bo#=rWAD{=r>8;)~0-6B0bxK^P6(fKi!(@Vi5?Z?YogZnd|e|Lp$ew*JMe zAz4OS)ixU;wavCwY_m-gJ#X~AA=-DwcidoAJ*0%CRof~H+MHY5(C zpc0j!u=&TZc~Tl~t{pGQR(7dd3qCXb2m$E=yL$`o{MP;A;Vony4$Z6g3X$O37BXLn z#{ONB!}E@78m<1>eJp2ubqKYzc>`bK2c}0Kb)sElEc=`s!R`N$c?sJO2nj|N`2Zew zi^Jxt*oaXrq`~tW`-v1_{Jv;xz$4!8{AMDH7VsD#mbdbhP}8=>^fo9?*eVyh8?tyX!{HL|(gHrIR`|))UfK){b#ywfIacJ1$gax%A#BGowTzj} znyLPk;upaK5*X%c+oG{z5aCj}#{GP!82G|`t$~~y-s98;v$^wplH}F7`h)>{q$fp` zF_l%_$-NIhd=jyku+yme{Y5g5MX(m}3k^QIz{UVAPmojzE&~G&HGKIp!QExcyz&Sv z8zYa%vhg5c(F!RP>I((Qf2FqxY05X#-9{}34bpo;8UF6 z*~>udC6`{H_4bKsULi#Y8B%5>4)LYsD{Z&v19xQDD?aw7?QeHjnTtu5EUHH7` zF^>^Eh28P83zqw>tlwAGpTUO5ja;1nG`&e1F({GweGaG2aBAI^SM` zop9_xa5wLG*v`8Sh4&05-fuo2Bt4IJd2pyvf3|W<;nampfO*Q&sWy95{T&J-l$pKn zhk`OxWe=y4#eh%`IG|da?q6CTFzYM3Jy;@;j(J3Khw-;W6)`JV41HJ62SbTr5k&gV z#UQh`NaFTGkEbM+Hbg|Nh!kj^N?DYYQ0&A;AqXcnLt|6q_>eC_vu>%A zf?Qtx5`vmqHN`J^?jeZqaU=tP&(Luo@5C5=TbaeWBbGso%jii2@@A*V+1R{N_b(RF z^wEfI^AX}Mce4^5??z=JMX2jW*AVqvRpaE;N@lN&JyAKW5?#*Qp!LYOBBGKkOOWKp zNai|a&{{E0Rz0Q|RWfBu=R_)?uSJG0Q;7#l;vrj?a{rKR$S+EX zh@4*v?yr++bEN&!y8b$8a=)UR{yM=5{dFyxGE~F$8oq;H>KIQFS^}-aI<6c^V=V?@_y;plIP9qvi@Ax3eq{aVNK= zFskrV(Q9~*A2t_hjOZ))x{!sUYC>`9Ni1zXtaYudjlw=7(uNEaA1DEcXkMD7%A*1J8SV-8by(&vYA`sO=AS)`|H)SR6~3x zm&V<8mVFN2m1QGB^O~jd#Z{TIRODNQWSM%#PGE%LT_!j>5^IEuL4sN}(Mhs&y+!Oi z>?kDU_JFCLnRG#0w(yCe_8!tD!EamYBuVp$hGtSi)k;T%Hb+k{Hx}tOk&-$AmI1RdG3NrlF!O;#nXimsFlQeg;?R<`~ zX#LRkCuKE^8x9g0kY~CW+|3-dM^$12)!p;`)%T7bAO_+^z?rnt>~8BgSMf5p0nvl7 zlz2lC%MY&6h0Tq8D{GzUpmL{?v>~IY0t&!X3IMbzkQBd!gYNGWb%NGuhzz1pg%zoc zbwixqbe-i82~Mx1kf`~t42>c(?)=l9Z(CUpJ4j9t7gI^NkdF@~8D*+CHWKa&$odrOm(Zb-(p=57WL?W?pW_R;lAy z^Vz|k`Zr0Z{2S$06<=EXl}Ax_3DZmNhpXaC)=>0bL@5SSG{<;%J)+`zNA;z-p?_c; z*kAXv+jcvuFHL_|^+kurRecHg_69t=ME7O#pVfWQnTulGZkf2wC~P!eWM65Q`LFr4 zB#0(V=R<@(ssDoc3}@Q;*!`sIPUPyygeHRf0gq^`O2H#&V(S$NwNRacfQ_1`L5kKN z1fK=%JJ_>}`uvq|sh?t_@)c|!PuQ#bf%s)l%p`B;{rnU*;qlXH+k&%I&&F&uiPu9_^T+(p;vSMKzV;j-)7oo<@84W0R8zHGP?>lTx(t}*P1UE z+V!*6Q`wY>?!b-qxbIlCvin!Q!J$nlJGNwd2-AWlnO@x98TP5U2xCb=J6D#Vhu2u5 zaWf)pm)R1lRFxa7h=7mTt=?8yC^WP3E$&7Z`u>oB{S#>Xx1jNH_4&kd0h_82D;`34 zBoTOW`8?Qv9v~ zIRa(_uv8x>AAOwE`3=V=R)W5d2`S(=fj7CGjzZ4cSS`uCbDr4Jv+BHz0>`8KA>%7^ z1Uypq$JjlhkJBp*BXbe@IC#()h{EzkI6n|YAE#g-_D#o5K)o`r;u~(XbAAzScr&YE zv#b!fJe!3YYy4^^ck~YKp>X(W|19S>4PG-VtX`xX=K!hW$H8{o z?CVa;W7>6`*8k?K3w@sZS;bPTqtA2Q-)3o{&vQQ~f7}m=`vFIvhY?x~bVfYL0&8W@ z(QZ$6^m!)#jaLd)wlW#0CMbP)4HqTjPK{ubnw81V_Y02s;q;Yb&L&Q+jxVG8LT1uupVB&>6X zz2@%iRp%X5z!hdeIJQE`V)0Yqs{XJLY3Rb6*)f|1426F!`%ujTLWlo_ZH$cND>S1t zn$;ndBsG3E7Pc(BJcQx3RaEO_az#ac(~WZ$imlXdQ1CfeR3Q`v4hrC5Z51jTi*pks zX6dSP6?z_{qn=%t*#~$Q?lNpN*xBluQS0GQ6E=4{W=hcP5ppzYikTAK&6FMp{7KE8 z@1(A<6wRLG{tra`Kd9d$pej9|=I9vxU()Z{=74h9)vDgp<}NT*?-@KlsR|~xMNrpt z^?P=v>h}aib6N4OvCNB*Uw{xU2mKM6t|-GjXXA7rQ-B;?@2J+f(b&Yyfh2;lvP?PH zI$0!4f{1F93D^=X%gjkh$dLpQWhQeVlPt^3OG(I+gpnx;BPC%}O2Q~f7?YAPMiR!Q zB#e`U{FH=zNw_>EfyGyrIX)#}yd+FaNth@JvVA67$|=4q^O}?d{3@-_6qfctnj0ng z(ez}Ek}PJtQ*vvR5p+X0C}#MGS=#W1e5+TlyA?O}a)<%UfZ zs+FS&i7l*(2`8{)I%L5_%aTKAG`7tzCUE2!dRUL4F0*C+#d>)Mo}7_*lty&6@#DVh zY>`$uZ1<2|DZFlYDpGh9gKQ`C!&LgqTCV)eT}I@jF?E+{V+X8N4nuP{+{+ViGU;1!rczfbGIrjxGc?{_B zFUo}$*o&vec}{VW$<8s+=6}AjIp5b}gqlOK9$0l7m8;l!4i{)Tm!8LYexooIp@`(N zkJr6f^WV7h8YX3A0F!=et56dG&mk^Q`OTWGir$gfKu-Dlw}t!hH2FQI%@viw5Cq05 zZ6#GiNiZm{OX_Wl;JClzZb}$d#KNx{&?8@D1hH; zfXbR)fG~UvZ5ZXY0huy_F!k*LR}*Ieaxyfd8<2}RN@%TIIAvruQa-o2LgulMxo}OU zQiD(?UmPnx|1`96v)Co}8i|#{Wkosei<3o1tl*2+kE~qy_>lPDg{&h_zY#7?8NKBa*D+^as>|rU;zX!)@^WP7p@7}D^@CK znYG3AmV2nx^!N^f4Si>s@f8sCyOVM&w58y25|b5X+0xXuQ)cur+HhPHR?d8cHcV-& z{vP}YS1zw(p__|jrpk)^_6?9Pc=528^Et|OEd+J#IYA-&S!|B}osh;>aLy_-SY-w8 z*r@iX8q8=7KI=}l`R!Y|n3aijzNpz7_U#3q$!WIzHM!CH8VD+nm1Ct|*qP%faQMQth0P#StT7Jsp9C!66xb)$E)BMV z8$$Nd?UYH4MN*?3LP5(OuV2{}dRVqQB&!`7#fxqyxPV}RW-rR4tR7NDLK1B8Zz!TL zF5%AMt=zD#M?l8&2~ofT7RnRtZa^95yr~m%kmqKvJjvnMydki9JSiNqD)ix)N=b)* zfhugXOY^xHOO0HRm?8>)V)wtaMKzFIIGZn~B?|KGVyz7gM&!`&y7W$dA2R1f^`Y3* zZUInWMl}H2RB5fz4vfgcq=_oRm|98Y!h($QOH?8hqRy`G4d@Rw2W2QTB*UUZ>=Oc$ zq1a?NCBwuHHu`m~R4=%cRN0tSmLz;-PXiidR&cuyuu4d&U`i%JOF(+p!e{CLsaGb? z3S#20$ROt(GBlPgbBT@yElD4rfOXr_p!u5L+-`2eh$x_fuTJnWx@g<5lD*uzt;VRT zkmQE9h6U{(WEW%qEW4OG0_Ne9FZ;J-oQ7TOJJLCuJfcrEZ;xzQQG43(4F9~U;iBsy z3VPY1o9C{6@Wwj7>Ad5dEiHtvxkQe#fhBLsBeF!MNc}T7d|bJ=CR$+y`B)`VEveE2 zGJ)H40+Sc^`cNe8Lr=6IpYyR^UhCTyU&xH#h+@G&ad0%{9;TMZyh;=+4-_h+Cbj1* zN#;gPORq6g{OM)E5WW2=7zH_jTv%(kB`+*&w3V#eV=1lQp{E@D4^mTJx* zRv9}1@PZF5@iu{YxR&~FB$kmt#~;8r=Lp^eh-4S6s*I~g4^HD!u` zbHOqMX3MGHZ$45j9mFjNpP*Upk{EnosREREv1DXIu_}+^cl5&eESb%ocrPZ`$-0J4 zg<^%#*fX1i>|lJA{}PrFV0Aqv-{^QZ`y1Zo16^9!LdY=d7O=>C-FPKv=*bl61*P31 z*{yhsmGfI)gWrln5I|AAlsFME!fk#$7o%~yLG(=n##HP<_lnZ#22nYMmTV20e+1Y2 zeLMUOXNGYF9fnXT<(cscV_6xvS(X?L5Uf4L9+yAGUY{>b4w@gb*4U=3U=@Q9F!u+1 zM~tl}uvO@RAl0MVu;Y#`VtnJJi8k{9#;4o8e%d)XgXvIIc*+7_HIO93$WUa z$nl^NIqX4L6kmnn|6O7{6ezT&Z!i}O%Q9yV8)Z%$)^H@t>^^xQV7}e(c9!|^$(Jh^ zR!%#ASvD-k3=GQ)nA3(04R|n@ zNMZE>UptOze0{vl=j}LZyF5T(jA&jhR>{9hhC~bd;LZthHxmDb+8&$&*)-fej-is_ z>oQX59lzy)q{R^CXA+rP3E4C4EKej>kL=u`g7?F$fC}y%=Q-B!Mkbe){Jz!+d;REV z`AwWBAy~xzt2&H9l{>h>3T4gz{Di&2!h%aJ`*cQpUgs}~3I9S=Dbx^`zMs3?`gJKe ztn1crc9^=`i0rp-_dx$oZ84%RS+};@Q-;7Oo4U)0ZnG}7Z^?9W;SWcYEEhM|Q)(C^ z_8Z-b#P!TIOy1jBtY+DfQQj5$U=aUUXFH`w_6up4+<3I`d1LDH zfNFzvbBEu)*P|~G4qE5yFkv{qS*}WBJ$6nMWs-(URiw&@=XXV%^29o7!-DHNJxq@% zfVp+L`O3a@gPj*v1#s)O4c3D5v#e?7k1E_HH8Kl@&4|d48qsFC+$-}g=r|HP5uVqi zr&~`4{bZxPW@$KfAT)1VGSQy66cX9ygN#j*hF6k~AAd(RrIqMGi&`lcXqgh%eqV`0 z+!!SevBL|8`XS)ZLq>^1AQ>e}FmajmE?K~U%i9DBZ51M@q4(_m#1)0p>%I0h8uk)QO7VFM#^S6Rs*}=w#+@-(`MgYQNMOVl$ znK?^z#8KW6O_};ED_9ybIUxZ#fOBFN+Ee0Gab76K3zYwaKpWtnqOzLJfj5e>Yb2Y~ zZWLwLNH#~^D9WypY|gn+lwBj)9CD*5yGF7(;YLw*jbx)IJ1v{@?R5U58DUqKwf}ke zGgfwxi@8aK-1@G+A99z%kY?VS9O z9XTh>{t)VvheN)7C@Vux*g4-0SZdrTgwBB(t-xSJ$b6||#`ZoM6C^|F<#NM`e5hda zCTMnaTs`;_7HV*L>f82?(Yy`E*u9?)%J+m?_86ouXV1Ob%Qug?r)xJw#MHOg9h_+x_-zfjS{}|yI9;$ zo8P%s;D*z4+j@MBTEbkb?1tXCZGAqxtNtI_-aS65>RkBGkOTq-_C$lCqJl=v2;~sV zX-UPJEi*V%Cx{l1w4n4vX{p#!ol&X@WSk6SciccLD88+gw)!60b6RN?4ELFUxd1`{ zi(IS*usGvbMX)3ROy2La_DqsVwC9iC`T3E|-fOMBuFqQQxj&LY?PsM(n-r;^W2ju! z*jZ_e47BMks7TuD0Jc@y>$lIG^>s?gdcgIKjSkXSH@ol0W&_M zMV{X0kGO&B5M68KxcDtSxC5bWq|N_YYQRFjh&p$_CN*lJb9f9q>@%!ITIfoC67#$E zgDjQ}o}%`8*2FpB&8u+qsoUNl>HvC{uI0W-PMd@*>9KxUMN*n+kDklaw(S?kp|%fE zLg=aj|KBm3ZT~~J{guV*=P5qpZxS4X$eQAgsLj@Zi3)wuwTbPews-Z;26D5s&~IQP zC~%gIG0B+siwVhy5?bgi*tXlOjDX5l#merLuJtLzkL%aR7HZj^+|9oqQ;k;_C(GdGtLq}(}c!@(T z3=~}t$YaK$8+0Q=WH?`eu5HWA$JUF5o z)lZ%8>d^iL0}Qm>b|)@rJ?t`$q3?z#dP(`nHE{PD+eW&Sv0*W>(lqD3eK8|?08Pz0 zJ^212eeUkRN~I|>iXrp|PlmRNkQTLQptIj9&m9G6+Lh$AwdqC!=oMmaV)cgp!JWFT zirLo1BLjkG;RBqFc3czv_-b|$mU_M%ZA-n3FIx>l^*lKWN1g9-2GHNwcVJIKBVt?Y zfe%#g4}3hZV~tI9TMeMA@4=Ic&`p_JFFh9)2)IVeSjByewvBbqZEJjm5kbiX8>(Wz zJ%t9SM7->bJ;$S2&GN`4HEWd-T!3D8*hQG&9it}Bj<#iuy7Pf(dls^K(6>={{y?5{ z2^tpm?;iE&yl6)jq@!)m!XisJ8&{|R#Ya{ zkO%4eIucL(FN~WtW9W1Dq^}r*AK~6WUj*>b@nO;0N5F*?H#MK)qQ*|NPZaHL6?oc! zegOfF8jbL4!ji@s7XoLN5%3VIu>n^WcOK?9(_YRp_ zTZ8eWH@1#@(%f8a}@)4$mNv9vMY`T|C8<>p>r%!pl+{>5tbg-^Z+r!bV6VAsx^SP*SmE5SgC`H5hhZNHa$&AZ>yS9E@q4s(nW)8M!%YZqc0bDE%5C(6+jpT1L zFzOmcv8+Pv71vuv>!`}YO#%U$`+W3+K{gm&7B@@Sm5&}3o~1CsIMV0ul5=~P)Q9~p z66|etZ1h9I5OUhiNZoP(h&`^t;BDtTeSqp%%yFPrIoUyz?Yhy#5{{&Zc z>P?iqOT4^Eg&OX0_|VO()d$2-0-BUrFq>c14FpK3N4%ZLIRUF?T4OO0%j8#V23-+n zO(8$E##j%E>cMEXxA@_;TBwxstcNXLFZ(+dSC(IyN>wW)zcP}6n;sq|qTNsU4OYH| zMB@8Ag;^ckULTZ@E=O4)qgiZCvmrVY--ns+F(Mvf+!SX2VGFK)3J1T+kC&r0Jd5zF z-S?qpzeFoMq}3g<5j#$sbzG}EX49s>BcZvbexyxn(Wd`hn|eZ~Mu2f-DB*;<& zF`|CJXd|d!JO$=JG^XrRcStNl`{2#|rsRFRU!fHe-*(mkZOqOyTHQVxI<8GUrcGKB@E;OJ@Zaxns?H3(i_Q?E>8k74d6F@B<7SmG^cNKHvQQ94tGnkz zmd}xDj8$?lZT_y8oqqDz1OrP5|=9FCv-{HG%$Irh65;++I+v6@I2`Q_odebPF@CYf=_Oyt@GNL4q~Er zIJG-=!Qb)Pj(Cd?Xoam6`_WV$*5Fd8b>ccp-fZmB3Ok6U6qDX&6{OnMo{1Q)&01jt z5zXsJL{4&FgI3r^sj_y`+Ek3px*be*qc&}?uHAc1o7$#LZ!bQqnd@0( z(EV0t$=L>Ig9hJ?{GscW!dJIvQU6|ReI!g6Yeb;4+|4*yv|+XFd(`bX2LKRDNYIZ4 zr{S+HHBNfN53Xf7sv)UZnKlFkn@f$)oMC@0J8RBz3DuZIr_$@aoqBC5Yrq#}4Jd_k z6Rhj-M|Fbq5ToZ>*X9W}+U7)fh@;&ldfETMgHDu6IyrM(K{Bj-R4Y8m%(QsQ_i)*k zmVc^)?wiv)^|Mi%9~02MZUXbnjo-kx1b!q^@?LB7KwrUTzR6wW|=X8TG74WtYn&Mi}s6tAiV%)M&~i#A5#|*s%O3VWlg_JhyF&(+qJ1t+52y5 z(++FX53!Yo^SxCO8|?p6MVEPP9}?-W!?IUjUVKIiEdWDK47B!}b}uMf>1syBcF&t2 z{sDz&;=X0t8ZGn*Jm4OuwcNMDp9plGXD${EDyjLVl10zjZnWiIsOhh*k2o4|(OFWn z(5Bp}5V%OnYwNY@rUfI7#$e0rVB2i}*Umgb2b{Mo^NeW%#6e{tBz$J zKog@LyXk8}iM!nfI9D9zaNCWETQH^#9?OJ+_Fw)`{RFPPxsd~<|6%Vgb3@{?FaG#? zTjQ+l)_BwSD<0!b{JVzE>YIe1(Q5AHS`ovf>d8Flo0z6f@rhT$+t044KDwY#TfeJo z6kk8PJ$)3lRUiuZs{J(aP2;dN7L|k*OL8>P*o}#6tzp!bT*PJ8p6R=|Pnql8SY0>) za^px9F$KShFJP_uN+7)I93-uPI!b(6^}VpsYG%EyZ{s(k!PQJUl+^o31`;>&%A1uf z=_Hb6oRVLL%e`4Wp3h2+4zF=uH{Mg@pR-YhyKuC&K2LkS?pEZC8JpzeN3MW9BblmH zMXt8~Zkw6Ee3P_0XQDCnr(g{AF2qcFhX_P#^0FYI-gRO(_;i0B1?REt3syFBlfOrO zP6M;WSKcl@tu6b2(;UJE-p{90#*sb8WfT*BORGM{JKgk{-=T-6&3pO>j}L$%8lVLy zlB2pMu?>IAOMD%Fq!RNV(jmRUhI)oc&8p&R9=yiG5vR8P$2ReVee5=u@rfS%;5M!L z2joGX1=_2y3f7jC@ydiU`~BE2%$I)ljS}BCnIU=J)=P?cJ8@VuzrKX z#QC;^I8<+`ci-UQBH_(rK=K8!)=PeF(Pf4vox z;pDW0nq}}pa6cs$M_!|nBl^7FxtBD%7HlH7=x98{>W20@Y+qR_U8!0EM=!Oxe(FSp26^u)qFa2yCkmjL~0NB0{S(ZF2 zTLBnBhdXXP&(dnkl%Lx2gH-RlyCW`+W}UY4PHw}c*YF${zk=3Cs*)q2Es+-;g67wa z(=I{YKA|KN+C365HK6V?to4Bm4AsfiZ8DTCR3{*p^;4JQ!&N%m+^1h6+i83VggKCL zeeB`ZDt@oxKSj&+;Rq7lM$O1(L~(pR08n^2emD~UjE#+!hk_zqdwrZv_s5l`o_uBf zx*xd?tbAWt|L(_}?#DshkGb8CL%Nka!7Ihq+ib@yGqLHnIzPN^C$gDqFY&Rcs+lVn7-pY=J21; z?^E;}^r;*Flj<|w#t_JxO!d)rghBN=GM@J(ZfcIB9VVK~xE8B5-+-UF-qveemPECu z4~{t#8?t`NB@}lV=ZNX50pDK70kKRwEqeA4Q;{i{n!#KD8;)j(1E?*c83_US#wq_l zfErmx-z6YuWgf?SbD%iTV)MXj|BN+;-^aSghj4k#QTGr0yHYL^6#I>RnBWy-M9?WjSk(M)LC?t6X|hS<&_`B#t>W}6!Bjfc6}6#3{X7V zkDNwptbfgg&T#2R=FFTK#v!ScAc?cKr|wJTaekUU_1jZ)<89*%K1B4*a^VEdFZyOi z#=@%t=d1YjIr!xU@r?|ekIdrt^0*v1f%7HT@RA!i-!g`s5c-fboshF~OfLDGz=B!% zR&3>q(lK8a8YfpnEu=d4mT+h0E|Jc?Wjb@9>Q8y;ZsylfdowGWWB2iyE=4@?FgXe}xSu<3Vt{J+~-(xPE;WCJLZY&(D8~5e%Zy3+^Sb^$*AN2W+ zQgdGa8D8TP1JU=n*eF_O%D%?Qv310aazPeF$c!D>c>&k=lO|Ai26NVZL+Zw)l9>NN zQHq&_oVtbS%;|xI2sHM9$FBQ)s#-ITfq(W^-M9c7(3)Hx)a>3M4>G-1@u226KXE0G zYIXtQGHo`3eFtyhXa5qL-y72oi)% z!tI~C#6_%P)B(;y*%skb>Vw!Ost!dIS8hQ+BMRKs5U?u4w#!+3rUG~LGYj1D91^1O zY-u|)dopc-H*P4E3(M7LnDc0^AtX|Q52-70F(t_lM5Tb0tA~9BxiAY*^Kw%x_H{&t zM(6<^5pzn4wjP6U5oWl}kW>Ab_wz&eSdo}OC^?OfQ3nCeQJd`a51SIJrV2S2q`%+i zF0wQ$g2%H6yo^ika#O1D*xnQ&tMRe%wpRU1rYEo^)lGbWOZ&cjSMjMunjWYq7%#oo zLQwH&wf>LG_s^b_{Xb5!8140%^Y&5>1m2onIC(`!Z`Zc1cvvPc*|+mTU?G7L*g%9B zP;k&@!2o`kVy`jmP-MY1-_o`{ZGC6kYeS3q4eu>~loi5vLdAb2=CK9C*^Sq9@g%j- z5BQMnMJ!wT(BoWj8LciygI4`_l3n3>1@3<_scq~DwV}B1Zg&|JP9V*|&42osIe3~WJBIWH>4%4=I6kH%izERd5Kr^68rD5Nd@UH{!#DqYnXtq zv0MCVg|n}@y6e1ZQ2R=z$WuNk*E=^RN0aCoKn{AMpBL!1H=V{O(auZ|a~U5Fh?f0w zfRvt$l4dD(bwl{6C8(^v@0`;};9*r!jOkS6b$GonCzQB~8(jD=3Z5gbvwzJZyB?lY zq8B$fNmHj3cHLUF$X>k0wABd0BgP9d4@Tu~DJeR(;Ys6QN>}OO`^LLX6-&^K@}A+U zL3As!)mZ)>uDkH03Hn-_Y=9F~cB^b)03%!qqB?E0?~*`=r1&q=g9`}@RDFsvR+1Jv z%=1>sjsKnr)5DKV;KI1mRs6}qhn>dx9`}Q@IN>s4Xu}c0J9%azx<3|^^^bM@`l?LhDw|NIiH^+rI5gGFbvHfFg8Sx1u(_(T&4BncB z$|6_s+gAK%rEpw@7e=Ne-paS#qlSB&&(gLh4X3K9HW^gOy2x z1!s+4DG|A06mSxl8edo;lUQy-CZV!`!zlDSb|)umg=@JL{n^#L7N(f;>f<#YgxBO@ z0%3R+Z|8bMJZR05aUeBM3PV&ELu?v1wJZvQH;%{(S(Bef1%VE^-JoMM*LJ=5J?uyt zm;ek_8W^=TGWEBHYe1TH8y{F5)3p^lRL3M+^-4YbK!I;%qrQ!YPHowKCf!y2zNqv2 zTyDXCB0!Q-6?YpuU~_6K)U8x2;LzZTFbNqA>N1k2qN7k&4WSWKC9m;m6f#y;@an92 za5>DqHD23;tC$3+C$zbm5%h9W-HA%I=2l*~D9@yVEw|vLth-&gaV98$T_?II+>GP- z@edcFDZ$8N1uH*i!c?NiI2=}m=DHeXsvvGF3UY&O12^E~hp;ZFv3d(e5FFcAqT?+N zJknW^Un@wOHMQ`gs{A8r1u+Y>%cacDXqQ`jgP>@tpyuSJcNPpMZb^Y%HY8&3f$m^s zjl~+!T+o-eVmOXAqnu$q_D4~ZkXS3C;oC=BUGHFhO=ZE32ahS-=cD;xN^Aw8#;p6= zH-@vV`Vd`5cxjlD4dJ#XT#^IhS{%a3R`F$EPx3+R4^Y5(0JF+WTjMUrg(BxBJI$*T z()t#EqxSR@R1mC;AkU0&y2~t%h*}GV;4q`A-R6Hn+oEg%TAPE7Euzp^x+d_`@o}bd z15TVkVs>UKEp^jrL%Gb9^To`4lbj6wb(9;!Az2~k&rl{;3%~G(UjQZb3WjWgr@}fA z3Lq|lIBG0)+}CYi@JV;Q@pjtk0$z?ZX)OMAYPnT<>Ax@eb@C|Oiv37N?4Dg0I@LW< z{RnI6HP?yOv(nNOl4P9Zx*}UemMZVB?Y_{7aa&kXE~ZlJPCHW=J0fBwe7 zQebePU66Bs_C|t(Wo#WT6dT9bd9junv4uNK!HW2+Z1s@ne_e&>66f#NG}Aa?x$N^a3Mj#+~t#y1L^|r*wt^*tOIAe$O zg%E-D5Wk83{NYrxI>pwnthKxi#+qO>ORxUQen8`$$^z}y6{9rboyLP?{*Lj?X;2>a z^i+znfbHB2$nHzpKaGJjmR9 z5Sy6n#a;A5Cd6$j?*|(>6ksb0=>_OH!>-*-$=8t}$l=I{sw$VWPE{0&-$YS$vAhA| zghs0@+k|4QCDjS#yO^_bh@=J=2zG;dF2Vh(wg@VUmW<0<1}G>w7G!pmy}>N5PxNkL zG+Ot#)hOy=GXCVKRQsVR{j}{a)#UJ3gR_3DTMVUGRN5c*j zAp$Op@y~$X-G`axBQ_NyXunpypP{+Ug{bAejew^xJ24tLDl&fWG}u(%L&fcpV|MMk zO_DTq8p>baLqY73<0S1zM5>iFYxd#KXfqCLb}ycGXYADMQ}M)We*ibVd1T~~YSo6Z zO?quJrwt@96ZvsU(w zj4LmnQOtbCE)vC2NWQYqUJvML+oqOgX!kaq(QZQMt)!2+VFXOMVfg0aGWu_9Cp$~O z^%`|-MOWcBArw)b{kwGDa(}dX@)eAYW+{Uc6z&9om zyQvF4Hv+%vA*{GSoV(neqmVnK-QorGERf13j|fLlVNTfXI*kKZJ>x}N4rJLcSj-LM z$KwD$m|y}08F!iE7E#^W$>`kS(%ORxxX0E3o(uwzj~F(qhEGKcn$9eDx5CDGL7SLwVE+$%Rce2_7G2ya7p6Q#l|udNBsEB-gZjh1r|SWb4r57t1Wad<@BnOGZ& z|I;v02swR*4}f&c#$gP;T%&$$@5p9nbmAmy2V@n~MZztm5t(M~>2LChoNzdK?$JAK z>2vHhkY|`6&5#t>S}{K|1t3QfuL*csL|eZ`1{k+fYQP zkE^hF@pzzZafO-sML^zqVxJVd7_}p%z z9*H~3|IN2c6sJKHt0uC=7*u4P9^w|UP0b82SS zioq1K>A`vqQz)FP!Um|p zli9zP^ia2Sr>Rn2Cymhqw%Tc%VUeA4hZQ{Q1xhWSC1BpH#c#&dyA_^3k?zQ zC>Jpkw27s)w41dk7i~EJOj#~#OT~$};3+t?Rdf~S<5r@=J;p+3ZFCpctBe*kWf&i{ zfTPTBbK_;W+qbv~2!}nITZGr#i2t$pOO!?bTU<~`@Ci;_0_V{cF8iNx*%NFlFDncR z5w>e~Ct}pv65CIX;UPvMAD{6+H6UiFKM$SZ9c;sAtFO-YvCxu&&iI@ z@?>LJmi)}_X+5Ob^;4RCpq4l3l$M8Bw4RTmSRO|3-&NdmB78%_xr@bihZ!txt2nLD z_@ys0Iot-)eG#XaS(^j`Eghw-%{(vfeLzJx)=@m(EzEze0E=i4;(!_H?3`?lQ}Bu3 zurLRgII18=c^}K?{y~_`f=>pRVvHlLZq<3j z3FxdUnQR3l0=yUXgi5(4Hmhr5qXHGVCN?YJ4fZPLRbDd7^0%eR;WksOCrWK+Jht~d zw!e97M?AK7+{KOl=dq`lLZ9deDw9StD8njNp%z?0y6U?F1R98L_FxLb(JBWX{GZB* zv`BiB+xBVqp(j^JZVhnBJ(fC2>12&~;uAwgJeWz)ouFC?o_Az<`K;y(dF|2Wf}Zj&k`2?Weiagw&|Egx6`6^)jz^j1uyjRC+W&5-; z!BJlYM7NREd#TJJ=zyTJ-I(l$9Bayc zre8&FSaGets<<~PTy-T>{G_QC>wu>TVTHMlvyEs(A%p}cA|D}}aQPzq(Y>eO7W*!j zumB?87k;_6en53(!DU7?cx-mCeYU?a8p{H>2MeJ-YkM@7Ejb9Vl%%UAv(}PyMOBta zz~sHB{uA{DTe9$_*clPo;up(Pm3%Sy5z^fqZev$6^hG$k0+kM-;L&8kx?&Ue49d_iWPQ3Nn3TCuI63fZKxwh(?FO-ZG}`c4Cl+0Pzl6u;n(+ z$3$T*1rU#P=fXweB_lB;S(Gul_q&oL(4X=P>g&8oN){RfP4QH6xQ zIjh1w*qy49?BS}N`?E)@c4lSQ&<+)1%O(+Nxc|a~f1f2wIuN}63xcJ5c&U=$q|0xn zf1B7CBc0*LbAQ&K^}U+)9hq9+iV|)8eYW6<+Y*5E}Vi2X|J z;wV%<%7L&uoc%;*Y6rBGmM_G!<2T)=MWnJP+$JhL$N_LWGM3hXSUW$PAZR-S_4l&1 zgB>?$OWp&Fy|z}jnVl^ZYB}hpE!ug^U0w?I&|au55p5+Qw=!MLrY8sfcKk6?N^$kj zFlh=EX7KAy{+1+v$0vWKUBm!Mlr;9x?=L{gcE*C0XjF)h$Cxx$L~1FG3y#;MhNbwI zm{bzKU5MkZo>(DHdiG?n^sOsDzfVtxq~*)TOCO1rmJhR_SH38Yb=Qvou~+_0Y5D3c zZKev+@(cTXe{EVm?2KOZs~&M6yG>ylU^L8W$3Cx?bUi$ITzoI{%Z=KnK$cY?H=g8L z_9<|J52<0QbrPi2fF2mUraCDA*G}XtNts_1eop+wUM+?*@Rd|0;t`SZXiI)3-x-q% zQ45q^)3~2wM0Tc_2ezbZpwuGn+%d-$3G_y9Pd$$zeKP-k#J}F>%dB`?UeEg(rP-_0Mc3mX z?C4i9AbGhZk12it5H8}RYIOJg&S_;Fppt7;B_lXZ3#`+WN=i^%RT0Z?OANKn(=ob| zc_jMlTje%1-i@u=FQ+M_+#c&VHS@pQ>on~OcV)%9`U3s7QD``Q6kA%O^xM#GO4o0j zbo9K^Z~IkF%OslYR&nbUKMQ<8H}>krTcYLmxxSSJ{hzhm9%mT6wcN@{(@kfArRFA* zDcxL>(Z>0Sw6A`MWL0XelSh~F;CvT>Bfc)1?}g>8 zMQrOgMQtr43Y;EunqUq_eau4(`c`01arp)N!D!xNZq80tf->EMxrBa|8uYL!AM1w8 z4zKwd3PUTn@_D{4`CQ;>aH*r7jwuxqkI^ZbcE@AK4xd*o!1{+TcD9GMU1#i#X`+5G zZS>YZsJ$u|!e2;oE07eh^cbNP{J3j}fu{|#5(J$i7RU)bu%i}jb;i1y6gdLu-#q&C zVvW_m1)heGI4Y2D@w+Dj=~5=!2|rzw$*#BU(+yKFMPiWsik}(;Ok6_gD*Od<3Aub| zaff`&YeoqV74nc#b=x-46^#8d+|h|OFtfZsCcYu`-~7l3cwEk-aQS&$&Ewr!vJ6`` zOJ;bTTA(dZe0tb5kIy3{quvG@H>`&mP?~;=!Au?=sh!*g5gN$%vNwqc>tHvAYKjnnuvb{`8uv%W0d$SQyXcDcxgZlQEyuq5Z` z4Os;}RSwe>ExYKCF8$T;EW4n$qI~BqZ}*lTEiG?mv%8Fwx`phbAJgp5f}8Vbse^!A zci12_w?k*IBhg%Cza64L1B}g5Os$0N1E=VR?98G_N*_>B$zrjk zXs*SI|CgD3^)7}Y71mD7Q@q3fS9B=ppzmsrt)Uc4MQ>(hvlP#QmM+WAr&g%8ti{kL z3&zPP-UMj8<%hlH2TIE!(GFshrlXw5wWozdE2(I|icwR|WBfP#!E_0VS9sg_Ox2zS zpXT$Zw|tj^kfScl8X!qa9S1#lsApJFuQ_i?7L01eWbne>g4YIHWJ#8#sxM<*2r`sT ze@V{*OpQcqNC@U^hWFP{ z40-&858Tgd!x8(t{+*(!eKkCgOw~_Yo7A!-y%y1=S0sNFUgvvSs9XT{d3sjr*n@it z8KHOx6%dw{4Y+ORCz}%#Qy!)Px!A=q+}tJBs;&Sn#EuX?Ly!JGEB)n*#Hpr}&_Mw*&yW)?+)ssvaq|ZC8u>qAcodRLT&uq@Jv2d+g%w`AXZ*NCcXl zXk^MH3meEN-3`C9v>a1h%kID$Jd^GVeu!PKpF!}!r&>2zm`{{#$3wq-5oVysYK7eLo3h&)_czP~R(gRi6j`f(oP z&+^9t=%>|_(B)6@1VopX?^L_tKwpT4Gm77td3ryfTBunza0;sReil^A)P~9F0l(jk zKS4s$zg=(m)wWHrS)&n4$Si^2tY0HOtjJDIkt8!kq$ejT3B&aQ!v#HHn5mMvxua`t zQngu-tVm=9$z=k`aw7GBWPGv##e|Ha5`uZ)^n)os09@YAJ&;7RQ{+7j8Efew@8McMj+mc+s=Z_*0+5 z9QO-;t|gQsxfwiOW{$guA3G&;&D?F`@?f8@pI8WX+d~-5c<%_d6>YqkZ?wCbEg`Wz zdw!K{=li0pcyI{U25CiN~_F zG5eqFpDJL#oV@P=$1|1jG?nvf|6Y!k|Bg2Ez!~l0h*nmo&DbvG?`KN#@)T&?&urxB ze0C{v^gK_FRtP`n{=?dstG*@8EdCACb4I%xDd^oz+Pz2lIilUm;O{=hFc4kL!njy{ zZy)@V{_3_eWoKyC}161jmjj9)S(~B}{vU`}z znNj-4n$gMoNSmR0NVFErQoo>pV?Xf4as&^Gw}pZq$D13W5JfpQTIvybJRccIp*ko zx-*N`@88bvE>fpH2Lz;2d83!s8(UMBQ}|^O-w4F_&$*FR2>(s9vxq$kA*o1c_YQtQ z_4xj%LYNP<&;e$E@!5yI3*FC5>;q>R(~McSVyX7wN2THmi)jKZr4gJ#7z5z}+HIVN zR=ytcBgs~62;pTzDR1h5w$DLf_01w;#6@09L+~Bw4*3tB@dm2E1=~NrA#d+%OF!a4 z4_>hOhoKC48(g&wRMS};6ueif-a{?{OJ|dW3lU`bO3}| ze7w_Whr2B{a9S{s%~W_9yBK${J+DG5+8=DcMEg};t&lMe@NCsVMvn&9{C@rs{4B8f zF4x1)$^?7NrL}Yrixa2O5qlO%FCfCBgfm_&1>AE_S-S719EnvDv_$|akgw?$SBbOqw%Y3{AS`^Cw7hP)V?-b zBSoCWE$Bi@cRq`rB=iV2;*J0HhdbSX(ttOfy0&<8RD!zws z(t6IUxW~-;oB}u_EkPa0X*7e~1v`t-*-?z*Wpdr!imq2iMPZS5H?FX7ciwz08*$ITwQOg$7Tzs#c=f>fb`3!%IA$2=J7%6c|AP6B5-a4+yvO` zN@>V=p@lj1eIsygBdPug@Gyf6f-~$F%(HxK-iycGW~0&3{1=;96vG2-d>HSgSXn=(tk83z>L zaN~IFAHQKbBO8Qyg^~O2_!4s5j=iZfnEO|V&2>s_HFcd_!6LE(Be)+l1>8gB${lPa zt5>;%)vJY5wfZ-)0_f%W3JJNmF2mh=xQ9H4V|7ScdGyk_kF(!m^OAlD8IGLj)`89> zW+>(;vibR>I`MpVlD=|P*Hh8pud0vkr?e_$M!~=UsCJQ92SE1!2- z7zap=;Kz2=eQivmws=1XMOtm&q_+4wq{2d@=QK!*esm_1H*aNCT!ZIhrSbCjHrAF6 zlEDU1`(o2rKGB><*sBWy=j2Y{&=wgO*C3~;f1ab>I0P?aZlrkt+bcH2V?HZjjbV^@ zh1G*w<*lEtEHySxVUU0h>Ite2TOCw#@j+dCu}<%-ON>!9Ug0qpTQw+cd)-j=>Bj!V z(DWRal~bjx0ywCAL%;Bx;C#T>H%{sP#W99LkDOudRo=OWEIJ5RT|!!&zh1X(cN&M} z2z$PDi=0~wsaEC@9hGUzFH&lu9Ng#(?AMKVwDqTTXuc4Jdhs?Pa5+KqYptAPCPn;7- znW^y2Igbjo2ySn`>OSikQSl7++h{2}^oAd+e9&OQ*abTueafK@WEoMkZHPI1EFG2Q zHmk=9vl2rl_!%|fR|UnfY?b^YvuB^eyugthiEga#F`)QKx@N9g4KEpEn!D83j8$L+ zchtq(OSBj2&DXvrmyz4tBp({D%HQCVV>5i;t*zo~oRZ@gP%n-o=V;-b4Fjb7R{4|o zrfh?>E#SK;eG9-ASNjJa`FNv111El!(tNXmJO?j4z@(07o?!D|)T7=c+-xkoj&pwg zWioO+h`Fk6Pig`^-+I1SAq%oOw5Oe{-M?J5g-Me=AC1ToDFf`9f+c+Mjr+=No&*<}at6Rn*nb zUuLQF-;?~@=dmjE>6q6$0V~+yYIkuYWavttKQX3ge^;xTkn5+ISg=Fy3gzp8Z zKsu1xZz`apFTcm0)6FSzIb(iDj9VEXn8W3wLpV2Tp$;iXA8BiLaC|}-*pxvkfj89l zlTFdf?EHFk2Z@nGZP0>^Hp`@FRB(&n3ARNQZcCL$w3b0W4p~0r)!ubS&yTciPkb*q zw2<)H)siSvCF!327n@a2)}q2>J!Wpi>aSH%N*aDGPE{=vAIb?v7~f58cv4sW;`nPY za~GN3frBswb`al1rCSaAC-iAFRflZvWV(^Dq@sw%FwK~lMVR?S)lkATVfb+A|evYu5>Dt&9j){aR_7i z_dZTa)fwJCBoGy81qhUsh3SlIgsm^}D40uSP9Q4968!_wv2C55+a$5rx`NDisG4ea zfFVbvnl|i#`Mxaqy`VsqlLGiM=6k2=mDoA4y+U7AgHku9)5uAUMYe_0*rVW4piry6 zgmUqp@Fx(JgK?WwX|-PY9~)#V)7-FRbAp*|d;fYY<>rlGdwch8layrXalK0m=9X4k zSLD|=LFJO);Hsewd~#*fWh|EYC^i4DVD`Mpk27bV{~8Wc>Cz*YLJiHp)7ub{sz|d| zZO{VMGDpRY3(>C6Ezk|jg`ce=$+}!I$uaUtZ4PV^>f#q96{=C`hF&Xw@o9uT<)UfH@2%|aJ_XukwHJMjY)Q1TWj1t0i3Zx` zT395lOQMx6lcFn zmRx<*H-7Fx=|6_UFGg|>ZIo6xtFN6~Kh_TxB7G`uSa`|Y`j-Ea;}7HR7x5~g7Ji>r zx=)=@#T}ua1P8$b` ze8q;#Nh3T*lfJD|o*a7-1(^4DPBfp+n1lAV*BtttdE%iMKNZTRHE~6{yoNyO*jf~H z?g~ab%)4#))zriJzc3EAzDrymUJ=W?&ghxrp2BSgj|XhZ`4t>ph^u8Bw&IVIj`Xj% zR4+bAtbjnL%thrI7XrJYrbG^1FFvTf$k8b%9LHx^^5JgxSH|zIwDjSH- zb#h?D9xRk1J4P7M`1>~s^_c%%mcl)Ezty%yz(Qq2I}2>B&f?C>Qq{cGxIe&+cBR}V ziph?HAdg}wv|Z=4MV#>0L*M2al`vktud3^8(YQ_@5scIXH>?2ynUHnO^vHKZLqNTg zr0!g9d^x7AdtBYhic;a`kU`?RotQS^z-o$PdN6_{t@>kL)EYJ@{|vlwdY@1w)Gk9W zGo0gu#SSk;2^nuU^WV%Te`}*Eq%dGd2kd^Q4V%};)Qp_AW`qFbB9`yC$#yWw6fyIa z@XmB*6gujhbN34|nN+UEIax!XK@#ATJm1=RyXkDqH|nD2u8Dqlm5tv_V07|9dI6|F z2OJKZgA)cR#vjdly0}hZ&)Vcu61T^B)@iI0tU7TeL0_)3opu(V)0}(b?VRx41LYu@ zK^fdx!XGu(O<_tM_!NDGs6i((F+_m5biR1Ib{7oC7i!2vG1z9}%h24S?n=UfNuuKZ z$a2J-E6{c@US1`s;gvCdh=1@6b&!N7%{NrME*M>3qzwupfaNZC{5vQu&FAnFB?gB$ zJ^^v?n6E9}&AJOO1h)#r6%-Nssei~as;e!a{IvKH5%E>*Z$DJp3os6?z(?Vd94Zt| z28Rj^+4eTONV)puSlKG+(axOMWe-Wzgvs;W<*Mh19C6;Tw2E9o1gJMfzY!Yc874#y z0<;)q`(jqgBCMJl`A;rrgedO0r!9?(6ad^{I|y@a?kNXTvXQFhJ5C4c`L)~j<3IDJ zJw)vzGA5ftq}N=m%wM#{?iNcP{;TSA6UHcdegxU?s@PY!V3**-^6decUPzMcZF3+= zoESqwh#!P5X_gm=nVTS5$_{}u!v8JNmJ08NgFvX+Kgr7{FOq#b;zV6PuK)Osp-d3x!yql0!h%FyJ*7o3J z7SF`~m*R_A)D%}^)`LRu30K2D^zM%&eda#8ET4QGgGxu_blRoX)Jk*c@LJl8@iBB;&0&1N zYJ8g*N;&G?=FDfZl&RlU+c<_~AP*ozFN`yh($5wqEy1%8yl>E}2cEfLm0?t0R;J(? zk-@EO7xiMr&hmzVAS)?sXd- z#?IL8D?i6*%szNcxrhiGMF<#q@*8q+2)=JcdV)MMCxrP1=h|@NPxgyF5?AMiY*=?g z36wdnf~^RsEtca2Bwwz{v@=Bu4OdWL&;IU*^0~T5hzcfj68g@o<*2i67c=-OTtnp{ z0Dj-&x$I_h@M-wTL}g8y`1AP`X@JA)`F|6;VGED5C++$rJwW=_--2`C3RLJ6Nqd+y zg&B19OppS6*YxN3|G$EtV1D1D?prA@vAq_0!O!Y!`?p@qZEaO`Em@p}!Y8oUry_G< z2DH#O*>a+R`z)1$ICA2q!|^(C$L_r}n}*Ho+V$%0%NFVAKc)UhqI&E57TUQU*) z$pWe^p4}5{BkdVAg-C;JmowI+p=L-f8>gB7MjLa0a@@*OssRh%5){Z#CA828)<%D* z0YQoyMbS~cSjl0a?mguT$0b?8a-Zt0?F4`9#JVZ}Nks+emao5xZz)Yt-UOGgn4tL4 zyp5R5+n8FpYIzehx?)5vvM_ne0E?}-xR!}hZ?KIt^RugA)+|8m$N&3*ylrmts&(Ik zDQS+|gg$|pRfP$2Fg#&XI5%kQaypIznZuuj1LkPcUdejacF55VZf3e4kbUfGGy@_P z2`Cp0f{|-3Q9X^CtAseC3-3W$Xp;{q2DFQyiZBz5`wBeaXV(fGLrYcflHM6d68SD; zdRoRwGFXCJ!yix}sDwtq(jh6H#8|b^PTpK$$SBLtg;u?Bh>TS^h|xk@c%g>uX|vHx ztOXJ>;#B-?B zIOKH5%@*N^$R0gY4r9yCDTiUi*8SbGX_9fh$^bb~+7cJZ+snK`AYqj)m=1QbZ30?9 zds#N_TvwHBB#0SAObTuQ6U^n-39=aI5OiL7!`UdHfkT);hv4no6gSVgH@r@uG|(aN zh+g;zmoYiV6;@1DraTwoVYuczryC20!Qsi5DpHJ;))dGJxa#B-ChN!fd^q^w<9m9FwTT>U2Z zNE7R{0vX=q3E;qjwx!(K7?Vpxes_IP@k%m$!$DR7!VJg0)F3C9_y+`|AMtHT(SB#m zaanOpR~VQ~f);Yfc0@i0)@C$5FD9O??GH8Gj2GJC#u9BsgQxtyaZE9jvK^1!X8!&E zf9%AijK23y9Ce>4BBypDd$Q+F?AnO*yL%_r^xl97>R;Ju2GTYluGUfNaz%x|DX?R0 z#7QMcbrP@_WLEr_X|K$xG7cFBrGRmosC$#eSgoYgoRh=K%XKtRj3cOYndrNvYJ7Eu0-DoYq=$fRU_Z?v!u;B!kw&07{^DGg|a zf0R>D8}r8F1GOH~o1G31=0B_z;- z;#k=c6~$wwVE4xW8nnvn(*%e3_|4q6MmiM#* zNK04tX{H2_L^Ft*F0tC_1(jtp1A=|aUsRmMN5vO_ZrShvWl+sUN!n{WK=ecZpGwpA zh41UqvLKikxHl@rTJdiYq20m#=>=N>1u$p?5jV}?k}J!XD)R$^wWd~Z-Mg~!6$pCD zADa&)_-W{Daw}>}|G@Bc6ar+|c8E1(gf93Wjtg_%>!`Oz{Md1|_JbEsliSli^!QYM z0g7KKP^MXipJohsyOnEg;@-Ixx1;PC0kyC9Z=^BbO;WfzRaN#t)!6;nm#fBRW&5Qu z?JGn89CthZhvZ1p6~lr73h;Q1lb!422<%)Z9Guusr{fyVI%!}z$z|qdEb6YdjQp#x zS*!%;)#mh+%h{48E0nzq&}JanFRB)2WuJ$yM9YnHj6s}eK93u}HBH-WRK_RS-&3X0 z+f$|OL*JydIj$ILoZR8B_L`M5bpHv7Mp4{QaTt$w!Ukb9UfBy>u!mh- zj(kBqyV)zdsGuxYHJQ5}$137M)!6BE>~x#o!Gb-J=`_D>L(CUUh{@ufw41z%+HA5EB`j6@J%!#KnU+*58mc7tq_^a zhnEQL;Vp`RW6xiPlISvA03az%jEm8>W=`6Y-N&}4ZzvSk2hJPoNJATyTTy1!P5TPu$%W5dIP-wJe4l}DKLP|~X-}0h zZgAHWz=clpjtBF#ZenT&C-8zXOsj|J;K6_6g|Fhx{L-`Rm+lr~bui;gpzCDM{*`(c ze~n*A8^S)A?-o{Mm=aC{jd7IXWrVY#l=;1C!cjRbt^LXS=%=(o_;<5TYh%u6gOas{x(xCxWmv_k4Wc)LpK_4t+^Ms9#&%a!$MLb zF|dr#6C-T9;Ocwf9vtgnC56A>zue6Ft_WxPiu#47aoP?De<8jTYA$k7lC!eP(mYg zKh`i5zGCYouXmKb-bpYS4U1Fi_um9RVs=@iq6_1pslwm4aLta z)dXOC1bfBTt*Ce+JGgyzupULlqXW;Ns2B-sw-gl*Maeobd*GSCt}0qUQSn5UHRgfu z2KUT1&IpydA`)pqPcbs^P|bi1($)A+ki8~%l5!D7EFdmAg8H2)bsTVNh5KAu{eDzj z3y<({l#Aw|CwelA_v}#sKfi;|AkFd`_~2{Dk-uiYjSy>a;E!l!cx;BhKeLtl8MtIe zT&@-V6l>drR{u#2`$Mb$;BTk3N{Zn*rtDp9CgvZ+1N^&|e?l9Y(DLTmwY-tyy&)JK zp$^L55|1R=SKp7nWqRMs@;crHpFVP@IboHMI?-L{)va&#sPQm#05^Dufns|>LUPxx)Zs%kR}Y>NzdHIyPEwP&HjCB z9zJ3o&S>?Y$vnIx^bKAoWg6b?F%3Uv8gAqYW)A8v`0?p@1pL*KK_gDsnT7Xg29v$} zfEu^Z&JqX_8fhjcP+1HApp|9{i6nVKG^v1xil`fe z5atekl23u=DnH4|n`guIOoj4wiyz+1l`*ny_&*9Yv&)lu+xWs;rg)0hUFE+zDKy-e z%co%_nvA{tgmC#(Q%RnaR{fGpvL#Xvu#%K-yqHh63W={d zPiL-Eok5_6#;xLRIX-2=rqHqCecD|+xjU4gSi5VVB|b%ioiU=Ndt6l}mI@2xQZ3O< zUjc3>m85f{Z0*?eimvV^Mm7Xx$IE{W>I3UZB(Cy=3(D|-q9!F**0;(fgGlyMB@Op~ zCmfPK_8bSYTA_gm4Cpd0lww_A&dV8~M?cR@wjXozc) zIL;qgm}$$m-f*K_e6d59cCly!%5AoPba>(ehGJHQC;kBYd_i8!m23IgI$C{`Y%KNy zpC)TYK6b5|KMWK@;^e2xlOM>N^i0V=DBmsTKp-+x5_$ORfh|z4_6G)52 z5aZkp0BE^|vu2tVw6LKVPmR7Gpq%(Xs^ab; zKVg0QWuv)~(WHpzehS`_gDIicu{VExzSENVsN3qj*l23&xs5Xw1SYA7B>NYfX_>6C zc*VDX!UuymDP0$I(~pa3S52^X1?^>E&c#c3`D&g=O-V_KV%zi87EueQ@};n~bb#jh z*zd@PUKX;s=k%i-kIsz+oOU{I)QNS$(~L}dW2_v@5^2>T>PqVoROt*^?v!qh!YxsO zmTS}hSkK)jDm7q&g7f zoP3rT{;%3i9b_va&Kz`F9+34ew|VEb2spCAJ<*OEytw@bDsfitiC)0QbVq9anW4ZX zz*)+rwgBFINl*g35B zPq}Npur5S8bp|igj$?vv!LdqOnI(Au#4B6c8}`7UWyzJ#u;a1GzdDa11(lWWlF!u# zy|*4kIhKX!W8LNGi4Ef`=ztpKs5fo{nG^A)hh*n(}qSYano*QkbBs<1OEUbtnrt#kzZOINsW(VuQw;}_Z z6SpcBPKs~S0&o_gWE07@P_TL_-7fb3x``O(NvkE}1gRNTMwJUeuozgHd@P7jp@s?y9DP%IPm?Kkm^o!poW& z8y5b?5_t%=52{#LJ4m|Sezj(PgAxsD^fHq0>&qEacu5Lf4lh&KvbC09yog%0Ann%D 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

>NI0l1VtnSu{@JAJhZe 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 f-vAXguYKzPE}^rqavAWrbad&k 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 E0Zdn-od5s; diff --git a/Xcode/Frameworks/Opus.framework/Versions/A/Resources/Info.plist b/Xcode/Frameworks/Opus.framework/Versions/A/Resources/Info.plist index 61ff5753..e6e2a4bb 100644 --- a/Xcode/Frameworks/Opus.framework/Versions/A/Resources/Info.plist +++ b/Xcode/Frameworks/Opus.framework/Versions/A/Resources/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable Opus CFBundleGetInfoString - libopus 1.0.3 + libopus 1.3.1 CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -15,10 +15,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.0.3 + 1.3.1 CFBundleSignature ???? CFBundleVersion - 1.0.3 + 1.3.1 diff --git a/Xcode/Frameworks/Opus.framework/Versions/A/Resources/LICENSE.opus.txt b/Xcode/Frameworks/Opus.framework/Versions/A/Resources/LICENSE.opus.txt index f4159e67..9c739c34 100644 --- a/Xcode/Frameworks/Opus.framework/Versions/A/Resources/LICENSE.opus.txt +++ b/Xcode/Frameworks/Opus.framework/Versions/A/Resources/LICENSE.opus.txt @@ -14,7 +14,7 @@ notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/Xcode/Frameworks/OpusFile.framework/Versions/A/OpusFile b/Xcode/Frameworks/OpusFile.framework/Versions/A/OpusFile index f11230f0ac5ad75f2b127469aa3d3cd81f619e4c..ba60bc8d8f176bfa3311f09500e935ccb3554b39 100755 GIT binary patch literal 120724 zcmeFadw5jU^*26~1ehSOgY|+|Bvx99QcWx>BTyNbk#pdTq5{$uiW)(v*TRg1nk$o$ zY)=l*7QUr@OH1F{mey}8ZG}b@m?4-1w3vWJE-HAbp6Phuq9j~oexJ`iGsz^_{=V-Y zzvuV7&qE%VbIv|{uf6u#Yp=c5+H3E#qrf=|oTI=w3Y??BISQPkz&Q$>qrf=|oTI@1O%! z4UcW+p962!+}RI3HhaE$?v7vmYL(6PTp9?UL6)w+v+yf@^pOQ!4ep8G*k3wD3)4XO z+^xM`kk#F+S)~g?^XEPCKsvoAynBA-yjYWdpLtF{cE=Tovu1@KSvc>J`)AF2WX_}N zxqEwE|Jx~=HL79Y$u^7ey(4qGxkqk@l2lkcYox&I?#I7 zEWdAxFDqAu-wM)cJ)X&Lgqxw|tXYpdG;6`4hwppzp;?cG=KouG8E`JZ%f^fRado;X zUS`dD;L)yLJsZD*G(Mhm89w)fH@q9XhwlAP_zg%QbfXWA}#UUU⩔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 diff --git a/Xcode/Frameworks/OpusFile.framework/Versions/A/Resources/Info.plist b/Xcode/Frameworks/OpusFile.framework/Versions/A/Resources/Info.plist index d31792b3..a85a8a13 100644 --- a/Xcode/Frameworks/OpusFile.framework/Versions/A/Resources/Info.plist +++ b/Xcode/Frameworks/OpusFile.framework/Versions/A/Resources/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable OpusFile CFBundleGetInfoString - libopusfile 0.10 + libopusfile 0.11 CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -15,10 +15,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.0.3 + 0.11 CFBundleSignature ???? CFBundleVersion - 0.10 + 0.11 diff --git a/external/opus-1.0.3/001-opus.git-9c7193e4.patch b/external/opus-1.0.3/001-opus.git-9c7193e4.patch deleted file mode 100644 index fafb52cf..00000000 --- a/external/opus-1.0.3/001-opus.git-9c7193e4.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 9c7193e4f956e230d919f604df27ea4b13b62370 Mon Sep 17 00:00:00 2001 -From: Koen Vos -Date: Thu, 19 Jun 2014 20:07:55 -0400 -Subject: [PATCH] Fixes CNG to address the DTX issue reported by Gonzalo Mariano - -- Bug fix: the CNG synthesis filter output consisted of only the prediction - values, now added the input to that. -- CNG excitation level now takes into account the level from the PLC (since - both PLC and CNG can be active at the same time). -- CNG is now called before PLC_glue() to smoothen the transition out of CNG. - -Signed-off-by: Jean-Marc Valin ---- - silk/CNG.c | 15 ++++++++++----- - silk/decode_frame.c | 10 +++++----- - 2 files changed, 15 insertions(+), 10 deletions(-) - -From f662fd42eba24a3f3ba4a4f0a0f238516aa44221 Mon Sep 17 00:00:00 2001 -From: Koen Vos -Date: Fri, 20 Jun 2014 01:42:49 -0400 -Subject: [PATCH] Fixes CNG overflows from the previous commit - -Signed-off-by: Jean-Marc Valin ---- - silk/CNG.c | 14 +++++++++----- - 1 files changed, 9 insertions(+), 5 deletions(-) - -diff --git a/silk/CNG.c b/silk/CNG.c -index 8481d95..cd15001 100644 ---- a/silk/CNG.c -+++ b/silk/CNG.c -@@ -33,7 +33,7 @@ POSSIBILITY OF SUCH DAMAGE. - - /* Generates excitation for CNG LPC synthesis */ - static inline void silk_CNG_exc( -- opus_int32 residual_Q10[], /* O CNG residual signal Q10 */ -+ opus_int32 exc_Q10[], /* O CNG excitation signal Q10 */ - opus_int32 exc_buf_Q14[], /* I Random samples buffer Q10 */ - opus_int32 Gain_Q16, /* I Gain to apply */ - opus_int length, /* I Length */ -@@ -54,7 +54,7 @@ static inline void silk_CNG_exc( - idx = (opus_int)( silk_RSHIFT( seed, 24 ) & exc_mask ); - silk_assert( idx >= 0 ); - silk_assert( idx <= CNG_BUF_MASK_MAX ); -- residual_Q10[ i ] = (opus_int16)silk_SAT16( silk_SMULWW( exc_buf_Q14[ idx ], Gain_Q16 >> 4 ) ); -+ exc_Q10[ i ] = (opus_int16)silk_SAT16( silk_SMULWW( exc_buf_Q14[ idx ], Gain_Q16 >> 4 ) ); - } - *rand_seed = seed; - } -@@ -84,7 +84,7 @@ void silk_CNG( - ) - { - opus_int i, subfr; -- opus_int32 sum_Q6, max_Gain_Q16; -+ opus_int32 sum_Q6, max_Gain_Q16, gain_Q16; - opus_int16 A_Q12[ MAX_LPC_ORDER ]; - opus_int32 CNG_sig_Q10[ MAX_FRAME_LENGTH + MAX_LPC_ORDER ]; - silk_CNG_struct *psCNG = &psDec->sCNG; -@@ -125,7 +125,17 @@ void silk_CNG( - if( psDec->lossCnt ) { - - /* Generate CNG excitation */ -- silk_CNG_exc( CNG_sig_Q10 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, psCNG->CNG_smth_Gain_Q16, length, &psCNG->rand_seed ); -+ gain_Q16 = silk_SMULWW( psDec->sPLC.randScale_Q14, psDec->sPLC.prevGain_Q16[1] ); -+ if( gain_Q16 >= (1 << 21) || psCNG->CNG_smth_Gain_Q16 > (1 << 23) ) { -+ gain_Q16 = silk_SMULTT( gain_Q16, gain_Q16 ); -+ gain_Q16 = silk_SUB_LSHIFT32(silk_SMULTT( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); -+ gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 16 ); -+ } else { -+ gain_Q16 = silk_SMULWW( gain_Q16, gain_Q16 ); -+ gain_Q16 = silk_SUB_LSHIFT32(silk_SMULWW( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); -+ gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 8 ); -+ } -+ silk_CNG_exc( CNG_sig_Q10 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, gain_Q16, length, &psCNG->rand_seed ); - - /* Convert CNG NLSF to filter representation */ - silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order ); -@@ -158,7 +168,7 @@ void silk_CNG( - /* Update states */ - CNG_sig_Q10[ MAX_LPC_ORDER + i ] = silk_ADD_LSHIFT( CNG_sig_Q10[ MAX_LPC_ORDER + i ], sum_Q6, 4 ); - -- frame[ i ] = silk_ADD_SAT16( frame[ i ], silk_RSHIFT_ROUND( sum_Q6, 6 ) ); -+ frame[ i ] = silk_ADD_SAT16( frame[ i ], silk_RSHIFT_ROUND( CNG_sig_Q10[ MAX_LPC_ORDER + i ], 10 ) ); - } - silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q10[ length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); - } else { -diff --git a/silk/decode_frame.c b/silk/decode_frame.c -index 37459a3..6a7cffb 100644 ---- a/silk/decode_frame.c -+++ b/silk/decode_frame.c -@@ -107,16 +107,16 @@ opus_int silk_decode_frame( - silk_memmove( psDec->outBuf, &psDec->outBuf[ psDec->frame_length ], mv_len * sizeof(opus_int16) ); - silk_memcpy( &psDec->outBuf[ mv_len ], pOut, psDec->frame_length * sizeof( opus_int16 ) ); - -- /****************************************************************/ -- /* Ensure smooth connection of extrapolated and good frames */ -- /****************************************************************/ -- silk_PLC_glue_frames( psDec, pOut, L ); -- - /************************************************/ - /* Comfort noise generation / estimation */ - /************************************************/ - silk_CNG( psDec, psDecCtrl, pOut, L ); - -+ /****************************************************************/ -+ /* Ensure smooth connection of extrapolated and good frames */ -+ /****************************************************************/ -+ silk_PLC_glue_frames( psDec, pOut, L ); -+ - /* Update some decoder state variables */ - psDec->lagPrev = psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; - --- -1.7.2.5 - diff --git a/external/opus-1.0.3/002-opus.git-a88d8365.patch b/external/opus-1.0.3/002-opus.git-a88d8365.patch deleted file mode 100644 index 25c64ddc..00000000 --- a/external/opus-1.0.3/002-opus.git-a88d8365.patch +++ /dev/null @@ -1,28 +0,0 @@ -From a88d8365d42e5369777afa496b43ea88a1aa9106 Mon Sep 17 00:00:00 2001 -From: Jean-Marc Valin -Date: Wed, 18 Jun 2014 17:06:32 -0400 -Subject: [PATCH] Fixes a bug in silk_sum_sqr_shift() that was causing issues with Burg. - -When an overflow happened in silk_sum_sqr_shift(), the sample pair causing -the overflow would be counted twice. This would lead to the C0 in -silk_burg_modified() being too large and cause problems on loud, tonal -signals. Thanks to Marcello Caramma for tracking down the problem. ---- - silk/sum_sqr_shift.c | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -diff --git a/silk/sum_sqr_shift.c b/silk/sum_sqr_shift.c -index 12514c9..129df19 100644 ---- a/silk/sum_sqr_shift.c -+++ b/silk/sum_sqr_shift.c -@@ -53,6 +53,7 @@ void silk_sum_sqr_shift( - /* Scale down */ - nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); - shft = 2; -+ i+=2; - break; - } - } --- -1.7.2.5 - diff --git a/external/opus-1.0.3/003-opus.git-25b27a9c.patch b/external/opus-1.0.3/003-opus.git-25b27a9c.patch deleted file mode 100644 index b44a34a5..00000000 --- a/external/opus-1.0.3/003-opus.git-25b27a9c.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 25b27a9c167302769db512a9e32c66323bc7904c Mon Sep 17 00:00:00 2001 -From: Mark Harris -Date: Thu, 27 Nov 2014 08:48:09 -0800 -Subject: [PATCH] multistream: improve arg check - -Avoid undefined behavior (signed arithmetic overflow) or -implementation-defined behavior (malloc(0)) on out-of-range arguments, -e.g. opus_multistream_encoder_create(48000, 2, 2147483647, 1, ...) -or opus_multistream_surround_encoder_create(48000, 3, 0, ...). - -Signed-off-by: Jean-Marc Valin ---- - src/opus_multistream_decoder.c | 4 ++-- - src/opus_multistream_encoder.c | 14 +++++++++++--- - 2 files changed, 13 insertions(+), 5 deletions(-) - ---- opus-1.0.3/src/opus_multistream.c~ 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3/src/opus_multistream.c 2014-12-20 12:20:10.000000000 +0200 -@@ -215,7 +215,7 @@ static int opus_multistream_encoder_init - char *ptr; - - if ((channels>255) || (channels<1) || (coupled_streams>streams) || -- (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0)) -+ (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) - return OPUS_BAD_ARG; - - st->layout.nb_channels = channels; -@@ -325,7 +325,7 @@ OpusMSEncoder *opus_multistream_encoder_ - int ret; - OpusMSEncoder *st; - if ((channels>255) || (channels<1) || (coupled_streams>streams) || -- (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0)) -+ (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) - { - if (error) - *error = OPUS_BAD_ARG; -@@ -361,6 +361,7 @@ OpusMSEncoder *opus_multistream_surround - ) - { - int ret; -+ opus_int32 size; - OpusMSEncoder *st; - if ((channels>255) || (channels<1)) - { -@@ -368,7 +369,14 @@ OpusMSEncoder *opus_multistream_surround - *error = OPUS_BAD_ARG; - return NULL; - } -- st = (OpusMSEncoder *)opus_alloc(opus_multistream_surround_encoder_get_size(channels, mapping_family)); -+ size = opus_multistream_surround_encoder_get_size(channels, mapping_family); -+ if (!size) -+ { -+ if (error) -+ *error = OPUS_UNIMPLEMENTED; -+ return NULL; -+ } -+ st = (OpusMSEncoder *)opus_alloc(size); - if (st==NULL) - { - if (error) -@@ -856,7 +864,7 @@ int opus_multistream_decoder_init( - char *ptr; - - if ((channels>255) || (channels<1) || (coupled_streams>streams) || -- (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0)) -+ (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) - return OPUS_BAD_ARG; - - st->layout.nb_channels = channels; -@@ -900,7 +908,7 @@ OpusMSDecoder *opus_multistream_decoder_ - int ret; - OpusMSDecoder *st; - if ((channels>255) || (channels<1) || (coupled_streams>streams) || -- (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0)) -+ (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) - { - if (error) - *error = OPUS_BAD_ARG; diff --git a/external/opus-1.0.3/004-opus.git-3499e78b.patch b/external/opus-1.0.3/004-opus.git-3499e78b.patch deleted file mode 100644 index 93e4b1db..00000000 --- a/external/opus-1.0.3/004-opus.git-3499e78b.patch +++ /dev/null @@ -1,169 +0,0 @@ -From: Koen Vos -Date: Mon, 10 Aug 2015 16:22:25 +0000 (-0400) -Subject: Fix for flutter with FEC -X-Git-Url: http://git.xiph.org/?p=opus.git;a=commitdiff_plain;h=3499e78bd5a93edcef80f6cbd88e7fc1e1666d9b - -Fix for flutter with FEC - -The bug was caused by an improper feedback of the per-frame bitrate, causing -the bitrate to jump up and down from frame to frame, within a packet. -The patch avoids this, and also gives a slight improvement in general for -multi-frame packets, even without FEC. - -Signed-off-by: Jean-Marc Valin ---- - -diff --git a/silk/control_SNR.c b/silk/control_SNR.c -index f04e69f..cee87eb 100644 ---- a/silk/control_SNR.c -+++ b/silk/control_SNR.c -@@ -66,16 +66,11 @@ opus_int silk_control_SNR( - if( TargetRate_bps <= rateTable[ k ] ) { - frac_Q6 = silk_DIV32( silk_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ), - rateTable[ k ] - rateTable[ k - 1 ] ); - psEncC->SNR_dB_Q7 = silk_LSHIFT( silk_SNR_table_Q1[ k - 1 ], 6 ) + silk_MUL( frac_Q6, silk_SNR_table_Q1[ k ] - silk_SNR_table_Q1[ k - 1 ] ); - break; - } - } -- -- /* Reduce coding quality whenever LBRR is enabled, to free up some bits */ -- if( psEncC->LBRR_enabled ) { -- psEncC->SNR_dB_Q7 = silk_SMLABB( psEncC->SNR_dB_Q7, 12 - psEncC->LBRR_GainIncreases, SILK_FIX_CONST( -0.25, 7 ) ); -- } - } - - return ret; - } -diff --git a/silk/control_codec.c b/silk/control_codec.c -index 1f674bd..044eea3 100644 ---- a/silk/control_codec.c -+++ b/silk/control_codec.c -@@ -393,30 +393,36 @@ static opus_int silk_setup_complexity( - } - - static inline opus_int silk_setup_LBRR( - silk_encoder_state *psEncC, /* I/O */ - const opus_int32 TargetRate_bps /* I */ - ) - { -- opus_int ret = SILK_NO_ERROR; -+ opus_int LBRR_in_previous_packet, ret = SILK_NO_ERROR; - opus_int32 LBRR_rate_thres_bps; - -+ LBRR_in_previous_packet = psEncC->LBRR_enabled; - psEncC->LBRR_enabled = 0; - if( psEncC->useInBandFEC && psEncC->PacketLoss_perc > 0 ) { - if( psEncC->fs_kHz == 8 ) { - LBRR_rate_thres_bps = LBRR_NB_MIN_RATE_BPS; - } else if( psEncC->fs_kHz == 12 ) { - LBRR_rate_thres_bps = LBRR_MB_MIN_RATE_BPS; - } else { - LBRR_rate_thres_bps = LBRR_WB_MIN_RATE_BPS; - } - LBRR_rate_thres_bps = silk_SMULWB( silk_MUL( LBRR_rate_thres_bps, 125 - silk_min( psEncC->PacketLoss_perc, 25 ) ), SILK_FIX_CONST( 0.01, 16 ) ); - - if( TargetRate_bps > LBRR_rate_thres_bps ) { - /* Set gain increase for coding LBRR excitation */ -+ if( LBRR_in_previous_packet == 0 ) { -+ /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */ -+ psEncC->LBRR_GainIncreases = 7; -+ } else { -+ psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.4, 16 ) ), 2 ); -+ } - psEncC->LBRR_enabled = 1; -- psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.4, 16 ) ), 2 ); - } - } - - return ret; - } -diff --git a/silk/enc_API.c b/silk/enc_API.c -index f1993ad..f806028 100644 ---- a/silk/enc_API.c -+++ b/silk/enc_API.c -@@ -372,34 +372,41 @@ opus_int silk_Encode( /* O Returns error co - } - } - - /* Reset LBRR flags */ - for( n = 0; n < encControl->nChannelsInternal; n++ ) { - silk_memset( psEnc->state_Fxx[ n ].sCmn.LBRR_flags, 0, sizeof( psEnc->state_Fxx[ n ].sCmn.LBRR_flags ) ); - } -+ -+ psEnc->nBitsUsedLBRR = ec_tell( psRangeEnc ); - } - - silk_HP_variable_cutoff( psEnc->state_Fxx ); - - /* Total target bits for packet */ - nBits = silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 ); -- /* Subtract half of the bits already used */ -+ /* Subtract bits used for LBRR */ - if( !prefillFlag ) { -- nBits -= ec_tell( psRangeEnc ) >> 1; -+ nBits -= psEnc->nBitsUsedLBRR; - } - /* Divide by number of uncoded frames left in packet */ -- nBits = silk_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket - psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ); -+ nBits = silk_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket ); - /* Convert to bits/second */ - if( encControl->payloadSize_ms == 10 ) { - TargetRate_bps = silk_SMULBB( nBits, 100 ); - } else { - TargetRate_bps = silk_SMULBB( nBits, 50 ); - } -- /* Subtract fraction of bits in excess of target in previous packets */ -+ /* Subtract fraction of bits in excess of target in previous frames and packets */ - TargetRate_bps -= silk_DIV32_16( silk_MUL( psEnc->nBitsExceeded, 1000 ), BITRESERVOIR_DECAY_TIME_MS ); -+ if( !prefillFlag && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded > 0 ) { -+ /* Compare actual vs target bits so far in this packet */ -+ opus_int32 bitsBalance = ec_tell( psRangeEnc ) - psEnc->nBitsUsedLBRR - nBits * psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded; -+ TargetRate_bps -= silk_DIV32_16( silk_MUL( bitsBalance, 1000 ), BITRESERVOIR_DECAY_TIME_MS ); -+ } - /* Never exceed input bitrate */ - TargetRate_bps = silk_LIMIT( TargetRate_bps, encControl->bitRate, 5000 ); - - /* Convert Left/Right to Mid/Side */ - if( encControl->nChannelsInternal == 2 ) { - silk_stereo_LR_to_MS( &psEnc->sStereo, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ 2 ], &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ 2 ], - psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], &psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], -diff --git a/silk/fixed/structs_FIX.h b/silk/fixed/structs_FIX.h -index 244b479..3294b25 100644 ---- a/silk/fixed/structs_FIX.h -+++ b/silk/fixed/structs_FIX.h -@@ -112,14 +112,15 @@ typedef struct { - - /************************/ - /* Encoder Super Struct */ - /************************/ - typedef struct { - silk_encoder_state_FIX state_Fxx[ ENCODER_NUM_CHANNELS ]; - stereo_enc_state sStereo; -+ opus_int32 nBitsUsedLBRR; - opus_int32 nBitsExceeded; - opus_int nChannelsAPI; - opus_int nChannelsInternal; - opus_int nPrevChannelsInternal; - opus_int timeSinceSwitchAllowed_ms; - opus_int allowBandwidthSwitch; - opus_int prev_decode_only_middle; -diff --git a/silk/float/structs_FLP.h b/silk/float/structs_FLP.h -index bb529e7..14d647c 100644 ---- a/silk/float/structs_FLP.h -+++ b/silk/float/structs_FLP.h -@@ -111,14 +111,15 @@ typedef struct { - - /************************/ - /* Encoder Super Struct */ - /************************/ - typedef struct { - silk_encoder_state_FLP state_Fxx[ ENCODER_NUM_CHANNELS ]; - stereo_enc_state sStereo; -+ opus_int32 nBitsUsedLBRR; - opus_int32 nBitsExceeded; - opus_int nChannelsAPI; - opus_int nChannelsInternal; - opus_int nPrevChannelsInternal; - opus_int timeSinceSwitchAllowed_ms; - opus_int allowBandwidthSwitch; - opus_int prev_decode_only_middle; diff --git a/external/opus-1.0.3/005-opus.git-70a3d641.patch b/external/opus-1.0.3/005-opus.git-70a3d641.patch deleted file mode 100644 index cc19b746..00000000 --- a/external/opus-1.0.3/005-opus.git-70a3d641.patch +++ /dev/null @@ -1,49 +0,0 @@ -From: Felicia Lim -Date: Thu, 28 Jul 2016 13:21:19 +0000 (+0200) -Subject: Ensure that NLSF cannot be negative when computing a min distance between them -X-Git-Tag: v1.1.4~1 -X-Git-Url: http://git.xiph.org/?p=opus.git;a=commitdiff_plain;h=70a3d641b760b3d313b6025f82aed93a460720e5 - -Ensure that NLSF cannot be negative when computing a min distance between them - -Without the fix, very large NLSF values could cause the stabilization code -in silk/NLSF_stabilize.c to wrap-around and have the last value in -NLSF_Q15[] to be negative, close to -32768. That value would then be -used in silk_NLSF2A() to compute f_int, which would be equal to -128. Since -f_int is used to look up into constant table silk_LSFCosTab_FIX_Q12[], it -would cause two 16-bit reads, 256 bytes and 254 bytes before the constant -table. In nornal circumstances the code will simply read from the wrong -table, resulting in an unstable LPC filter. The filter would then go -through the LPC stabilization code at the end of silk_NLSF2A(). Ultimately -the output audio would be garbage, but no worse than with any other harmless -bad packet. - -For this bug to cause a crash, the linker would have to put the relevant -at the very beginning of the segment, with unaddressable memory just before it. -Alternatively, if the code is compiled with assertions enable, then it will -abort. The only way this could cause a data leak would be for the linker to -put the silk_LSFCosTab_FIX_Q12[] within 256 bytes after sensitive process -information, which is highly unlikely. Even in that circumstance, only 32 bits -of data could be read, at location outside of the attacker's control. The -output would be in the form of audio that would have to be mapped back to -the original 32-bit data. - -This was reported as CVE-2017-0381. Contrary to that report, we do not believe -that any remote code execution is possible. - -Signed-off-by: Jean-Marc Valin ---- - -diff --git a/silk/NLSF_stabilize.c b/silk/NLSF_stabilize.c -index 1fa1ea3..8f3426b 100644 ---- a/silk/NLSF_stabilize.c -+++ b/silk/NLSF_stabilize.c -@@ -130,7 +130,7 @@ void silk_NLSF_stabilize( - - /* Keep delta_min distance between the NLSFs */ - for( i = 1; i < L; i++ ) -- NLSF_Q15[i] = silk_max_int( NLSF_Q15[i], NLSF_Q15[i-1] + NDeltaMin_Q15[i] ); -+ NLSF_Q15[i] = silk_max_int( NLSF_Q15[i], silk_ADD_SAT16( NLSF_Q15[i-1], NDeltaMin_Q15[i] ) ); - - /* Last NLSF should be no higher than 1 - NDeltaMin[L] */ - NLSF_Q15[L-1] = silk_min_int( NLSF_Q15[L-1], (1<<15) - NDeltaMin_Q15[L] ); diff --git a/external/opus-1.0.3/006-opus.git-6e961737.patch b/external/opus-1.0.3/006-opus.git-6e961737.patch deleted file mode 100644 index 8b142163..00000000 --- a/external/opus-1.0.3/006-opus.git-6e961737.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Daniel Verkamp -Date: Thu, 22 Oct 2015 00:24:41 +0000 (-0700) -Subject: win32: only use dllexport when building DLL -X-Git-Tag: v1.1.3~76 -X-Git-Url: http://git.xiph.org/?p=opus.git;a=commitdiff_plain;h=6e9617371f7cf3f669a60d9540723a01f1128fc8 - -win32: only use dllexport when building DLL - -If building a static library, marking symbols as dllexport causes them -to be exported from the final executable. For example, run -objdump -x opus_demo.exe on a --disabled-shared build and look for the -export table; there should not be one in a normal Win32 .exe file, but -when linking static libopus, the exe exports all of the opus_* public -functions. - -Use the libtool-defined DLL_EXPORT flag to determine whether we are -building a DLL and only specify __declspec(dllexport) in that case. ---- - -diff --git a/include/opus_defines.h b/include/opus_defines.h -index 647ed5d..315412d 100644 ---- a/include/opus_defines.h -+++ b/include/opus_defines.h -@@ -65,7 +65,7 @@ extern "C" { - - #ifndef OPUS_EXPORT - # if defined(WIN32) --# ifdef OPUS_BUILD -+# if defined(OPUS_BUILD) && defined(DLL_EXPORT) - # define OPUS_EXPORT __declspec(dllexport) - # else - # define OPUS_EXPORT diff --git a/external/opus-1.0.3/030-opus-1.0.3-decoder-only.diff b/external/opus-1.0.3/030-opus-1.0.3-decoder-only.diff deleted file mode 100644 index 0a53d9b5..00000000 --- a/external/opus-1.0.3/030-opus-1.0.3-decoder-only.diff +++ /dev/null @@ -1,716 +0,0 @@ -diff -urNp opus-1.0.3/celt/bands.c opus-1.0.3-dec/celt/bands.c ---- opus-1.0.3/celt/bands.c 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/celt/bands.c 2017-03-03 08:10:00.000000000 +0300 -@@ -295,6 +295,7 @@ void anti_collapse(const CELTMode *m, ce - } - } - -+#ifdef OPUS_ENABLE_ENCODER - static void intensity_stereo(const CELTMode *m, celt_norm *X, celt_norm *Y, const celt_ener *bandE, int bandID, int N) - { - int i = bandID; -@@ -332,6 +333,7 @@ static void stereo_split(celt_norm *X, c - Y[j] = r-l; - } - } -+#endif /* OPUS_ENABLE_ENCODER */ - - static void stereo_merge(celt_norm *X, celt_norm *Y, opus_val16 mid, int N) - { -@@ -675,11 +677,14 @@ static unsigned quant_band(int encode, c - int sign=0; - if (*remaining_bits>=1<>k, 1<>k, 1<>4]<<2; -@@ -726,8 +733,10 @@ static unsigned quant_band(int encode, c - /* Increasing the time resolution */ - while ((N_B&1) == 0 && tf_change<0) - { -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - haar1(X, N_B, B); -+ #endif - if (lowband) - haar1(lowband, N_B, B); - fill |= fill<1) - { -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - deinterleave_hadamard(X, N_B>>recombine, B0<>recombine, B0<=intensity) - qn = 1; -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - /* theta is the atan() of the ratio between the (normalized) -@@ -787,11 +799,14 @@ static unsigned quant_band(int encode, c - 2) they are orthogonal. */ - itheta = stereo_itheta(X, Y, stereo, N); - } -+ #endif - tell = ec_tell_frac(ec); - if (qn!=1) - { -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - itheta = (itheta*qn+8192)>>14; -+ #endif - - /* Entropy coding of the angle. We use a uniform pdf for the - time split, a step for stereo, and a triangular one for the rest. */ -@@ -802,10 +817,13 @@ static unsigned quant_band(int encode, c - int x0 = qn/2; - int ft = p0*(x0+1) + x0; - /* Use a probability of p0 up to itheta=8192 and then use 1 after */ -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); -- } else { -+ } else -+ #endif -+ { - int fs; - fs=ec_decode(ec,ft); - if (fs<(x0+1)*p0) -@@ -817,13 +835,16 @@ static unsigned quant_band(int encode, c - } - } else if (B0>1 || stereo) { - /* Uniform pdf */ -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - ec_enc_uint(ec, itheta, qn+1); - else -+ #endif - itheta = ec_dec_uint(ec, qn+1); - } else { - int fs=1, ft; - ft = ((qn>>1)+1)*((qn>>1)+1); -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - int fl; -@@ -833,7 +854,9 @@ static unsigned quant_band(int encode, c - ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); - - ec_encode(ec, fl, fl+fs, ft); -- } else { -+ } else -+ #endif -+ { - /* Triangular pdf */ - int fl=0; - int fm; -@@ -857,6 +880,7 @@ static unsigned quant_band(int encode, c - } - } - itheta = (opus_int32)itheta*16384/qn; -+ #ifdef OPUS_ENABLE_ENCODER - if (encode && stereo) - { - if (itheta==0) -@@ -864,9 +888,11 @@ static unsigned quant_band(int encode, c - else - stereo_split(X, Y, N); - } -+ #endif - /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate. - Let's do that at higher complexity */ - } else if (stereo) { -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - inv = itheta > 8192; -@@ -878,11 +904,14 @@ static unsigned quant_band(int encode, c - } - intensity_stereo(m, X, Y, bandE, i, N); - } -+ #endif - if (b>2< 2<0); -@@ -620,6 +621,7 @@ void encode_pulses(const int *_y,int _n, - } - #endif - } -+#endif /* OPUS_ENABLE_ENCODER */ - - void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec) - { -diff -urNp opus-1.0.3/celt/laplace.c opus-1.0.3-dec/celt/laplace.c ---- opus-1.0.3/celt/laplace.c 2013-03-12 19:43:58.000000000 +0200 -+++ opus-1.0.3-dec/celt/laplace.c 2017-03-03 08:10:00.000000000 +0300 -@@ -48,6 +48,7 @@ static unsigned ec_laplace_get_freq1(uns - return ft*(opus_int32)(16384-decay)>>15; - } - -+#ifdef OPUS_ENABLE_ENCODER - void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay) - { - unsigned fl; -@@ -90,6 +91,7 @@ void ec_laplace_encode(ec_enc *enc, int - } - ec_encode_bin(enc, fl, fl+fs, 15); - } -+#endif /* OPUS_ENABLE_ENCODER */ - - int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay) - { -diff -urNp opus-1.0.3/celt/quant_bands.c opus-1.0.3-dec/celt/quant_bands.c ---- opus-1.0.3/celt/quant_bands.c 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/celt/quant_bands.c 2017-03-03 08:10:00.000000000 +0300 -@@ -139,6 +139,7 @@ static const unsigned char e_prob_model[ - - static const unsigned char small_energy_icdf[3]={2,1,0}; - -+#ifdef OPUS_ENABLE_ENCODER - static opus_val32 loss_distortion(const opus_val16 *eBands, opus_val16 *oldEBands, int start, int end, int len, int C) - { - int c, i; -@@ -418,6 +419,7 @@ void quant_energy_finalise(const CELTMod - } - } - } -+#endif /* OPUS_ENABLE_ENCODER */ - - void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM) - { -diff -urNp opus-1.0.3/celt/rate.c opus-1.0.3-dec/celt/rate.c ---- opus-1.0.3/celt/rate.c 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/celt/rate.c 2017-03-03 08:10:00.000000000 +0300 -@@ -343,6 +343,7 @@ static inline int interp_bits2pulses(con - This ensures that we have enough bits to code the skip flag.*/ - if (band_bits >= IMAX(thresh[j], alloc_floor+(1< 0) - { -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - *intensity = IMIN(*intensity, codedBands); - ec_enc_uint(ec, *intensity-start, codedBands+1-start); - } - else -+ #endif - *intensity = start+ec_dec_uint(ec, codedBands+1-start); - } - else -@@ -404,9 +409,11 @@ static inline int interp_bits2pulses(con - } - if (dual_stereo_rsv > 0) - { -+ #ifdef OPUS_ENABLE_ENCODER - if (encode) - ec_enc_bit_logp(ec, *dual_stereo, 1); - else -+ #endif - *dual_stereo = ec_dec_bit_logp(ec, 1); - } - else -diff -urNp opus-1.0.3/celt/vq.c opus-1.0.3-dec/celt/vq.c ---- opus-1.0.3/celt/vq.c 2013-05-27 01:54:05.000000000 +0300 -+++ opus-1.0.3-dec/celt/vq.c 2017-03-03 08:10:00.000000000 +0300 -@@ -151,6 +151,7 @@ static unsigned extract_collapse_mask(in - return collapse_mask; - } - -+#ifdef OPUS_ENABLE_ENCODER - unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc - #ifdef RESYNTH - , opus_val16 gain -@@ -316,6 +317,7 @@ unsigned alg_quant(celt_norm *X, int N, - RESTORE_STACK; - return collapse_mask; - } -+#endif /* OPUS_ENABLE_ENCODER */ - - /** Decode pulse vector and combine the result with the pitch vector to produce - the final normalised signal in the current band. */ -diff -urNp opus-1.0.3/celt_sources.mk opus-1.0.3-dec/celt_sources.mk ---- opus-1.0.3/celt_sources.mk 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/celt_sources.mk 2017-03-03 08:10:00.000000000 +0300 -@@ -3,7 +3,6 @@ celt/celt.c \ - celt/cwrs.c \ - celt/entcode.c \ - celt/entdec.c \ --celt/entenc.c \ - celt/kiss_fft.c \ - celt/laplace.c \ - celt/mathops.c \ -@@ -14,3 +13,5 @@ celt/celt_lpc.c \ - celt/quant_bands.c \ - celt/rate.c \ - celt/vq.c -+ -+CELT_SOURCES_ENC = celt/entenc.c -diff -urNp opus-1.0.3/opus_sources.mk opus-1.0.3-dec/opus_sources.mk ---- opus-1.0.3/opus_sources.mk 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/opus_sources.mk 2017-03-03 08:10:00.000000000 +0300 -@@ -1,5 +1,6 @@ --OPUS_SOURCES = src/opus.c \ --src/opus_decoder.c \ -+OPUS_SOURCES = src/opus_decoder.c \ -+src/opus_multistream.c -+ -+OPUS_SOURCES_ENC = src/opus.c \ - src/opus_encoder.c \ --src/opus_multistream.c \ - src/repacketizer.c -diff -urNp opus-1.0.3/silk/code_signs.c opus-1.0.3-dec/silk/code_signs.c ---- opus-1.0.3/silk/code_signs.c 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/silk/code_signs.c 2017-03-03 08:10:00.000000000 +0300 -@@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE. - #define silk_enc_map(a) ( silk_RSHIFT( (a), 15 ) + 1 ) - #define silk_dec_map(a) ( silk_LSHIFT( (a), 1 ) - 1 ) - -+#ifdef OPUS_ENABLE_ENCODER - /* Encodes signs of excitation */ - void silk_encode_signs( - ec_enc *psRangeEnc, /* I/O Compressor data structure */ -@@ -70,6 +71,7 @@ void silk_encode_signs( - q_ptr += SHELL_CODEC_FRAME_LENGTH; - } - } -+#endif /* OPUS_ENABLE_ENCODER */ - - /* Decodes signs of excitation */ - void silk_decode_signs( -diff -urNp opus-1.0.3/silk/shell_coder.c opus-1.0.3-dec/silk/shell_coder.c ---- opus-1.0.3/silk/shell_coder.c 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/silk/shell_coder.c 2017-03-03 08:10:00.000000000 +0300 -@@ -45,6 +45,7 @@ static inline void combine_pulses( - } - } - -+#ifdef OPUS_ENABLE_ENCODER - static inline void encode_split( - ec_enc *psRangeEnc, /* I/O compressor data structure */ - const opus_int p_child1, /* I pulse amplitude of first child subframe */ -@@ -56,6 +57,7 @@ static inline void encode_split( - ec_enc_icdf( psRangeEnc, p_child1, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 ); - } - } -+#endif /* OPUS_ENABLE_ENCODER */ - - static inline void decode_split( - opus_int *p_child1, /* O pulse amplitude of first child subframe */ -@@ -74,6 +76,7 @@ static inline void decode_split( - } - } - -+#ifdef OPUS_ENABLE_ENCODER - /* Shell encoder, operates on one shell code frame of 16 pulses */ - void silk_shell_encoder( - ec_enc *psRangeEnc, /* I/O compressor data structure */ -@@ -113,7 +116,7 @@ void silk_shell_encoder( - encode_split( psRangeEnc, pulses0[ 12 ], pulses1[ 6 ], silk_shell_code_table0 ); - encode_split( psRangeEnc, pulses0[ 14 ], pulses1[ 7 ], silk_shell_code_table0 ); - } -- -+#endif /* OPUS_ENABLE_ENCODER */ - - /* Shell decoder, operates on one shell code frame of 16 pulses */ - void silk_shell_decoder( -diff -urNp opus-1.0.3/silk_sources.mk opus-1.0.3-dec/silk_sources.mk ---- opus-1.0.3/silk_sources.mk 2013-03-12 19:43:58.000000000 +0200 -+++ opus-1.0.3-dec/silk_sources.mk 2017-03-03 08:10:00.000000000 +0300 -@@ -9,15 +9,8 @@ silk/decode_indices.c \ - silk/decode_pulses.c \ - silk/decoder_set_fs.c \ - silk/dec_API.c \ --silk/enc_API.c \ --silk/encode_indices.c \ --silk/encode_pulses.c \ - silk/gain_quant.c \ --silk/interpolate.c \ --silk/LP_variable_cutoff.c \ - silk/NLSF_decode.c \ --silk/NSQ.c \ --silk/NSQ_del_dec.c \ - silk/PLC.c \ - silk/shell_coder.c \ - silk/tables_gain.c \ -@@ -27,25 +20,8 @@ silk/tables_NLSF_CB_WB.c \ - silk/tables_other.c \ - silk/tables_pitch_lag.c \ - silk/tables_pulses_per_block.c \ --silk/VAD.c \ --silk/control_audio_bandwidth.c \ --silk/quant_LTP_gains.c \ --silk/VQ_WMat_EC.c \ --silk/HP_variable_cutoff.c \ --silk/NLSF_encode.c \ --silk/NLSF_VQ.c \ - silk/NLSF_unpack.c \ --silk/NLSF_del_dec_quant.c \ --silk/process_NLSFs.c \ --silk/stereo_LR_to_MS.c \ - silk/stereo_MS_to_LR.c \ --silk/check_control_input.c \ --silk/control_SNR.c \ --silk/init_encoder.c \ --silk/control_codec.c \ --silk/A2NLSF.c \ --silk/ana_filt_bank_1.c \ --silk/biquad_alt.c \ - silk/bwexpander_32.c \ - silk/bwexpander.c \ - silk/debug.c \ -@@ -61,22 +37,47 @@ silk/NLSF_stabilize.c \ - silk/NLSF_VQ_weights_laroia.c \ - silk/pitch_est_tables.c \ - silk/resampler.c \ --silk/resampler_down2_3.c \ --silk/resampler_down2.c \ - silk/resampler_private_AR2.c \ - silk/resampler_private_down_FIR.c \ - silk/resampler_private_IIR_FIR.c \ - silk/resampler_private_up2_HQ.c \ - silk/resampler_rom.c \ --silk/sigm_Q15.c \ - silk/sort.c \ - silk/sum_sqr_shift.c \ --silk/stereo_decode_pred.c \ -+silk/stereo_decode_pred.c -+ -+SILK_SOURCES_ENC = \ -+silk/enc_API.c \ -+silk/encode_indices.c \ -+silk/encode_pulses.c \ -+silk/interpolate.c \ -+silk/LP_variable_cutoff.c \ -+silk/NSQ.c \ -+silk/NSQ_del_dec.c \ -+silk/VAD.c \ -+silk/control_audio_bandwidth.c \ -+silk/quant_LTP_gains.c \ -+silk/VQ_WMat_EC.c \ -+silk/HP_variable_cutoff.c \ -+silk/NLSF_encode.c \ -+silk/NLSF_VQ.c \ -+silk/NLSF_del_dec_quant.c \ -+silk/process_NLSFs.c \ -+silk/stereo_LR_to_MS.c \ -+silk/check_control_input.c \ -+silk/control_SNR.c \ -+silk/init_encoder.c \ -+silk/control_codec.c \ -+silk/A2NLSF.c \ -+silk/ana_filt_bank_1.c \ -+silk/biquad_alt.c \ -+silk/resampler_down2_3.c \ -+silk/resampler_down2.c \ -+silk/sigm_Q15.c \ - silk/stereo_encode_pred.c \ - silk/stereo_find_predictor.c \ - silk/stereo_quant_pred.c - -- - SILK_SOURCES_FIXED = \ - silk/fixed/LTP_analysis_filter_FIX.c \ - silk/fixed/LTP_scale_ctrl_FIX.c \ -diff -urNp opus-1.0.3/src/opus_multistream.c opus-1.0.3-dec/src/opus_multistream.c ---- opus-1.0.3/src/opus_multistream.c 2017-03-02 05:51:10.000000000 +0300 -+++ opus-1.0.3-dec/src/opus_multistream.c 2017-03-03 08:10:00.000000000 +0300 -@@ -50,6 +50,7 @@ typedef struct { - unsigned char mapping[8]; - } VorbisLayout; - -+#ifdef OPUS_ENABLE_ENCODER - /* Index is nb_channel-1*/ - static const VorbisLayout vorbis_mappings[8] = { - {1, 0, {0}}, /* 1: mono */ -@@ -69,6 +70,7 @@ struct OpusMSEncoder { - int lfe_stream; - /* Encoder states go here */ - }; -+#endif /* OPUS_ENABLE_ENCODER */ - - struct OpusMSDecoder { - ChannelLayout layout; -@@ -133,6 +135,7 @@ static int get_mono_channel(const Channe - return -1; - } - -+#ifdef OPUS_ENABLE_ENCODER - static int validate_encoder_layout(const ChannelLayout *layout) - { - int s; -@@ -832,6 +835,7 @@ void opus_multistream_encoder_destroy(Op - { - opus_free(st); - } -+#endif /* OPUS_ENABLE_ENCODER */ - - - /* DECODER */ -diff -urNp opus-1.0.3-dec/configure.ac~ opus-1.0.3-dec/configure.ac ---- opus-1.0.3-dec/configure.ac~ 2013-07-11 07:20:57.000000000 +0300 -+++ opus-1.0.3-dec/configure.ac 2017-03-03 08:11:00.000000000 +0300 -@@ -180,6 +180,13 @@ if test "$HAVE_DOXYGEN" != "yes" -o "$ac - fi - AM_CONDITIONAL(HAVE_DOXYGEN, [test $HAVE_DOXYGEN = yes]) - -+ac_enable_encoder="no"; -+AC_ARG_ENABLE(encoder, [ --enable-encoder compile with encoder support], -+[if test "$enableval" = yes; then -+ ac_enable_encoder="yes"; -+ AC_DEFINE([OPUS_ENABLE_ENCODER], [1], [Compile with encoder support]) -+fi]) -+ - saved_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -fvisibility=hidden" - AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) -@@ -241,6 +248,7 @@ AC_SUBST(SIZE32) - - AM_CONDITIONAL([FIXED_POINT], [test x$ac_enable_fixed = xyes]) - AM_CONDITIONAL([CUSTOM_MODES], [test x$ac_enable_custom_modes = xyes]) -+AM_CONDITIONAL([USE_ENCODER], [test x$ac_enable_encoder = xyes]) - - dnl subsitutions for the pkg-config files - if test x$ac_enable_float = xyes; then -@@ -280,6 +288,7 @@ AC_MSG_RESULT([ - Floating point support: ........ ${ac_enable_float} - Fast float approximations: ..... ${float_approx} - Fixed point debugging: ......... ${ac_enable_fixed_debug} -+ Encoder support: ............... ${ac_enable_encoder} - Custom modes: .................. ${ac_enable_custom_modes} - Assertion checking: ............ ${ac_enable_assertions} - Fuzzing: ....................... ${ac_enable_fuzzing} -diff -urNp opus-1.0.3-dec/Makefile.unix~ opus-1.0.3-dec/Makefile.unix ---- opus-1.0.3-dec/Makefile.unix~ 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/Makefile.unix 2017-03-03 08:11:00.000000000 +0300 -@@ -3,6 +3,9 @@ - # Uncomment this for fixed-point build - #FIXED_POINT=1 - -+# Uncomment this to include the opus encoder -+#USE_ENCODER=1 -+ - # It is strongly recommended to uncomment one of these - # VAR_ARRAYS: Use C99 variable-length arrays for stack allocation - # USE_ALLOCA: Use alloca() for stack allocation -@@ -26,11 +29,17 @@ include silk_sources.mk - include celt_sources.mk - include opus_sources.mk - -+ifdef USE_ENCODER -+CFLAGS := -DOPUS_ENABLE_ENCODER $(CFLAGS) -+CELT_SOURCES += $(CELT_SOURCES_ENC) -+SILK_SOURCES += $(SILK_SOURCES_ENC) -+OPUS_SOURCES += $(OPUS_SOURCES_ENC) - ifdef FIXED_POINT - SILK_SOURCES += $(SILK_SOURCES_FIXED) - else - SILK_SOURCES += $(SILK_SOURCES_FLOAT) - endif -+endif - - EXESUFFIX = - LIBPREFIX = lib -diff -urNp opus-1.0.3-dec/Makefile.am~ opus-1.0.3-dec/Makefile.am ---- opus-1.0.3-dec/Makefile.am~ 2013-07-11 07:16:52.000000000 +0300 -+++ opus-1.0.3-dec/Makefile.am 2017-03-03 08:11:00.000000000 +0300 -@@ -10,11 +10,16 @@ include celt_sources.mk - include silk_sources.mk - include opus_sources.mk - -+if USE_ENCODER -+CELT_SOURCES += $(CELT_SOURCES_ENC) -+SILK_SOURCES += $(SILK_SOURCES_ENC) -+OPUS_SOURCES += $(OPUS_SOURCES_ENC) - if FIXED_POINT - SILK_SOURCES += $(SILK_SOURCES_FIXED) - else - SILK_SOURCES += $(SILK_SOURCES_FLOAT) - endif -+endif - - include celt_headers.mk - include silk_headers.mk -@@ -27,6 +32,8 @@ pkginclude_HEADERS = include/opus.h incl - - noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD) - -+# many demo/test programs rely on encoder, ifdef is a lazy way around -+if USE_ENCODER - noinst_PROGRAMS = opus_demo repacketizer_demo opus_compare tests/test_opus_api tests/test_opus_encode tests/test_opus_decode celt/tests/test_unit_cwrs32 celt/tests/test_unit_dft celt/tests/test_unit_entropy celt/tests/test_unit_laplace celt/tests/test_unit_mathops celt/tests/test_unit_mdct celt/tests/test_unit_rotation celt/tests/test_unit_types - - TESTS = celt/tests/test_unit_types celt/tests/test_unit_mathops celt/tests/test_unit_entropy celt/tests/test_unit_laplace celt/tests/test_unit_dft celt/tests/test_unit_mdct celt/tests/test_unit_rotation celt/tests/test_unit_cwrs32 tests/test_opus_api tests/test_opus_decode tests/test_opus_encode -@@ -81,6 +88,7 @@ noinst_PROGRAMS += opus_custom_demo - opus_custom_demo_SOURCES = celt/opus_custom_demo.c - opus_custom_demo_LDADD = libopus.la -lm - endif -+endif - - EXTRA_DIST = version.mk \ - opus.pc.in \ diff --git a/external/opus-1.0.3/050-opus-1.0.3-misc-port0.patch b/external/opus-1.0.3/050-opus-1.0.3-misc-port0.patch deleted file mode 100644 index b4c57945..00000000 --- a/external/opus-1.0.3/050-opus-1.0.3-misc-port0.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff -u a/include/opus_defines.h b/include/opus_defines.h ---- a/include/opus_defines.h -+++ b/include/opus_defines.h -@@ -64,7 +64,7 @@ extern "C" { - /**Export control for opus functions */ - - #ifndef OPUS_EXPORT --# if defined(WIN32) -+# if defined(_WIN32) - # if defined(OPUS_BUILD) && defined(DLL_EXPORT) - # define OPUS_EXPORT __declspec(dllexport) - # else -diff -u a/silk/debug.c b/silk/debug.c ---- a/silk/debug.c -+++ b/silk/debug.c -@@ -65,7 +65,7 @@ - int silk_Timer_nTimers = 0; - int silk_Timer_depth_ctr = 0; - char silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN]; --#ifdef WIN32 -+#ifdef _WIN32 - LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; - #else - unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; -@@ -76,7 +76,7 @@ - opus_int64 silk_Timer_max[silk_NUM_TIMERS_MAX]; - opus_int64 silk_Timer_depth[silk_NUM_TIMERS_MAX]; - --#ifdef WIN32 -+#ifdef _WIN32 - void silk_TimerSave(char *file_name) - { - if( silk_Timer_nTimers > 0 ) diff --git a/external/opus-1.0.3/051-opus-1.0.3-misc-port1.patch b/external/opus-1.0.3/051-opus-1.0.3-misc-port1.patch deleted file mode 100644 index d2135520..00000000 --- a/external/opus-1.0.3/051-opus-1.0.3-misc-port1.patch +++ /dev/null @@ -1,22 +0,0 @@ -use xmm intrinsics for lrintf with x86_64-w64-mingw32 - -c.f.: http://git.xiph.org/?p=opus.git;a=commit;h=cd159fd1ec8ae64e6cd1b69854034560b5f1c419 - ---- opus-1.0.3/celt/float_cast.h~ -+++ opus-1.0.3/celt/float_cast.h -@@ -61,7 +61,14 @@ - ** the config.h file. - */ - --#if (HAVE_LRINTF) -+#if (defined(__GNUC__) && defined(_WIN64)) -+ #include -+ static __inline long int float2int(float value) -+ { -+ return _mm_cvtss_si32(_mm_load_ss(&value)); -+ } -+ -+#elif (HAVE_LRINTF) - - /* These defines enable functionality introduced with the 1999 ISO C - ** standard. They must be defined before the inclusion of math.h to diff --git a/external/opus-1.0.3/INSTALL b/external/opus-1.0.3/INSTALL deleted file mode 100644 index 40d51f0b..00000000 --- a/external/opus-1.0.3/INSTALL +++ /dev/null @@ -1 +0,0 @@ -See README file for details diff --git a/external/opus-1.0.3/Makefile.am b/external/opus-1.0.3/Makefile.am deleted file mode 100644 index f738431e..00000000 --- a/external/opus-1.0.3/Makefile.am +++ /dev/null @@ -1,193 +0,0 @@ -AUTOMAKE_OPTIONS = subdir-objects - -lib_LTLIBRARIES = libopus.la - -DIST_SUBDIRS = doc - -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/celt -I$(top_srcdir)/silk -I$(top_srcdir)/silk/float -I$(top_srcdir)/silk/fixed - -include celt_sources.mk -include silk_sources.mk -include opus_sources.mk - -if USE_ENCODER -CELT_SOURCES += $(CELT_SOURCES_ENC) -SILK_SOURCES += $(SILK_SOURCES_ENC) -OPUS_SOURCES += $(OPUS_SOURCES_ENC) -if FIXED_POINT -SILK_SOURCES += $(SILK_SOURCES_FIXED) -else -SILK_SOURCES += $(SILK_SOURCES_FLOAT) -endif -endif - -include celt_headers.mk -include silk_headers.mk -include opus_headers.mk - -libopus_la_SOURCES = $(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES) -libopus_la_LDFLAGS = -no-undefined -version-info @OPUS_LT_CURRENT@:@OPUS_LT_REVISION@:@OPUS_LT_AGE@ - -pkginclude_HEADERS = include/opus.h include/opus_multistream.h include/opus_types.h include/opus_defines.h - -noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD) - -# many demo/test programs rely on encoder, ifdef is a lazy way around -if USE_ENCODER -noinst_PROGRAMS = opus_demo repacketizer_demo opus_compare tests/test_opus_api tests/test_opus_encode tests/test_opus_decode celt/tests/test_unit_cwrs32 celt/tests/test_unit_dft celt/tests/test_unit_entropy celt/tests/test_unit_laplace celt/tests/test_unit_mathops celt/tests/test_unit_mdct celt/tests/test_unit_rotation celt/tests/test_unit_types - -TESTS = celt/tests/test_unit_types celt/tests/test_unit_mathops celt/tests/test_unit_entropy celt/tests/test_unit_laplace celt/tests/test_unit_dft celt/tests/test_unit_mdct celt/tests/test_unit_rotation celt/tests/test_unit_cwrs32 tests/test_opus_api tests/test_opus_decode tests/test_opus_encode - -opus_demo_SOURCES = src/opus_demo.c - -opus_demo_LDADD = libopus.la -lm - -repacketizer_demo_SOURCES = src/repacketizer_demo.c - -repacketizer_demo_LDADD = libopus.la -lm - -opus_compare_SOURCES = src/opus_compare.c -opus_compare_LDADD = -lm - -tests_test_opus_api_SOURCES = tests/test_opus_api.c tests/test_opus_common.h -tests_test_opus_api_LDADD = libopus.la -lm - -tests_test_opus_encode_SOURCES = tests/test_opus_encode.c tests/test_opus_common.h -tests_test_opus_encode_LDADD = libopus.la -lm - -tests_test_opus_decode_SOURCES = tests/test_opus_decode.c tests/test_opus_common.h -tests_test_opus_decode_LDADD = libopus.la -lm - -celt_tests_test_unit_cwrs32_SOURCES = celt/tests/test_unit_cwrs32.c -celt_tests_test_unit_cwrs32_LDADD = -lm - -celt_tests_test_unit_dft_SOURCES = celt/tests/test_unit_dft.c -celt_tests_test_unit_dft_LDADD = -lm - -celt_tests_test_unit_entropy_SOURCES = celt/tests/test_unit_entropy.c -celt_tests_test_unit_entropy_LDADD = -lm - -celt_tests_test_unit_laplace_SOURCES = celt/tests/test_unit_laplace.c -celt_tests_test_unit_laplace_LDADD = -lm - -celt_tests_test_unit_mathops_SOURCES = celt/tests/test_unit_mathops.c -celt_tests_test_unit_mathops_LDADD = -lm - -celt_tests_test_unit_mdct_SOURCES = celt/tests/test_unit_mdct.c -celt_tests_test_unit_mdct_LDADD = -lm - -celt_tests_test_unit_rotation_SOURCES = celt/tests/test_unit_rotation.c -celt_tests_test_unit_rotation_LDADD = -lm - -celt_tests_test_unit_types_SOURCES = celt/tests/test_unit_types.c -celt_tests_test_unit_types_LDADD = -lm - -if CUSTOM_MODES -pkginclude_HEADERS += include/opus_custom.h -noinst_PROGRAMS += opus_custom_demo -opus_custom_demo_SOURCES = celt/opus_custom_demo.c -opus_custom_demo_LDADD = libopus.la -lm -endif -endif - -EXTRA_DIST = version.mk \ - opus.pc.in \ - opus-uninstalled.pc.in \ - opus.m4 \ - Makefile.unix \ - tests/run_vectors.sh \ - opus.sln \ - celt/celt.vcxproj \ - celt/celt.vcxproj.filters \ - src/opus_demo.vcxproj \ - src/opus.vcxproj \ - src/opus.vcxproj.filters \ - src/opus_demo.vcxproj.filters \ - tests/test_opus_decode.vcxproj.filters \ - tests/test_opus_decode.vcxproj \ - tests/test_opus_encode.vcxproj.filters \ - tests/test_opus_encode.vcxproj \ - tests/test_opus_api.vcxproj.filters \ - tests/test_opus_api.vcxproj \ - silk/float/silk_float.vcxproj.filters \ - silk/float/silk_float.vcxproj \ - silk/fixed/silk_fixed.vcxproj.filters \ - silk/fixed/silk_fixed.vcxproj \ - silk/silk_common.vcxproj \ - silk/silk_common.vcxproj.filters \ - win32/genversion.bat \ - win32/config.h - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = opus.pc - -m4datadir = $(datadir)/aclocal -m4data_DATA = opus.m4 - -# Targets to build and install just the library without the docs -opus check-opus install-opus: export NO_DOXYGEN = 1 - -opus: all -check-opus: check -install-opus: install - - -# Or just the docs -docs: - ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) - -install-docs: - ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) - - -# Or everything (by default) -all-local: - @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) - -install-data-local: - @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) - -clean-local: - -( cd doc && $(MAKE) $(AM_MAKEFLAGS) clean ) - -uninstall-local: - ( cd doc && $(MAKE) $(AM_MAKEFLAGS) uninstall ) - - -# We check this every time make is run, with configure.ac being touched to -# trigger an update of the build system files if update_version changes the -# current PACKAGE_VERSION (or if package_version was modified manually by a -# user with either AUTO_UPDATE=no or no update_version script present - the -# latter being the normal case for tarball releases). -# -# We can't just add the package_version file to CONFIGURE_DEPENDENCIES since -# simply running autoconf will not actually regenerate configure for us when -# the content of that file changes (due to autoconf dependency checking not -# knowing about that without us creating yet another file for it to include). -# -# The MAKECMDGOALS check is a gnu-make'ism, but will degrade 'gracefully' for -# makes that don't support it. The only loss of functionality is not forcing -# an update of package_version for `make dist` if AUTO_UPDATE=no, but that is -# unlikely to be a real problem for any real user. -$(top_srcdir)/configure.ac: force - @case "$(MAKECMDGOALS)" in \ - dist-hook) exit 0 ;; \ - dist-* | dist | distcheck | distclean) _arg=release ;; \ - esac; \ - if ! $(top_srcdir)/update_version $$_arg 2> /dev/null; then \ - if [ ! -e $(top_srcdir)/package_version ]; then \ - echo 'PACKAGE_VERSION="unknown"' > $(top_srcdir)/package_version; \ - fi; \ - . $(top_srcdir)/package_version || exit 1; \ - [ "$(PACKAGE_VERSION)" != "$$PACKAGE_VERSION" ] || exit 0; \ - fi; \ - touch $@ - -force: - -# Create a minimal package_version file when make dist is run. -dist-hook: - echo 'PACKAGE_VERSION="$(PACKAGE_VERSION)"' > $(top_distdir)/package_version - - -.PHONY: opus check-opus install-opus docs install-docs diff --git a/external/opus-1.0.3/Makefile.darwin b/external/opus-1.0.3/Makefile.darwin deleted file mode 100644 index a6d21e82..00000000 --- a/external/opus-1.0.3/Makefile.darwin +++ /dev/null @@ -1,70 +0,0 @@ -#FIXED_POINT=1 -#USE_ENCODER=1 - -CROSS= -CC = $(CROSS)gcc - -CFLAGS = -O2 -std=gnu99 -fno-common -fvisibility=hidden -CFLAGS += -mmacosx-version-min=10.6 -CFLAGS += -Wall -W -Wstrict-prototypes -Wextra -Wcast-align -Wnested-externs -Wshadow -INCLUDES = -Iinclude -Isilk -Icelt -CPPFLAGS = -DOPUS_BUILD=1 -CPPFLAGS+= -Drestrict=__restrict -CPPFLAGS+= -DHAVE_LRINT=1 -DHAVE_LRINTF=1 -DHAVE_ALLOCA_H=1 -DHAVE_STDINT_H=1 -#CPPFLAGS += -DCUSTOM_MODES=1 -CPPFLAGS += -DVAR_ARRAYS=1 -#CPPFLAGS += -DUSE_ALLOCA=1 - -LDFLAGS = -mmacosx-version-min=10.6 -Wl,-single_module -LDFLAGS+= -Wl,-install_name,@rpath/Opus.framework/Versions/A/Opus -LDFLAGS+= -Wl,-compatibility_version,5.0 -Wl,-current_version,5.0 -#LDLIBS = -Wl,-lbundle1.o - --include package_version - -include silk_sources.mk -include celt_sources.mk -include opus_sources.mk - -ifdef USE_ENCODER -CPPFLAGS+= -DOPUS_ENABLE_ENCODER -CELT_SOURCES += $(CELT_SOURCES_ENC) -SILK_SOURCES += $(SILK_SOURCES_ENC) -OPUS_SOURCES += $(OPUS_SOURCES_ENC) -ifdef FIXED_POINT -SILK_SOURCES += $(SILK_SOURCES_FIXED) -#CPPFLAGS+= -DFIXED_DEBUG=1 -else -SILK_SOURCES += $(SILK_SOURCES_FLOAT) -#CPPFLAGS+= -DFLOAT_APPROX=1 -endif -endif - -ifdef FIXED_POINT -CPPFLAGS+= -DFIXED_POINT=1 -DDISABLE_FLOAT_API -INCLUDES+= -Isilk/fixed -else -INCLUDES+= -Isilk/float -endif - -%.o:%.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -o $@ $< - -TARGET = libopus.dylib - -SRCS = $(SILK_SOURCES) $(CELT_SOURCES) $(OPUS_SOURCES) -OBJS := $(patsubst %.c,%.o,$(SRCS)) - -# Rules -all: $(TARGET) - -$(TARGET): $(OBJS) - $(CC) -dynamiclib -o $(TARGET) $(OBJS) $(LDFLAGS) $(LDLIBS) - -celt/celt.o: CFLAGS += -DPACKAGE_VERSION='$(PACKAGE_VERSION)' -celt/celt.o: package_version - -clean: - rm -f $(TARGET) $(OBJS) - -.PHONY: all clean diff --git a/external/opus-1.0.3/Makefile.in b/external/opus-1.0.3/Makefile.in deleted file mode 100644 index 36f22571..00000000 --- a/external/opus-1.0.3/Makefile.in +++ /dev/null @@ -1,2648 +0,0 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - - - -VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -DIST_COMMON = README $(am__configure_deps) \ - $(am__pkginclude_HEADERS_DIST) $(noinst_HEADERS) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/celt_headers.mk $(srcdir)/celt_sources.mk \ - $(srcdir)/config.h.in $(srcdir)/opus-uninstalled.pc.in \ - $(srcdir)/opus.pc.in $(srcdir)/opus_headers.mk \ - $(srcdir)/opus_sources.mk $(srcdir)/silk_headers.mk \ - $(srcdir)/silk_sources.mk $(top_srcdir)/configure AUTHORS \ - COPYING ChangeLog INSTALL NEWS compile config.guess config.sub \ - depcomp install-sh ltmain.sh missing -@USE_ENCODER_TRUE@am__append_1 = $(CELT_SOURCES_ENC) -@USE_ENCODER_TRUE@am__append_2 = $(SILK_SOURCES_ENC) -@USE_ENCODER_TRUE@am__append_3 = $(OPUS_SOURCES_ENC) -@FIXED_POINT_TRUE@@USE_ENCODER_TRUE@am__append_4 = $(SILK_SOURCES_FIXED) -@FIXED_POINT_FALSE@@USE_ENCODER_TRUE@am__append_5 = $(SILK_SOURCES_FLOAT) -@USE_ENCODER_TRUE@noinst_PROGRAMS = opus_demo$(EXEEXT) \ -@USE_ENCODER_TRUE@ repacketizer_demo$(EXEEXT) \ -@USE_ENCODER_TRUE@ opus_compare$(EXEEXT) \ -@USE_ENCODER_TRUE@ tests/test_opus_api$(EXEEXT) \ -@USE_ENCODER_TRUE@ tests/test_opus_encode$(EXEEXT) \ -@USE_ENCODER_TRUE@ tests/test_opus_decode$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_cwrs32$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_dft$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_entropy$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_laplace$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_mathops$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_mdct$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_rotation$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_types$(EXEEXT) \ -@USE_ENCODER_TRUE@ $(am__EXEEXT_1) -@USE_ENCODER_TRUE@TESTS = celt/tests/test_unit_types$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_mathops$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_entropy$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_laplace$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_dft$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_mdct$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_rotation$(EXEEXT) \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_cwrs32$(EXEEXT) \ -@USE_ENCODER_TRUE@ tests/test_opus_api$(EXEEXT) \ -@USE_ENCODER_TRUE@ tests/test_opus_decode$(EXEEXT) \ -@USE_ENCODER_TRUE@ tests/test_opus_encode$(EXEEXT) -@CUSTOM_MODES_TRUE@@USE_ENCODER_TRUE@am__append_6 = include/opus_custom.h -@CUSTOM_MODES_TRUE@@USE_ENCODER_TRUE@am__append_7 = opus_custom_demo -subdir = . -SUBDIRS = -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ - $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ - $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = opus.pc opus-uninstalled.pc -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(m4datadir)" \ - "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)" -LTLIBRARIES = $(lib_LTLIBRARIES) -libopus_la_LIBADD = -am__libopus_la_SOURCES_DIST = celt/bands.c celt/celt.c celt/cwrs.c \ - celt/entcode.c celt/entdec.c celt/kiss_fft.c celt/laplace.c \ - celt/mathops.c celt/mdct.c celt/modes.c celt/pitch.c \ - celt/celt_lpc.c celt/quant_bands.c celt/rate.c celt/vq.c \ - celt/entenc.c silk/CNG.c silk/code_signs.c silk/init_decoder.c \ - silk/decode_core.c silk/decode_frame.c \ - silk/decode_parameters.c silk/decode_indices.c \ - silk/decode_pulses.c silk/decoder_set_fs.c silk/dec_API.c \ - silk/gain_quant.c silk/NLSF_decode.c silk/PLC.c \ - silk/shell_coder.c silk/tables_gain.c silk/tables_LTP.c \ - silk/tables_NLSF_CB_NB_MB.c silk/tables_NLSF_CB_WB.c \ - silk/tables_other.c silk/tables_pitch_lag.c \ - silk/tables_pulses_per_block.c silk/NLSF_unpack.c \ - silk/stereo_MS_to_LR.c silk/bwexpander_32.c silk/bwexpander.c \ - silk/debug.c silk/decode_pitch.c silk/inner_prod_aligned.c \ - silk/lin2log.c silk/log2lin.c silk/LPC_analysis_filter.c \ - silk/LPC_inv_pred_gain.c silk/table_LSF_cos.c silk/NLSF2A.c \ - silk/NLSF_stabilize.c silk/NLSF_VQ_weights_laroia.c \ - silk/pitch_est_tables.c silk/resampler.c \ - silk/resampler_private_AR2.c silk/resampler_private_down_FIR.c \ - silk/resampler_private_IIR_FIR.c \ - silk/resampler_private_up2_HQ.c silk/resampler_rom.c \ - silk/sort.c silk/sum_sqr_shift.c silk/stereo_decode_pred.c \ - silk/enc_API.c silk/encode_indices.c silk/encode_pulses.c \ - silk/interpolate.c silk/LP_variable_cutoff.c silk/NSQ.c \ - silk/NSQ_del_dec.c silk/VAD.c silk/control_audio_bandwidth.c \ - silk/quant_LTP_gains.c silk/VQ_WMat_EC.c \ - silk/HP_variable_cutoff.c silk/NLSF_encode.c silk/NLSF_VQ.c \ - silk/NLSF_del_dec_quant.c silk/process_NLSFs.c \ - silk/stereo_LR_to_MS.c silk/check_control_input.c \ - silk/control_SNR.c silk/init_encoder.c silk/control_codec.c \ - silk/A2NLSF.c silk/ana_filt_bank_1.c silk/biquad_alt.c \ - silk/resampler_down2_3.c silk/resampler_down2.c \ - silk/sigm_Q15.c silk/stereo_encode_pred.c \ - silk/stereo_find_predictor.c silk/stereo_quant_pred.c \ - silk/fixed/LTP_analysis_filter_FIX.c \ - silk/fixed/LTP_scale_ctrl_FIX.c silk/fixed/corrMatrix_FIX.c \ - silk/fixed/encode_frame_FIX.c silk/fixed/find_LPC_FIX.c \ - silk/fixed/find_LTP_FIX.c silk/fixed/find_pitch_lags_FIX.c \ - silk/fixed/find_pred_coefs_FIX.c \ - silk/fixed/noise_shape_analysis_FIX.c \ - silk/fixed/prefilter_FIX.c silk/fixed/process_gains_FIX.c \ - silk/fixed/regularize_correlations_FIX.c \ - silk/fixed/residual_energy16_FIX.c \ - silk/fixed/residual_energy_FIX.c silk/fixed/solve_LS_FIX.c \ - silk/fixed/warped_autocorrelation_FIX.c \ - silk/fixed/apply_sine_window_FIX.c silk/fixed/autocorr_FIX.c \ - silk/fixed/burg_modified_FIX.c silk/fixed/k2a_FIX.c \ - silk/fixed/k2a_Q16_FIX.c silk/fixed/pitch_analysis_core_FIX.c \ - silk/fixed/vector_ops_FIX.c silk/fixed/schur64_FIX.c \ - silk/fixed/schur_FIX.c silk/float/apply_sine_window_FLP.c \ - silk/float/corrMatrix_FLP.c silk/float/encode_frame_FLP.c \ - silk/float/find_LPC_FLP.c silk/float/find_LTP_FLP.c \ - silk/float/find_pitch_lags_FLP.c \ - silk/float/find_pred_coefs_FLP.c \ - silk/float/LPC_analysis_filter_FLP.c \ - silk/float/LTP_analysis_filter_FLP.c \ - silk/float/LTP_scale_ctrl_FLP.c \ - silk/float/noise_shape_analysis_FLP.c \ - silk/float/prefilter_FLP.c silk/float/process_gains_FLP.c \ - silk/float/regularize_correlations_FLP.c \ - silk/float/residual_energy_FLP.c silk/float/solve_LS_FLP.c \ - silk/float/warped_autocorrelation_FLP.c \ - silk/float/wrappers_FLP.c silk/float/autocorrelation_FLP.c \ - silk/float/burg_modified_FLP.c silk/float/bwexpander_FLP.c \ - silk/float/energy_FLP.c silk/float/inner_product_FLP.c \ - silk/float/k2a_FLP.c silk/float/levinsondurbin_FLP.c \ - silk/float/LPC_inv_pred_gain_FLP.c \ - silk/float/pitch_analysis_core_FLP.c \ - silk/float/scale_copy_vector_FLP.c \ - silk/float/scale_vector_FLP.c silk/float/schur_FLP.c \ - silk/float/sort_FLP.c src/opus_decoder.c \ - src/opus_multistream.c src/opus.c src/opus_encoder.c \ - src/repacketizer.c -am__dirstamp = $(am__leading_dot)dirstamp -am__objects_1 = celt/entenc.lo -@USE_ENCODER_TRUE@am__objects_2 = $(am__objects_1) -am__objects_3 = celt/bands.lo celt/celt.lo celt/cwrs.lo \ - celt/entcode.lo celt/entdec.lo celt/kiss_fft.lo \ - celt/laplace.lo celt/mathops.lo celt/mdct.lo celt/modes.lo \ - celt/pitch.lo celt/celt_lpc.lo celt/quant_bands.lo \ - celt/rate.lo celt/vq.lo $(am__objects_2) -am__objects_4 = silk/enc_API.lo silk/encode_indices.lo \ - silk/encode_pulses.lo silk/interpolate.lo \ - silk/LP_variable_cutoff.lo silk/NSQ.lo silk/NSQ_del_dec.lo \ - silk/VAD.lo silk/control_audio_bandwidth.lo \ - silk/quant_LTP_gains.lo silk/VQ_WMat_EC.lo \ - silk/HP_variable_cutoff.lo silk/NLSF_encode.lo silk/NLSF_VQ.lo \ - silk/NLSF_del_dec_quant.lo silk/process_NLSFs.lo \ - silk/stereo_LR_to_MS.lo silk/check_control_input.lo \ - silk/control_SNR.lo silk/init_encoder.lo silk/control_codec.lo \ - silk/A2NLSF.lo silk/ana_filt_bank_1.lo silk/biquad_alt.lo \ - silk/resampler_down2_3.lo silk/resampler_down2.lo \ - silk/sigm_Q15.lo silk/stereo_encode_pred.lo \ - silk/stereo_find_predictor.lo silk/stereo_quant_pred.lo -@USE_ENCODER_TRUE@am__objects_5 = $(am__objects_4) -am__objects_6 = silk/fixed/LTP_analysis_filter_FIX.lo \ - silk/fixed/LTP_scale_ctrl_FIX.lo silk/fixed/corrMatrix_FIX.lo \ - silk/fixed/encode_frame_FIX.lo silk/fixed/find_LPC_FIX.lo \ - silk/fixed/find_LTP_FIX.lo silk/fixed/find_pitch_lags_FIX.lo \ - silk/fixed/find_pred_coefs_FIX.lo \ - silk/fixed/noise_shape_analysis_FIX.lo \ - silk/fixed/prefilter_FIX.lo silk/fixed/process_gains_FIX.lo \ - silk/fixed/regularize_correlations_FIX.lo \ - silk/fixed/residual_energy16_FIX.lo \ - silk/fixed/residual_energy_FIX.lo silk/fixed/solve_LS_FIX.lo \ - silk/fixed/warped_autocorrelation_FIX.lo \ - silk/fixed/apply_sine_window_FIX.lo silk/fixed/autocorr_FIX.lo \ - silk/fixed/burg_modified_FIX.lo silk/fixed/k2a_FIX.lo \ - silk/fixed/k2a_Q16_FIX.lo \ - silk/fixed/pitch_analysis_core_FIX.lo \ - silk/fixed/vector_ops_FIX.lo silk/fixed/schur64_FIX.lo \ - silk/fixed/schur_FIX.lo -@FIXED_POINT_TRUE@@USE_ENCODER_TRUE@am__objects_7 = $(am__objects_6) -am__objects_8 = silk/float/apply_sine_window_FLP.lo \ - silk/float/corrMatrix_FLP.lo silk/float/encode_frame_FLP.lo \ - silk/float/find_LPC_FLP.lo silk/float/find_LTP_FLP.lo \ - silk/float/find_pitch_lags_FLP.lo \ - silk/float/find_pred_coefs_FLP.lo \ - silk/float/LPC_analysis_filter_FLP.lo \ - silk/float/LTP_analysis_filter_FLP.lo \ - silk/float/LTP_scale_ctrl_FLP.lo \ - silk/float/noise_shape_analysis_FLP.lo \ - silk/float/prefilter_FLP.lo silk/float/process_gains_FLP.lo \ - silk/float/regularize_correlations_FLP.lo \ - silk/float/residual_energy_FLP.lo silk/float/solve_LS_FLP.lo \ - silk/float/warped_autocorrelation_FLP.lo \ - silk/float/wrappers_FLP.lo silk/float/autocorrelation_FLP.lo \ - silk/float/burg_modified_FLP.lo silk/float/bwexpander_FLP.lo \ - silk/float/energy_FLP.lo silk/float/inner_product_FLP.lo \ - silk/float/k2a_FLP.lo silk/float/levinsondurbin_FLP.lo \ - silk/float/LPC_inv_pred_gain_FLP.lo \ - silk/float/pitch_analysis_core_FLP.lo \ - silk/float/scale_copy_vector_FLP.lo \ - silk/float/scale_vector_FLP.lo silk/float/schur_FLP.lo \ - silk/float/sort_FLP.lo -@FIXED_POINT_FALSE@@USE_ENCODER_TRUE@am__objects_9 = $(am__objects_8) -am__objects_10 = silk/CNG.lo silk/code_signs.lo silk/init_decoder.lo \ - silk/decode_core.lo silk/decode_frame.lo \ - silk/decode_parameters.lo silk/decode_indices.lo \ - silk/decode_pulses.lo silk/decoder_set_fs.lo silk/dec_API.lo \ - silk/gain_quant.lo silk/NLSF_decode.lo silk/PLC.lo \ - silk/shell_coder.lo silk/tables_gain.lo silk/tables_LTP.lo \ - silk/tables_NLSF_CB_NB_MB.lo silk/tables_NLSF_CB_WB.lo \ - silk/tables_other.lo silk/tables_pitch_lag.lo \ - silk/tables_pulses_per_block.lo silk/NLSF_unpack.lo \ - silk/stereo_MS_to_LR.lo silk/bwexpander_32.lo \ - silk/bwexpander.lo silk/debug.lo silk/decode_pitch.lo \ - silk/inner_prod_aligned.lo silk/lin2log.lo silk/log2lin.lo \ - silk/LPC_analysis_filter.lo silk/LPC_inv_pred_gain.lo \ - silk/table_LSF_cos.lo silk/NLSF2A.lo silk/NLSF_stabilize.lo \ - silk/NLSF_VQ_weights_laroia.lo silk/pitch_est_tables.lo \ - silk/resampler.lo silk/resampler_private_AR2.lo \ - silk/resampler_private_down_FIR.lo \ - silk/resampler_private_IIR_FIR.lo \ - silk/resampler_private_up2_HQ.lo silk/resampler_rom.lo \ - silk/sort.lo silk/sum_sqr_shift.lo silk/stereo_decode_pred.lo \ - $(am__objects_5) $(am__objects_7) $(am__objects_9) -am__objects_11 = src/opus.lo src/opus_encoder.lo src/repacketizer.lo -@USE_ENCODER_TRUE@am__objects_12 = $(am__objects_11) -am__objects_13 = src/opus_decoder.lo src/opus_multistream.lo \ - $(am__objects_12) -am_libopus_la_OBJECTS = $(am__objects_3) $(am__objects_10) \ - $(am__objects_13) -libopus_la_OBJECTS = $(am_libopus_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -libopus_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libopus_la_LDFLAGS) $(LDFLAGS) -o $@ -@CUSTOM_MODES_TRUE@@USE_ENCODER_TRUE@am__EXEEXT_1 = opus_custom_demo$(EXEEXT) -PROGRAMS = $(noinst_PROGRAMS) -am__celt_tests_test_unit_cwrs32_SOURCES_DIST = \ - celt/tests/test_unit_cwrs32.c -@USE_ENCODER_TRUE@am_celt_tests_test_unit_cwrs32_OBJECTS = \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_cwrs32.$(OBJEXT) -celt_tests_test_unit_cwrs32_OBJECTS = \ - $(am_celt_tests_test_unit_cwrs32_OBJECTS) -celt_tests_test_unit_cwrs32_DEPENDENCIES = -am__celt_tests_test_unit_dft_SOURCES_DIST = \ - celt/tests/test_unit_dft.c -@USE_ENCODER_TRUE@am_celt_tests_test_unit_dft_OBJECTS = \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_dft.$(OBJEXT) -celt_tests_test_unit_dft_OBJECTS = \ - $(am_celt_tests_test_unit_dft_OBJECTS) -celt_tests_test_unit_dft_DEPENDENCIES = -am__celt_tests_test_unit_entropy_SOURCES_DIST = \ - celt/tests/test_unit_entropy.c -@USE_ENCODER_TRUE@am_celt_tests_test_unit_entropy_OBJECTS = \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_entropy.$(OBJEXT) -celt_tests_test_unit_entropy_OBJECTS = \ - $(am_celt_tests_test_unit_entropy_OBJECTS) -celt_tests_test_unit_entropy_DEPENDENCIES = -am__celt_tests_test_unit_laplace_SOURCES_DIST = \ - celt/tests/test_unit_laplace.c -@USE_ENCODER_TRUE@am_celt_tests_test_unit_laplace_OBJECTS = \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_laplace.$(OBJEXT) -celt_tests_test_unit_laplace_OBJECTS = \ - $(am_celt_tests_test_unit_laplace_OBJECTS) -celt_tests_test_unit_laplace_DEPENDENCIES = -am__celt_tests_test_unit_mathops_SOURCES_DIST = \ - celt/tests/test_unit_mathops.c -@USE_ENCODER_TRUE@am_celt_tests_test_unit_mathops_OBJECTS = \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_mathops.$(OBJEXT) -celt_tests_test_unit_mathops_OBJECTS = \ - $(am_celt_tests_test_unit_mathops_OBJECTS) -celt_tests_test_unit_mathops_DEPENDENCIES = -am__celt_tests_test_unit_mdct_SOURCES_DIST = \ - celt/tests/test_unit_mdct.c -@USE_ENCODER_TRUE@am_celt_tests_test_unit_mdct_OBJECTS = \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_mdct.$(OBJEXT) -celt_tests_test_unit_mdct_OBJECTS = \ - $(am_celt_tests_test_unit_mdct_OBJECTS) -celt_tests_test_unit_mdct_DEPENDENCIES = -am__celt_tests_test_unit_rotation_SOURCES_DIST = \ - celt/tests/test_unit_rotation.c -@USE_ENCODER_TRUE@am_celt_tests_test_unit_rotation_OBJECTS = \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_rotation.$(OBJEXT) -celt_tests_test_unit_rotation_OBJECTS = \ - $(am_celt_tests_test_unit_rotation_OBJECTS) -celt_tests_test_unit_rotation_DEPENDENCIES = -am__celt_tests_test_unit_types_SOURCES_DIST = \ - celt/tests/test_unit_types.c -@USE_ENCODER_TRUE@am_celt_tests_test_unit_types_OBJECTS = \ -@USE_ENCODER_TRUE@ celt/tests/test_unit_types.$(OBJEXT) -celt_tests_test_unit_types_OBJECTS = \ - $(am_celt_tests_test_unit_types_OBJECTS) -celt_tests_test_unit_types_DEPENDENCIES = -am__opus_compare_SOURCES_DIST = src/opus_compare.c -@USE_ENCODER_TRUE@am_opus_compare_OBJECTS = \ -@USE_ENCODER_TRUE@ src/opus_compare.$(OBJEXT) -opus_compare_OBJECTS = $(am_opus_compare_OBJECTS) -opus_compare_DEPENDENCIES = -am__opus_custom_demo_SOURCES_DIST = celt/opus_custom_demo.c -@CUSTOM_MODES_TRUE@@USE_ENCODER_TRUE@am_opus_custom_demo_OBJECTS = celt/opus_custom_demo.$(OBJEXT) -opus_custom_demo_OBJECTS = $(am_opus_custom_demo_OBJECTS) -@CUSTOM_MODES_TRUE@@USE_ENCODER_TRUE@opus_custom_demo_DEPENDENCIES = \ -@CUSTOM_MODES_TRUE@@USE_ENCODER_TRUE@ libopus.la -am__opus_demo_SOURCES_DIST = src/opus_demo.c -@USE_ENCODER_TRUE@am_opus_demo_OBJECTS = src/opus_demo.$(OBJEXT) -opus_demo_OBJECTS = $(am_opus_demo_OBJECTS) -@USE_ENCODER_TRUE@opus_demo_DEPENDENCIES = libopus.la -am__repacketizer_demo_SOURCES_DIST = src/repacketizer_demo.c -@USE_ENCODER_TRUE@am_repacketizer_demo_OBJECTS = \ -@USE_ENCODER_TRUE@ src/repacketizer_demo.$(OBJEXT) -repacketizer_demo_OBJECTS = $(am_repacketizer_demo_OBJECTS) -@USE_ENCODER_TRUE@repacketizer_demo_DEPENDENCIES = libopus.la -am__tests_test_opus_api_SOURCES_DIST = tests/test_opus_api.c \ - tests/test_opus_common.h -@USE_ENCODER_TRUE@am_tests_test_opus_api_OBJECTS = \ -@USE_ENCODER_TRUE@ tests/test_opus_api.$(OBJEXT) -tests_test_opus_api_OBJECTS = $(am_tests_test_opus_api_OBJECTS) -@USE_ENCODER_TRUE@tests_test_opus_api_DEPENDENCIES = libopus.la -am__tests_test_opus_decode_SOURCES_DIST = tests/test_opus_decode.c \ - tests/test_opus_common.h -@USE_ENCODER_TRUE@am_tests_test_opus_decode_OBJECTS = \ -@USE_ENCODER_TRUE@ tests/test_opus_decode.$(OBJEXT) -tests_test_opus_decode_OBJECTS = $(am_tests_test_opus_decode_OBJECTS) -@USE_ENCODER_TRUE@tests_test_opus_decode_DEPENDENCIES = libopus.la -am__tests_test_opus_encode_SOURCES_DIST = tests/test_opus_encode.c \ - tests/test_opus_common.h -@USE_ENCODER_TRUE@am_tests_test_opus_encode_OBJECTS = \ -@USE_ENCODER_TRUE@ tests/test_opus_encode.$(OBJEXT) -tests_test_opus_encode_OBJECTS = $(am_tests_test_opus_encode_OBJECTS) -@USE_ENCODER_TRUE@tests_test_opus_encode_DEPENDENCIES = libopus.la -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -SOURCES = $(libopus_la_SOURCES) $(celt_tests_test_unit_cwrs32_SOURCES) \ - $(celt_tests_test_unit_dft_SOURCES) \ - $(celt_tests_test_unit_entropy_SOURCES) \ - $(celt_tests_test_unit_laplace_SOURCES) \ - $(celt_tests_test_unit_mathops_SOURCES) \ - $(celt_tests_test_unit_mdct_SOURCES) \ - $(celt_tests_test_unit_rotation_SOURCES) \ - $(celt_tests_test_unit_types_SOURCES) $(opus_compare_SOURCES) \ - $(opus_custom_demo_SOURCES) $(opus_demo_SOURCES) \ - $(repacketizer_demo_SOURCES) $(tests_test_opus_api_SOURCES) \ - $(tests_test_opus_decode_SOURCES) \ - $(tests_test_opus_encode_SOURCES) -DIST_SOURCES = $(am__libopus_la_SOURCES_DIST) \ - $(am__celt_tests_test_unit_cwrs32_SOURCES_DIST) \ - $(am__celt_tests_test_unit_dft_SOURCES_DIST) \ - $(am__celt_tests_test_unit_entropy_SOURCES_DIST) \ - $(am__celt_tests_test_unit_laplace_SOURCES_DIST) \ - $(am__celt_tests_test_unit_mathops_SOURCES_DIST) \ - $(am__celt_tests_test_unit_mdct_SOURCES_DIST) \ - $(am__celt_tests_test_unit_rotation_SOURCES_DIST) \ - $(am__celt_tests_test_unit_types_SOURCES_DIST) \ - $(am__opus_compare_SOURCES_DIST) \ - $(am__opus_custom_demo_SOURCES_DIST) \ - $(am__opus_demo_SOURCES_DIST) \ - $(am__repacketizer_demo_SOURCES_DIST) \ - $(am__tests_test_opus_api_SOURCES_DIST) \ - $(am__tests_test_opus_decode_SOURCES_DIST) \ - $(am__tests_test_opus_encode_SOURCES_DIST) -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -DATA = $(m4data_DATA) $(pkgconfig_DATA) -am__pkginclude_HEADERS_DIST = include/opus.h \ - include/opus_multistream.h include/opus_types.h \ - include/opus_defines.h include/opus_custom.h -HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBM = @LIBM@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OPUS_LT_AGE = @OPUS_LT_AGE@ -OPUS_LT_CURRENT = @OPUS_LT_CURRENT@ -OPUS_LT_REVISION = @OPUS_LT_REVISION@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PC_BUILD = @PC_BUILD@ -PC_LIBM = @PC_LIBM@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SIZE16 = @SIZE16@ -SIZE32 = @SIZE32@ -STRIP = @STRIP@ -SYMBOL_VISIBILITY = @SYMBOL_VISIBILITY@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AUTOMAKE_OPTIONS = subdir-objects -lib_LTLIBRARIES = libopus.la -DIST_SUBDIRS = doc -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/celt -I$(top_srcdir)/silk -I$(top_srcdir)/silk/float -I$(top_srcdir)/silk/fixed -CELT_SOURCES = celt/bands.c celt/celt.c celt/cwrs.c celt/entcode.c \ - celt/entdec.c celt/kiss_fft.c celt/laplace.c celt/mathops.c \ - celt/mdct.c celt/modes.c celt/pitch.c celt/celt_lpc.c \ - celt/quant_bands.c celt/rate.c celt/vq.c $(am__append_1) -CELT_SOURCES_ENC = celt/entenc.c -SILK_SOURCES = silk/CNG.c silk/code_signs.c silk/init_decoder.c \ - silk/decode_core.c silk/decode_frame.c \ - silk/decode_parameters.c silk/decode_indices.c \ - silk/decode_pulses.c silk/decoder_set_fs.c silk/dec_API.c \ - silk/gain_quant.c silk/NLSF_decode.c silk/PLC.c \ - silk/shell_coder.c silk/tables_gain.c silk/tables_LTP.c \ - silk/tables_NLSF_CB_NB_MB.c silk/tables_NLSF_CB_WB.c \ - silk/tables_other.c silk/tables_pitch_lag.c \ - silk/tables_pulses_per_block.c silk/NLSF_unpack.c \ - silk/stereo_MS_to_LR.c silk/bwexpander_32.c silk/bwexpander.c \ - silk/debug.c silk/decode_pitch.c silk/inner_prod_aligned.c \ - silk/lin2log.c silk/log2lin.c silk/LPC_analysis_filter.c \ - silk/LPC_inv_pred_gain.c silk/table_LSF_cos.c silk/NLSF2A.c \ - silk/NLSF_stabilize.c silk/NLSF_VQ_weights_laroia.c \ - silk/pitch_est_tables.c silk/resampler.c \ - silk/resampler_private_AR2.c silk/resampler_private_down_FIR.c \ - silk/resampler_private_IIR_FIR.c \ - silk/resampler_private_up2_HQ.c silk/resampler_rom.c \ - silk/sort.c silk/sum_sqr_shift.c silk/stereo_decode_pred.c \ - $(am__append_2) $(am__append_4) $(am__append_5) -SILK_SOURCES_ENC = \ -silk/enc_API.c \ -silk/encode_indices.c \ -silk/encode_pulses.c \ -silk/interpolate.c \ -silk/LP_variable_cutoff.c \ -silk/NSQ.c \ -silk/NSQ_del_dec.c \ -silk/VAD.c \ -silk/control_audio_bandwidth.c \ -silk/quant_LTP_gains.c \ -silk/VQ_WMat_EC.c \ -silk/HP_variable_cutoff.c \ -silk/NLSF_encode.c \ -silk/NLSF_VQ.c \ -silk/NLSF_del_dec_quant.c \ -silk/process_NLSFs.c \ -silk/stereo_LR_to_MS.c \ -silk/check_control_input.c \ -silk/control_SNR.c \ -silk/init_encoder.c \ -silk/control_codec.c \ -silk/A2NLSF.c \ -silk/ana_filt_bank_1.c \ -silk/biquad_alt.c \ -silk/resampler_down2_3.c \ -silk/resampler_down2.c \ -silk/sigm_Q15.c \ -silk/stereo_encode_pred.c \ -silk/stereo_find_predictor.c \ -silk/stereo_quant_pred.c - -SILK_SOURCES_FIXED = \ -silk/fixed/LTP_analysis_filter_FIX.c \ -silk/fixed/LTP_scale_ctrl_FIX.c \ -silk/fixed/corrMatrix_FIX.c \ -silk/fixed/encode_frame_FIX.c \ -silk/fixed/find_LPC_FIX.c \ -silk/fixed/find_LTP_FIX.c \ -silk/fixed/find_pitch_lags_FIX.c \ -silk/fixed/find_pred_coefs_FIX.c \ -silk/fixed/noise_shape_analysis_FIX.c \ -silk/fixed/prefilter_FIX.c \ -silk/fixed/process_gains_FIX.c \ -silk/fixed/regularize_correlations_FIX.c \ -silk/fixed/residual_energy16_FIX.c \ -silk/fixed/residual_energy_FIX.c \ -silk/fixed/solve_LS_FIX.c \ -silk/fixed/warped_autocorrelation_FIX.c \ -silk/fixed/apply_sine_window_FIX.c \ -silk/fixed/autocorr_FIX.c \ -silk/fixed/burg_modified_FIX.c \ -silk/fixed/k2a_FIX.c \ -silk/fixed/k2a_Q16_FIX.c \ -silk/fixed/pitch_analysis_core_FIX.c \ -silk/fixed/vector_ops_FIX.c \ -silk/fixed/schur64_FIX.c \ -silk/fixed/schur_FIX.c - -SILK_SOURCES_FLOAT = \ -silk/float/apply_sine_window_FLP.c \ -silk/float/corrMatrix_FLP.c \ -silk/float/encode_frame_FLP.c \ -silk/float/find_LPC_FLP.c \ -silk/float/find_LTP_FLP.c \ -silk/float/find_pitch_lags_FLP.c \ -silk/float/find_pred_coefs_FLP.c \ -silk/float/LPC_analysis_filter_FLP.c \ -silk/float/LTP_analysis_filter_FLP.c \ -silk/float/LTP_scale_ctrl_FLP.c \ -silk/float/noise_shape_analysis_FLP.c \ -silk/float/prefilter_FLP.c \ -silk/float/process_gains_FLP.c \ -silk/float/regularize_correlations_FLP.c \ -silk/float/residual_energy_FLP.c \ -silk/float/solve_LS_FLP.c \ -silk/float/warped_autocorrelation_FLP.c \ -silk/float/wrappers_FLP.c \ -silk/float/autocorrelation_FLP.c \ -silk/float/burg_modified_FLP.c \ -silk/float/bwexpander_FLP.c \ -silk/float/energy_FLP.c \ -silk/float/inner_product_FLP.c \ -silk/float/k2a_FLP.c \ -silk/float/levinsondurbin_FLP.c \ -silk/float/LPC_inv_pred_gain_FLP.c \ -silk/float/pitch_analysis_core_FLP.c \ -silk/float/scale_copy_vector_FLP.c \ -silk/float/scale_vector_FLP.c \ -silk/float/schur_FLP.c \ -silk/float/sort_FLP.c - -OPUS_SOURCES = src/opus_decoder.c src/opus_multistream.c \ - $(am__append_3) -OPUS_SOURCES_ENC = src/opus.c \ -src/opus_encoder.c \ -src/repacketizer.c - -CELT_HEAD = \ -celt/arch.h \ -celt/bands.h \ -celt/celt.h \ -include/opus_types.h \ -include/opus_defines.h \ -include/opus_custom.h \ -celt/cwrs.h \ -celt/ecintrin.h \ -celt/entcode.h \ -celt/entdec.h \ -celt/entenc.h \ -celt/fixed_debug.h \ -celt/fixed_generic.h \ -celt/float_cast.h \ -celt/_kiss_fft_guts.h \ -celt/kiss_fft.h \ -celt/laplace.h \ -celt/mathops.h \ -celt/mdct.h \ -celt/mfrngcod.h \ -celt/modes.h \ -celt/os_support.h \ -celt/pitch.h \ -celt/celt_lpc.h \ -celt/quant_bands.h \ -celt/rate.h \ -celt/stack_alloc.h \ -celt/vq.h \ -celt/static_modes_float.h \ -celt/static_modes_fixed.h - -SILK_HEAD = \ -silk/debug.h \ -silk/control.h \ -silk/errors.h \ -silk/API.h \ -silk/typedef.h \ -silk/define.h \ -silk/main.h \ -silk/PLC.h \ -silk/structs.h \ -silk/tables.h \ -silk/tuning_parameters.h \ -silk/Inlines.h \ -silk/MacroCount.h \ -silk/MacroDebug.h \ -silk/macros.h \ -silk/pitch_est_defines.h \ -silk/resampler_private.h \ -silk/resampler_rom.h \ -silk/resampler_structs.h \ -silk/SigProc_FIX.h \ -silk/fixed/main_FIX.h \ -silk/fixed/structs_FIX.h \ -silk/float/main_FLP.h \ -silk/float/structs_FLP.h \ -silk/float/SigProc_FLP.h - -OPUS_HEAD = \ -include/opus.h \ -include/opus_multistream.h \ -src/opus_private.h - -libopus_la_SOURCES = $(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES) -libopus_la_LDFLAGS = -no-undefined -version-info @OPUS_LT_CURRENT@:@OPUS_LT_REVISION@:@OPUS_LT_AGE@ -pkginclude_HEADERS = include/opus.h include/opus_multistream.h \ - include/opus_types.h include/opus_defines.h $(am__append_6) -noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD) -@USE_ENCODER_TRUE@opus_demo_SOURCES = src/opus_demo.c -@USE_ENCODER_TRUE@opus_demo_LDADD = libopus.la -lm -@USE_ENCODER_TRUE@repacketizer_demo_SOURCES = src/repacketizer_demo.c -@USE_ENCODER_TRUE@repacketizer_demo_LDADD = libopus.la -lm -@USE_ENCODER_TRUE@opus_compare_SOURCES = src/opus_compare.c -@USE_ENCODER_TRUE@opus_compare_LDADD = -lm -@USE_ENCODER_TRUE@tests_test_opus_api_SOURCES = tests/test_opus_api.c tests/test_opus_common.h -@USE_ENCODER_TRUE@tests_test_opus_api_LDADD = libopus.la -lm -@USE_ENCODER_TRUE@tests_test_opus_encode_SOURCES = tests/test_opus_encode.c tests/test_opus_common.h -@USE_ENCODER_TRUE@tests_test_opus_encode_LDADD = libopus.la -lm -@USE_ENCODER_TRUE@tests_test_opus_decode_SOURCES = tests/test_opus_decode.c tests/test_opus_common.h -@USE_ENCODER_TRUE@tests_test_opus_decode_LDADD = libopus.la -lm -@USE_ENCODER_TRUE@celt_tests_test_unit_cwrs32_SOURCES = celt/tests/test_unit_cwrs32.c -@USE_ENCODER_TRUE@celt_tests_test_unit_cwrs32_LDADD = -lm -@USE_ENCODER_TRUE@celt_tests_test_unit_dft_SOURCES = celt/tests/test_unit_dft.c -@USE_ENCODER_TRUE@celt_tests_test_unit_dft_LDADD = -lm -@USE_ENCODER_TRUE@celt_tests_test_unit_entropy_SOURCES = celt/tests/test_unit_entropy.c -@USE_ENCODER_TRUE@celt_tests_test_unit_entropy_LDADD = -lm -@USE_ENCODER_TRUE@celt_tests_test_unit_laplace_SOURCES = celt/tests/test_unit_laplace.c -@USE_ENCODER_TRUE@celt_tests_test_unit_laplace_LDADD = -lm -@USE_ENCODER_TRUE@celt_tests_test_unit_mathops_SOURCES = celt/tests/test_unit_mathops.c -@USE_ENCODER_TRUE@celt_tests_test_unit_mathops_LDADD = -lm -@USE_ENCODER_TRUE@celt_tests_test_unit_mdct_SOURCES = celt/tests/test_unit_mdct.c -@USE_ENCODER_TRUE@celt_tests_test_unit_mdct_LDADD = -lm -@USE_ENCODER_TRUE@celt_tests_test_unit_rotation_SOURCES = celt/tests/test_unit_rotation.c -@USE_ENCODER_TRUE@celt_tests_test_unit_rotation_LDADD = -lm -@USE_ENCODER_TRUE@celt_tests_test_unit_types_SOURCES = celt/tests/test_unit_types.c -@USE_ENCODER_TRUE@celt_tests_test_unit_types_LDADD = -lm -@CUSTOM_MODES_TRUE@@USE_ENCODER_TRUE@opus_custom_demo_SOURCES = celt/opus_custom_demo.c -@CUSTOM_MODES_TRUE@@USE_ENCODER_TRUE@opus_custom_demo_LDADD = libopus.la -lm -EXTRA_DIST = version.mk \ - opus.pc.in \ - opus-uninstalled.pc.in \ - opus.m4 \ - Makefile.unix \ - tests/run_vectors.sh \ - opus.sln \ - celt/celt.vcxproj \ - celt/celt.vcxproj.filters \ - src/opus_demo.vcxproj \ - src/opus.vcxproj \ - src/opus.vcxproj.filters \ - src/opus_demo.vcxproj.filters \ - tests/test_opus_decode.vcxproj.filters \ - tests/test_opus_decode.vcxproj \ - tests/test_opus_encode.vcxproj.filters \ - tests/test_opus_encode.vcxproj \ - tests/test_opus_api.vcxproj.filters \ - tests/test_opus_api.vcxproj \ - silk/float/silk_float.vcxproj.filters \ - silk/float/silk_float.vcxproj \ - silk/fixed/silk_fixed.vcxproj.filters \ - silk/fixed/silk_fixed.vcxproj \ - silk/silk_common.vcxproj \ - silk/silk_common.vcxproj.filters \ - win32/genversion.bat \ - win32/config.h - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = opus.pc -m4datadir = $(datadir)/aclocal -m4data_DATA = opus.m4 -all: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -am--refresh: Makefile - @: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/celt_sources.mk $(srcdir)/silk_sources.mk $(srcdir)/opus_sources.mk $(srcdir)/celt_headers.mk $(srcdir)/silk_headers.mk $(srcdir)/opus_headers.mk $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; -$(srcdir)/celt_sources.mk $(srcdir)/silk_sources.mk $(srcdir)/opus_sources.mk $(srcdir)/celt_headers.mk $(srcdir)/silk_headers.mk $(srcdir)/opus_headers.mk: - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -$(am__aclocal_m4_deps): - -config.h: stamp-h1 - @if test ! -f $@; then rm -f stamp-h1; else :; fi - @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi - -stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status config.h -$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f config.h stamp-h1 -opus.pc: $(top_builddir)/config.status $(srcdir)/opus.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $@ -opus-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/opus-uninstalled.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $@ -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -celt/$(am__dirstamp): - @$(MKDIR_P) celt - @: > celt/$(am__dirstamp) -celt/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) celt/$(DEPDIR) - @: > celt/$(DEPDIR)/$(am__dirstamp) -celt/bands.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/celt.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/cwrs.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/entcode.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/entdec.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/kiss_fft.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/laplace.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/mathops.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/mdct.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/modes.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/pitch.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/celt_lpc.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/quant_bands.lo: celt/$(am__dirstamp) \ - celt/$(DEPDIR)/$(am__dirstamp) -celt/rate.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/vq.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -celt/entenc.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) -silk/$(am__dirstamp): - @$(MKDIR_P) silk - @: > silk/$(am__dirstamp) -silk/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) silk/$(DEPDIR) - @: > silk/$(DEPDIR)/$(am__dirstamp) -silk/CNG.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/code_signs.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/init_decoder.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/decode_core.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/decode_frame.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/decode_parameters.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/decode_indices.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/decode_pulses.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/decoder_set_fs.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/dec_API.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/gain_quant.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/NLSF_decode.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/PLC.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/shell_coder.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/tables_gain.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/tables_LTP.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/tables_NLSF_CB_NB_MB.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/tables_NLSF_CB_WB.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/tables_other.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/tables_pitch_lag.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/tables_pulses_per_block.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/NLSF_unpack.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/stereo_MS_to_LR.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/bwexpander_32.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/bwexpander.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/debug.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/decode_pitch.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/inner_prod_aligned.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/lin2log.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/log2lin.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/LPC_analysis_filter.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/LPC_inv_pred_gain.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/table_LSF_cos.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/NLSF2A.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/NLSF_stabilize.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/NLSF_VQ_weights_laroia.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/pitch_est_tables.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/resampler.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/resampler_private_AR2.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/resampler_private_down_FIR.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/resampler_private_IIR_FIR.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/resampler_private_up2_HQ.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/resampler_rom.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/sort.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/sum_sqr_shift.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/stereo_decode_pred.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/enc_API.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/encode_indices.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/encode_pulses.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/interpolate.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/LP_variable_cutoff.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/NSQ.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/NSQ_del_dec.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/VAD.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/control_audio_bandwidth.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/quant_LTP_gains.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/VQ_WMat_EC.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/HP_variable_cutoff.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/NLSF_encode.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/NLSF_VQ.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/NLSF_del_dec_quant.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/process_NLSFs.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/stereo_LR_to_MS.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/check_control_input.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/control_SNR.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/init_encoder.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/control_codec.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/A2NLSF.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/ana_filt_bank_1.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/biquad_alt.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/resampler_down2_3.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/resampler_down2.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/sigm_Q15.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) -silk/stereo_encode_pred.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/stereo_find_predictor.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/stereo_quant_pred.lo: silk/$(am__dirstamp) \ - silk/$(DEPDIR)/$(am__dirstamp) -silk/fixed/$(am__dirstamp): - @$(MKDIR_P) silk/fixed - @: > silk/fixed/$(am__dirstamp) -silk/fixed/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) silk/fixed/$(DEPDIR) - @: > silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/LTP_analysis_filter_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/LTP_scale_ctrl_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/corrMatrix_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/encode_frame_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/find_LPC_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/find_LTP_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/find_pitch_lags_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/find_pred_coefs_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/noise_shape_analysis_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/prefilter_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/process_gains_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/regularize_correlations_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/residual_energy16_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/residual_energy_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/solve_LS_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/warped_autocorrelation_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/apply_sine_window_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/autocorr_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/burg_modified_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/k2a_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/k2a_Q16_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/pitch_analysis_core_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/vector_ops_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/schur64_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/fixed/schur_FIX.lo: silk/fixed/$(am__dirstamp) \ - silk/fixed/$(DEPDIR)/$(am__dirstamp) -silk/float/$(am__dirstamp): - @$(MKDIR_P) silk/float - @: > silk/float/$(am__dirstamp) -silk/float/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) silk/float/$(DEPDIR) - @: > silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/apply_sine_window_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/corrMatrix_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/encode_frame_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/find_LPC_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/find_LTP_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/find_pitch_lags_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/find_pred_coefs_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/LPC_analysis_filter_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/LTP_analysis_filter_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/LTP_scale_ctrl_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/noise_shape_analysis_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/prefilter_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/process_gains_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/regularize_correlations_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/residual_energy_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/solve_LS_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/warped_autocorrelation_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/wrappers_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/autocorrelation_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/burg_modified_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/bwexpander_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/energy_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/inner_product_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/k2a_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/levinsondurbin_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/LPC_inv_pred_gain_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/pitch_analysis_core_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/scale_copy_vector_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/scale_vector_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/schur_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -silk/float/sort_FLP.lo: silk/float/$(am__dirstamp) \ - silk/float/$(DEPDIR)/$(am__dirstamp) -src/$(am__dirstamp): - @$(MKDIR_P) src - @: > src/$(am__dirstamp) -src/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/$(DEPDIR) - @: > src/$(DEPDIR)/$(am__dirstamp) -src/opus_decoder.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/opus_multistream.lo: src/$(am__dirstamp) \ - src/$(DEPDIR)/$(am__dirstamp) -src/opus.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/opus_encoder.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/repacketizer.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -libopus.la: $(libopus_la_OBJECTS) $(libopus_la_DEPENDENCIES) $(EXTRA_libopus_la_DEPENDENCIES) - $(AM_V_CCLD)$(libopus_la_LINK) -rpath $(libdir) $(libopus_la_OBJECTS) $(libopus_la_LIBADD) $(LIBS) - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list -celt/tests/$(am__dirstamp): - @$(MKDIR_P) celt/tests - @: > celt/tests/$(am__dirstamp) -celt/tests/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) celt/tests/$(DEPDIR) - @: > celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_cwrs32.$(OBJEXT): celt/tests/$(am__dirstamp) \ - celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_cwrs32$(EXEEXT): $(celt_tests_test_unit_cwrs32_OBJECTS) $(celt_tests_test_unit_cwrs32_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_cwrs32_DEPENDENCIES) celt/tests/$(am__dirstamp) - @rm -f celt/tests/test_unit_cwrs32$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_cwrs32_OBJECTS) $(celt_tests_test_unit_cwrs32_LDADD) $(LIBS) -celt/tests/test_unit_dft.$(OBJEXT): celt/tests/$(am__dirstamp) \ - celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_dft$(EXEEXT): $(celt_tests_test_unit_dft_OBJECTS) $(celt_tests_test_unit_dft_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_dft_DEPENDENCIES) celt/tests/$(am__dirstamp) - @rm -f celt/tests/test_unit_dft$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_dft_OBJECTS) $(celt_tests_test_unit_dft_LDADD) $(LIBS) -celt/tests/test_unit_entropy.$(OBJEXT): celt/tests/$(am__dirstamp) \ - celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_entropy$(EXEEXT): $(celt_tests_test_unit_entropy_OBJECTS) $(celt_tests_test_unit_entropy_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_entropy_DEPENDENCIES) celt/tests/$(am__dirstamp) - @rm -f celt/tests/test_unit_entropy$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_entropy_OBJECTS) $(celt_tests_test_unit_entropy_LDADD) $(LIBS) -celt/tests/test_unit_laplace.$(OBJEXT): celt/tests/$(am__dirstamp) \ - celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_laplace$(EXEEXT): $(celt_tests_test_unit_laplace_OBJECTS) $(celt_tests_test_unit_laplace_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_laplace_DEPENDENCIES) celt/tests/$(am__dirstamp) - @rm -f celt/tests/test_unit_laplace$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_laplace_OBJECTS) $(celt_tests_test_unit_laplace_LDADD) $(LIBS) -celt/tests/test_unit_mathops.$(OBJEXT): celt/tests/$(am__dirstamp) \ - celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_mathops$(EXEEXT): $(celt_tests_test_unit_mathops_OBJECTS) $(celt_tests_test_unit_mathops_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_mathops_DEPENDENCIES) celt/tests/$(am__dirstamp) - @rm -f celt/tests/test_unit_mathops$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_mathops_OBJECTS) $(celt_tests_test_unit_mathops_LDADD) $(LIBS) -celt/tests/test_unit_mdct.$(OBJEXT): celt/tests/$(am__dirstamp) \ - celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_mdct$(EXEEXT): $(celt_tests_test_unit_mdct_OBJECTS) $(celt_tests_test_unit_mdct_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_mdct_DEPENDENCIES) celt/tests/$(am__dirstamp) - @rm -f celt/tests/test_unit_mdct$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_mdct_OBJECTS) $(celt_tests_test_unit_mdct_LDADD) $(LIBS) -celt/tests/test_unit_rotation.$(OBJEXT): celt/tests/$(am__dirstamp) \ - celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_rotation$(EXEEXT): $(celt_tests_test_unit_rotation_OBJECTS) $(celt_tests_test_unit_rotation_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_rotation_DEPENDENCIES) celt/tests/$(am__dirstamp) - @rm -f celt/tests/test_unit_rotation$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_rotation_OBJECTS) $(celt_tests_test_unit_rotation_LDADD) $(LIBS) -celt/tests/test_unit_types.$(OBJEXT): celt/tests/$(am__dirstamp) \ - celt/tests/$(DEPDIR)/$(am__dirstamp) -celt/tests/test_unit_types$(EXEEXT): $(celt_tests_test_unit_types_OBJECTS) $(celt_tests_test_unit_types_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_types_DEPENDENCIES) celt/tests/$(am__dirstamp) - @rm -f celt/tests/test_unit_types$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_types_OBJECTS) $(celt_tests_test_unit_types_LDADD) $(LIBS) -src/opus_compare.$(OBJEXT): src/$(am__dirstamp) \ - src/$(DEPDIR)/$(am__dirstamp) -opus_compare$(EXEEXT): $(opus_compare_OBJECTS) $(opus_compare_DEPENDENCIES) $(EXTRA_opus_compare_DEPENDENCIES) - @rm -f opus_compare$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(opus_compare_OBJECTS) $(opus_compare_LDADD) $(LIBS) -celt/opus_custom_demo.$(OBJEXT): celt/$(am__dirstamp) \ - celt/$(DEPDIR)/$(am__dirstamp) -opus_custom_demo$(EXEEXT): $(opus_custom_demo_OBJECTS) $(opus_custom_demo_DEPENDENCIES) $(EXTRA_opus_custom_demo_DEPENDENCIES) - @rm -f opus_custom_demo$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(opus_custom_demo_OBJECTS) $(opus_custom_demo_LDADD) $(LIBS) -src/opus_demo.$(OBJEXT): src/$(am__dirstamp) \ - src/$(DEPDIR)/$(am__dirstamp) -opus_demo$(EXEEXT): $(opus_demo_OBJECTS) $(opus_demo_DEPENDENCIES) $(EXTRA_opus_demo_DEPENDENCIES) - @rm -f opus_demo$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(opus_demo_OBJECTS) $(opus_demo_LDADD) $(LIBS) -src/repacketizer_demo.$(OBJEXT): src/$(am__dirstamp) \ - src/$(DEPDIR)/$(am__dirstamp) -repacketizer_demo$(EXEEXT): $(repacketizer_demo_OBJECTS) $(repacketizer_demo_DEPENDENCIES) $(EXTRA_repacketizer_demo_DEPENDENCIES) - @rm -f repacketizer_demo$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(repacketizer_demo_OBJECTS) $(repacketizer_demo_LDADD) $(LIBS) -tests/$(am__dirstamp): - @$(MKDIR_P) tests - @: > tests/$(am__dirstamp) -tests/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) tests/$(DEPDIR) - @: > tests/$(DEPDIR)/$(am__dirstamp) -tests/test_opus_api.$(OBJEXT): tests/$(am__dirstamp) \ - tests/$(DEPDIR)/$(am__dirstamp) -tests/test_opus_api$(EXEEXT): $(tests_test_opus_api_OBJECTS) $(tests_test_opus_api_DEPENDENCIES) $(EXTRA_tests_test_opus_api_DEPENDENCIES) tests/$(am__dirstamp) - @rm -f tests/test_opus_api$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(tests_test_opus_api_OBJECTS) $(tests_test_opus_api_LDADD) $(LIBS) -tests/test_opus_decode.$(OBJEXT): tests/$(am__dirstamp) \ - tests/$(DEPDIR)/$(am__dirstamp) -tests/test_opus_decode$(EXEEXT): $(tests_test_opus_decode_OBJECTS) $(tests_test_opus_decode_DEPENDENCIES) $(EXTRA_tests_test_opus_decode_DEPENDENCIES) tests/$(am__dirstamp) - @rm -f tests/test_opus_decode$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(tests_test_opus_decode_OBJECTS) $(tests_test_opus_decode_LDADD) $(LIBS) -tests/test_opus_encode.$(OBJEXT): tests/$(am__dirstamp) \ - tests/$(DEPDIR)/$(am__dirstamp) -tests/test_opus_encode$(EXEEXT): $(tests_test_opus_encode_OBJECTS) $(tests_test_opus_encode_DEPENDENCIES) $(EXTRA_tests_test_opus_encode_DEPENDENCIES) tests/$(am__dirstamp) - @rm -f tests/test_opus_encode$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(tests_test_opus_encode_OBJECTS) $(tests_test_opus_encode_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -rm -f celt/bands.$(OBJEXT) - -rm -f celt/bands.lo - -rm -f celt/celt.$(OBJEXT) - -rm -f celt/celt.lo - -rm -f celt/celt_lpc.$(OBJEXT) - -rm -f celt/celt_lpc.lo - -rm -f celt/cwrs.$(OBJEXT) - -rm -f celt/cwrs.lo - -rm -f celt/entcode.$(OBJEXT) - -rm -f celt/entcode.lo - -rm -f celt/entdec.$(OBJEXT) - -rm -f celt/entdec.lo - -rm -f celt/entenc.$(OBJEXT) - -rm -f celt/entenc.lo - -rm -f celt/kiss_fft.$(OBJEXT) - -rm -f celt/kiss_fft.lo - -rm -f celt/laplace.$(OBJEXT) - -rm -f celt/laplace.lo - -rm -f celt/mathops.$(OBJEXT) - -rm -f celt/mathops.lo - -rm -f celt/mdct.$(OBJEXT) - -rm -f celt/mdct.lo - -rm -f celt/modes.$(OBJEXT) - -rm -f celt/modes.lo - -rm -f celt/opus_custom_demo.$(OBJEXT) - -rm -f celt/pitch.$(OBJEXT) - -rm -f celt/pitch.lo - -rm -f celt/quant_bands.$(OBJEXT) - -rm -f celt/quant_bands.lo - -rm -f celt/rate.$(OBJEXT) - -rm -f celt/rate.lo - -rm -f celt/tests/test_unit_cwrs32.$(OBJEXT) - -rm -f celt/tests/test_unit_dft.$(OBJEXT) - -rm -f celt/tests/test_unit_entropy.$(OBJEXT) - -rm -f celt/tests/test_unit_laplace.$(OBJEXT) - -rm -f celt/tests/test_unit_mathops.$(OBJEXT) - -rm -f celt/tests/test_unit_mdct.$(OBJEXT) - -rm -f celt/tests/test_unit_rotation.$(OBJEXT) - -rm -f celt/tests/test_unit_types.$(OBJEXT) - -rm -f celt/vq.$(OBJEXT) - -rm -f celt/vq.lo - -rm -f silk/A2NLSF.$(OBJEXT) - -rm -f silk/A2NLSF.lo - -rm -f silk/CNG.$(OBJEXT) - -rm -f silk/CNG.lo - -rm -f silk/HP_variable_cutoff.$(OBJEXT) - -rm -f silk/HP_variable_cutoff.lo - -rm -f silk/LPC_analysis_filter.$(OBJEXT) - -rm -f silk/LPC_analysis_filter.lo - -rm -f silk/LPC_inv_pred_gain.$(OBJEXT) - -rm -f silk/LPC_inv_pred_gain.lo - -rm -f silk/LP_variable_cutoff.$(OBJEXT) - -rm -f silk/LP_variable_cutoff.lo - -rm -f silk/NLSF2A.$(OBJEXT) - -rm -f silk/NLSF2A.lo - -rm -f silk/NLSF_VQ.$(OBJEXT) - -rm -f silk/NLSF_VQ.lo - -rm -f silk/NLSF_VQ_weights_laroia.$(OBJEXT) - -rm -f silk/NLSF_VQ_weights_laroia.lo - -rm -f silk/NLSF_decode.$(OBJEXT) - -rm -f silk/NLSF_decode.lo - -rm -f silk/NLSF_del_dec_quant.$(OBJEXT) - -rm -f silk/NLSF_del_dec_quant.lo - -rm -f silk/NLSF_encode.$(OBJEXT) - -rm -f silk/NLSF_encode.lo - -rm -f silk/NLSF_stabilize.$(OBJEXT) - -rm -f silk/NLSF_stabilize.lo - -rm -f silk/NLSF_unpack.$(OBJEXT) - -rm -f silk/NLSF_unpack.lo - -rm -f silk/NSQ.$(OBJEXT) - -rm -f silk/NSQ.lo - -rm -f silk/NSQ_del_dec.$(OBJEXT) - -rm -f silk/NSQ_del_dec.lo - -rm -f silk/PLC.$(OBJEXT) - -rm -f silk/PLC.lo - -rm -f silk/VAD.$(OBJEXT) - -rm -f silk/VAD.lo - -rm -f silk/VQ_WMat_EC.$(OBJEXT) - -rm -f silk/VQ_WMat_EC.lo - -rm -f silk/ana_filt_bank_1.$(OBJEXT) - -rm -f silk/ana_filt_bank_1.lo - -rm -f silk/biquad_alt.$(OBJEXT) - -rm -f silk/biquad_alt.lo - -rm -f silk/bwexpander.$(OBJEXT) - -rm -f silk/bwexpander.lo - -rm -f silk/bwexpander_32.$(OBJEXT) - -rm -f silk/bwexpander_32.lo - -rm -f silk/check_control_input.$(OBJEXT) - -rm -f silk/check_control_input.lo - -rm -f silk/code_signs.$(OBJEXT) - -rm -f silk/code_signs.lo - -rm -f silk/control_SNR.$(OBJEXT) - -rm -f silk/control_SNR.lo - -rm -f silk/control_audio_bandwidth.$(OBJEXT) - -rm -f silk/control_audio_bandwidth.lo - -rm -f silk/control_codec.$(OBJEXT) - -rm -f silk/control_codec.lo - -rm -f silk/debug.$(OBJEXT) - -rm -f silk/debug.lo - -rm -f silk/dec_API.$(OBJEXT) - -rm -f silk/dec_API.lo - -rm -f silk/decode_core.$(OBJEXT) - -rm -f silk/decode_core.lo - -rm -f silk/decode_frame.$(OBJEXT) - -rm -f silk/decode_frame.lo - -rm -f silk/decode_indices.$(OBJEXT) - -rm -f silk/decode_indices.lo - -rm -f silk/decode_parameters.$(OBJEXT) - -rm -f silk/decode_parameters.lo - -rm -f silk/decode_pitch.$(OBJEXT) - -rm -f silk/decode_pitch.lo - -rm -f silk/decode_pulses.$(OBJEXT) - -rm -f silk/decode_pulses.lo - -rm -f silk/decoder_set_fs.$(OBJEXT) - -rm -f silk/decoder_set_fs.lo - -rm -f silk/enc_API.$(OBJEXT) - -rm -f silk/enc_API.lo - -rm -f silk/encode_indices.$(OBJEXT) - -rm -f silk/encode_indices.lo - -rm -f silk/encode_pulses.$(OBJEXT) - -rm -f silk/encode_pulses.lo - -rm -f silk/fixed/LTP_analysis_filter_FIX.$(OBJEXT) - -rm -f silk/fixed/LTP_analysis_filter_FIX.lo - -rm -f silk/fixed/LTP_scale_ctrl_FIX.$(OBJEXT) - -rm -f silk/fixed/LTP_scale_ctrl_FIX.lo - -rm -f silk/fixed/apply_sine_window_FIX.$(OBJEXT) - -rm -f silk/fixed/apply_sine_window_FIX.lo - -rm -f silk/fixed/autocorr_FIX.$(OBJEXT) - -rm -f silk/fixed/autocorr_FIX.lo - -rm -f silk/fixed/burg_modified_FIX.$(OBJEXT) - -rm -f silk/fixed/burg_modified_FIX.lo - -rm -f silk/fixed/corrMatrix_FIX.$(OBJEXT) - -rm -f silk/fixed/corrMatrix_FIX.lo - -rm -f silk/fixed/encode_frame_FIX.$(OBJEXT) - -rm -f silk/fixed/encode_frame_FIX.lo - -rm -f silk/fixed/find_LPC_FIX.$(OBJEXT) - -rm -f silk/fixed/find_LPC_FIX.lo - -rm -f silk/fixed/find_LTP_FIX.$(OBJEXT) - -rm -f silk/fixed/find_LTP_FIX.lo - -rm -f silk/fixed/find_pitch_lags_FIX.$(OBJEXT) - -rm -f silk/fixed/find_pitch_lags_FIX.lo - -rm -f silk/fixed/find_pred_coefs_FIX.$(OBJEXT) - -rm -f silk/fixed/find_pred_coefs_FIX.lo - -rm -f silk/fixed/k2a_FIX.$(OBJEXT) - -rm -f silk/fixed/k2a_FIX.lo - -rm -f silk/fixed/k2a_Q16_FIX.$(OBJEXT) - -rm -f silk/fixed/k2a_Q16_FIX.lo - -rm -f silk/fixed/noise_shape_analysis_FIX.$(OBJEXT) - -rm -f silk/fixed/noise_shape_analysis_FIX.lo - -rm -f silk/fixed/pitch_analysis_core_FIX.$(OBJEXT) - -rm -f silk/fixed/pitch_analysis_core_FIX.lo - -rm -f silk/fixed/prefilter_FIX.$(OBJEXT) - -rm -f silk/fixed/prefilter_FIX.lo - -rm -f silk/fixed/process_gains_FIX.$(OBJEXT) - -rm -f silk/fixed/process_gains_FIX.lo - -rm -f silk/fixed/regularize_correlations_FIX.$(OBJEXT) - -rm -f silk/fixed/regularize_correlations_FIX.lo - -rm -f silk/fixed/residual_energy16_FIX.$(OBJEXT) - -rm -f silk/fixed/residual_energy16_FIX.lo - -rm -f silk/fixed/residual_energy_FIX.$(OBJEXT) - -rm -f silk/fixed/residual_energy_FIX.lo - -rm -f silk/fixed/schur64_FIX.$(OBJEXT) - -rm -f silk/fixed/schur64_FIX.lo - -rm -f silk/fixed/schur_FIX.$(OBJEXT) - -rm -f silk/fixed/schur_FIX.lo - -rm -f silk/fixed/solve_LS_FIX.$(OBJEXT) - -rm -f silk/fixed/solve_LS_FIX.lo - -rm -f silk/fixed/vector_ops_FIX.$(OBJEXT) - -rm -f silk/fixed/vector_ops_FIX.lo - -rm -f silk/fixed/warped_autocorrelation_FIX.$(OBJEXT) - -rm -f silk/fixed/warped_autocorrelation_FIX.lo - -rm -f silk/float/LPC_analysis_filter_FLP.$(OBJEXT) - -rm -f silk/float/LPC_analysis_filter_FLP.lo - -rm -f silk/float/LPC_inv_pred_gain_FLP.$(OBJEXT) - -rm -f silk/float/LPC_inv_pred_gain_FLP.lo - -rm -f silk/float/LTP_analysis_filter_FLP.$(OBJEXT) - -rm -f silk/float/LTP_analysis_filter_FLP.lo - -rm -f silk/float/LTP_scale_ctrl_FLP.$(OBJEXT) - -rm -f silk/float/LTP_scale_ctrl_FLP.lo - -rm -f silk/float/apply_sine_window_FLP.$(OBJEXT) - -rm -f silk/float/apply_sine_window_FLP.lo - -rm -f silk/float/autocorrelation_FLP.$(OBJEXT) - -rm -f silk/float/autocorrelation_FLP.lo - -rm -f silk/float/burg_modified_FLP.$(OBJEXT) - -rm -f silk/float/burg_modified_FLP.lo - -rm -f silk/float/bwexpander_FLP.$(OBJEXT) - -rm -f silk/float/bwexpander_FLP.lo - -rm -f silk/float/corrMatrix_FLP.$(OBJEXT) - -rm -f silk/float/corrMatrix_FLP.lo - -rm -f silk/float/encode_frame_FLP.$(OBJEXT) - -rm -f silk/float/encode_frame_FLP.lo - -rm -f silk/float/energy_FLP.$(OBJEXT) - -rm -f silk/float/energy_FLP.lo - -rm -f silk/float/find_LPC_FLP.$(OBJEXT) - -rm -f silk/float/find_LPC_FLP.lo - -rm -f silk/float/find_LTP_FLP.$(OBJEXT) - -rm -f silk/float/find_LTP_FLP.lo - -rm -f silk/float/find_pitch_lags_FLP.$(OBJEXT) - -rm -f silk/float/find_pitch_lags_FLP.lo - -rm -f silk/float/find_pred_coefs_FLP.$(OBJEXT) - -rm -f silk/float/find_pred_coefs_FLP.lo - -rm -f silk/float/inner_product_FLP.$(OBJEXT) - -rm -f silk/float/inner_product_FLP.lo - -rm -f silk/float/k2a_FLP.$(OBJEXT) - -rm -f silk/float/k2a_FLP.lo - -rm -f silk/float/levinsondurbin_FLP.$(OBJEXT) - -rm -f silk/float/levinsondurbin_FLP.lo - -rm -f silk/float/noise_shape_analysis_FLP.$(OBJEXT) - -rm -f silk/float/noise_shape_analysis_FLP.lo - -rm -f silk/float/pitch_analysis_core_FLP.$(OBJEXT) - -rm -f silk/float/pitch_analysis_core_FLP.lo - -rm -f silk/float/prefilter_FLP.$(OBJEXT) - -rm -f silk/float/prefilter_FLP.lo - -rm -f silk/float/process_gains_FLP.$(OBJEXT) - -rm -f silk/float/process_gains_FLP.lo - -rm -f silk/float/regularize_correlations_FLP.$(OBJEXT) - -rm -f silk/float/regularize_correlations_FLP.lo - -rm -f silk/float/residual_energy_FLP.$(OBJEXT) - -rm -f silk/float/residual_energy_FLP.lo - -rm -f silk/float/scale_copy_vector_FLP.$(OBJEXT) - -rm -f silk/float/scale_copy_vector_FLP.lo - -rm -f silk/float/scale_vector_FLP.$(OBJEXT) - -rm -f silk/float/scale_vector_FLP.lo - -rm -f silk/float/schur_FLP.$(OBJEXT) - -rm -f silk/float/schur_FLP.lo - -rm -f silk/float/solve_LS_FLP.$(OBJEXT) - -rm -f silk/float/solve_LS_FLP.lo - -rm -f silk/float/sort_FLP.$(OBJEXT) - -rm -f silk/float/sort_FLP.lo - -rm -f silk/float/warped_autocorrelation_FLP.$(OBJEXT) - -rm -f silk/float/warped_autocorrelation_FLP.lo - -rm -f silk/float/wrappers_FLP.$(OBJEXT) - -rm -f silk/float/wrappers_FLP.lo - -rm -f silk/gain_quant.$(OBJEXT) - -rm -f silk/gain_quant.lo - -rm -f silk/init_decoder.$(OBJEXT) - -rm -f silk/init_decoder.lo - -rm -f silk/init_encoder.$(OBJEXT) - -rm -f silk/init_encoder.lo - -rm -f silk/inner_prod_aligned.$(OBJEXT) - -rm -f silk/inner_prod_aligned.lo - -rm -f silk/interpolate.$(OBJEXT) - -rm -f silk/interpolate.lo - -rm -f silk/lin2log.$(OBJEXT) - -rm -f silk/lin2log.lo - -rm -f silk/log2lin.$(OBJEXT) - -rm -f silk/log2lin.lo - -rm -f silk/pitch_est_tables.$(OBJEXT) - -rm -f silk/pitch_est_tables.lo - -rm -f silk/process_NLSFs.$(OBJEXT) - -rm -f silk/process_NLSFs.lo - -rm -f silk/quant_LTP_gains.$(OBJEXT) - -rm -f silk/quant_LTP_gains.lo - -rm -f silk/resampler.$(OBJEXT) - -rm -f silk/resampler.lo - -rm -f silk/resampler_down2.$(OBJEXT) - -rm -f silk/resampler_down2.lo - -rm -f silk/resampler_down2_3.$(OBJEXT) - -rm -f silk/resampler_down2_3.lo - -rm -f silk/resampler_private_AR2.$(OBJEXT) - -rm -f silk/resampler_private_AR2.lo - -rm -f silk/resampler_private_IIR_FIR.$(OBJEXT) - -rm -f silk/resampler_private_IIR_FIR.lo - -rm -f silk/resampler_private_down_FIR.$(OBJEXT) - -rm -f silk/resampler_private_down_FIR.lo - -rm -f silk/resampler_private_up2_HQ.$(OBJEXT) - -rm -f silk/resampler_private_up2_HQ.lo - -rm -f silk/resampler_rom.$(OBJEXT) - -rm -f silk/resampler_rom.lo - -rm -f silk/shell_coder.$(OBJEXT) - -rm -f silk/shell_coder.lo - -rm -f silk/sigm_Q15.$(OBJEXT) - -rm -f silk/sigm_Q15.lo - -rm -f silk/sort.$(OBJEXT) - -rm -f silk/sort.lo - -rm -f silk/stereo_LR_to_MS.$(OBJEXT) - -rm -f silk/stereo_LR_to_MS.lo - -rm -f silk/stereo_MS_to_LR.$(OBJEXT) - -rm -f silk/stereo_MS_to_LR.lo - -rm -f silk/stereo_decode_pred.$(OBJEXT) - -rm -f silk/stereo_decode_pred.lo - -rm -f silk/stereo_encode_pred.$(OBJEXT) - -rm -f silk/stereo_encode_pred.lo - -rm -f silk/stereo_find_predictor.$(OBJEXT) - -rm -f silk/stereo_find_predictor.lo - -rm -f silk/stereo_quant_pred.$(OBJEXT) - -rm -f silk/stereo_quant_pred.lo - -rm -f silk/sum_sqr_shift.$(OBJEXT) - -rm -f silk/sum_sqr_shift.lo - -rm -f silk/table_LSF_cos.$(OBJEXT) - -rm -f silk/table_LSF_cos.lo - -rm -f silk/tables_LTP.$(OBJEXT) - -rm -f silk/tables_LTP.lo - -rm -f silk/tables_NLSF_CB_NB_MB.$(OBJEXT) - -rm -f silk/tables_NLSF_CB_NB_MB.lo - -rm -f silk/tables_NLSF_CB_WB.$(OBJEXT) - -rm -f silk/tables_NLSF_CB_WB.lo - -rm -f silk/tables_gain.$(OBJEXT) - -rm -f silk/tables_gain.lo - -rm -f silk/tables_other.$(OBJEXT) - -rm -f silk/tables_other.lo - -rm -f silk/tables_pitch_lag.$(OBJEXT) - -rm -f silk/tables_pitch_lag.lo - -rm -f silk/tables_pulses_per_block.$(OBJEXT) - -rm -f silk/tables_pulses_per_block.lo - -rm -f src/opus.$(OBJEXT) - -rm -f src/opus.lo - -rm -f src/opus_compare.$(OBJEXT) - -rm -f src/opus_decoder.$(OBJEXT) - -rm -f src/opus_decoder.lo - -rm -f src/opus_demo.$(OBJEXT) - -rm -f src/opus_encoder.$(OBJEXT) - -rm -f src/opus_encoder.lo - -rm -f src/opus_multistream.$(OBJEXT) - -rm -f src/opus_multistream.lo - -rm -f src/repacketizer.$(OBJEXT) - -rm -f src/repacketizer.lo - -rm -f src/repacketizer_demo.$(OBJEXT) - -rm -f tests/test_opus_api.$(OBJEXT) - -rm -f tests/test_opus_decode.$(OBJEXT) - -rm -f tests/test_opus_encode.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/bands.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/celt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/celt_lpc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/cwrs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/entcode.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/entdec.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/entenc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/kiss_fft.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/laplace.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/mathops.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/mdct.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/modes.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/opus_custom_demo.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/pitch.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/quant_bands.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/rate.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/vq.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_cwrs32.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_dft.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_entropy.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_laplace.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_mathops.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_mdct.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_rotation.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_types.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/A2NLSF.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/CNG.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/HP_variable_cutoff.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/LPC_analysis_filter.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/LPC_inv_pred_gain.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/LP_variable_cutoff.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF2A.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_VQ.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_VQ_weights_laroia.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_decode.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_del_dec_quant.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_encode.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_stabilize.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_unpack.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NSQ.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NSQ_del_dec.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/PLC.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/VAD.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/VQ_WMat_EC.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/ana_filt_bank_1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/biquad_alt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/bwexpander.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/bwexpander_32.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/check_control_input.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/code_signs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/control_SNR.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/control_audio_bandwidth.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/control_codec.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/debug.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/dec_API.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_core.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_frame.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_indices.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_parameters.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_pitch.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_pulses.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decoder_set_fs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/enc_API.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/encode_indices.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/encode_pulses.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/gain_quant.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/init_decoder.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/init_encoder.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/inner_prod_aligned.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/interpolate.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/lin2log.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/log2lin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/pitch_est_tables.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/process_NLSFs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/quant_LTP_gains.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_down2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_down2_3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_private_AR2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_private_IIR_FIR.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_private_down_FIR.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_private_up2_HQ.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_rom.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/shell_coder.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/sigm_Q15.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/sort.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_LR_to_MS.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_MS_to_LR.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_decode_pred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_encode_pred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_find_predictor.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_quant_pred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/sum_sqr_shift.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/table_LSF_cos.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_LTP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_NLSF_CB_NB_MB.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_NLSF_CB_WB.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_gain.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_other.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_pitch_lag.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_pulses_per_block.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/LTP_analysis_filter_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/LTP_scale_ctrl_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/apply_sine_window_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/autocorr_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/burg_modified_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/corrMatrix_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/encode_frame_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/find_LPC_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/find_LTP_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/find_pitch_lags_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/find_pred_coefs_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/k2a_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/k2a_Q16_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/noise_shape_analysis_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/pitch_analysis_core_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/prefilter_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/process_gains_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/regularize_correlations_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/residual_energy16_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/residual_energy_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/schur64_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/schur_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/solve_LS_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/vector_ops_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/warped_autocorrelation_FIX.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/LPC_analysis_filter_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/LPC_inv_pred_gain_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/LTP_analysis_filter_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/LTP_scale_ctrl_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/apply_sine_window_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/autocorrelation_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/burg_modified_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/bwexpander_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/corrMatrix_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/encode_frame_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/energy_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/find_LPC_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/find_LTP_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/find_pitch_lags_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/find_pred_coefs_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/inner_product_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/k2a_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/levinsondurbin_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/noise_shape_analysis_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/pitch_analysis_core_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/prefilter_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/process_gains_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/regularize_correlations_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/residual_energy_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/scale_copy_vector_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/scale_vector_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/schur_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/solve_LS_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/sort_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/warped_autocorrelation_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/wrappers_FLP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_compare.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_decoder.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_demo.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_encoder.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_multistream.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/repacketizer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/repacketizer_demo.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_opus_api.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_opus_decode.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_opus_encode.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -rm -rf celt/.libs celt/_libs - -rm -rf celt/tests/.libs celt/tests/_libs - -rm -rf silk/.libs silk/_libs - -rm -rf silk/fixed/.libs silk/fixed/_libs - -rm -rf silk/float/.libs silk/float/_libs - -rm -rf src/.libs src/_libs - -rm -rf tests/.libs tests/_libs - -distclean-libtool: - -rm -f libtool config.lt -install-m4dataDATA: $(m4data_DATA) - @$(NORMAL_INSTALL) - @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(m4datadir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(m4datadir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \ - done - -uninstall-m4dataDATA: - @$(NORMAL_UNINSTALL) - @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir) -install-pkgconfigDATA: $(pkgconfig_DATA) - @$(NORMAL_INSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ - done - -uninstall-pkgconfigDATA: - @$(NORMAL_UNINSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) -install-pkgincludeHEADERS: $(pkginclude_HEADERS) - @$(NORMAL_INSTALL) - @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ - done - -uninstall-pkgincludeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ - fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ - else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ - fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - col="$$grn"; \ - else \ - col="$$red"; \ - fi; \ - echo "$${col}$$dashes$${std}"; \ - echo "$${col}$$banner$${std}"; \ - test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ - test -z "$$report" || echo "$${col}$$report$${std}"; \ - echo "$${col}$$dashes$${std}"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__remove_distdir) - -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) - -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod u+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-TESTS -check: check-recursive -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) \ - config.h all-local -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -rm -f celt/$(DEPDIR)/$(am__dirstamp) - -rm -f celt/$(am__dirstamp) - -rm -f celt/tests/$(DEPDIR)/$(am__dirstamp) - -rm -f celt/tests/$(am__dirstamp) - -rm -f silk/$(DEPDIR)/$(am__dirstamp) - -rm -f silk/$(am__dirstamp) - -rm -f silk/fixed/$(DEPDIR)/$(am__dirstamp) - -rm -f silk/fixed/$(am__dirstamp) - -rm -f silk/float/$(DEPDIR)/$(am__dirstamp) - -rm -f silk/float/$(am__dirstamp) - -rm -f src/$(DEPDIR)/$(am__dirstamp) - -rm -f src/$(am__dirstamp) - -rm -f tests/$(DEPDIR)/$(am__dirstamp) - -rm -f tests/$(am__dirstamp) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ - clean-noinstPROGRAMS mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf celt/$(DEPDIR) celt/tests/$(DEPDIR) silk/$(DEPDIR) silk/fixed/$(DEPDIR) silk/float/$(DEPDIR) src/$(DEPDIR) tests/$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-libtool distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: install-data-local install-m4dataDATA \ - install-pkgconfigDATA install-pkgincludeHEADERS - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: install-libLTLIBRARIES - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -rf celt/$(DEPDIR) celt/tests/$(DEPDIR) silk/$(DEPDIR) silk/fixed/$(DEPDIR) silk/float/$(DEPDIR) src/$(DEPDIR) tests/$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-libLTLIBRARIES uninstall-local \ - uninstall-m4dataDATA uninstall-pkgconfigDATA \ - uninstall-pkgincludeHEADERS - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \ - ctags-recursive install-am install-strip tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am all-local am--refresh check check-TESTS check-am \ - clean clean-generic clean-libLTLIBRARIES clean-libtool \ - clean-local clean-noinstPROGRAMS ctags ctags-recursive dist \ - dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-lzma \ - dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ - distclean-compile distclean-generic distclean-hdr \ - distclean-libtool distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am \ - install-data-local install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-libLTLIBRARIES install-m4dataDATA \ - install-man install-pdf install-pdf-am install-pkgconfigDATA \ - install-pkgincludeHEADERS install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-libLTLIBRARIES \ - uninstall-local uninstall-m4dataDATA uninstall-pkgconfigDATA \ - uninstall-pkgincludeHEADERS - - -# Targets to build and install just the library without the docs -opus check-opus install-opus: export NO_DOXYGEN = 1 - -opus: all -check-opus: check -install-opus: install - -# Or just the docs -docs: - ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) - -install-docs: - ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) - -# Or everything (by default) -all-local: - @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) - -install-data-local: - @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) - -clean-local: - -( cd doc && $(MAKE) $(AM_MAKEFLAGS) clean ) - -uninstall-local: - ( cd doc && $(MAKE) $(AM_MAKEFLAGS) uninstall ) - -# We check this every time make is run, with configure.ac being touched to -# trigger an update of the build system files if update_version changes the -# current PACKAGE_VERSION (or if package_version was modified manually by a -# user with either AUTO_UPDATE=no or no update_version script present - the -# latter being the normal case for tarball releases). -# -# We can't just add the package_version file to CONFIGURE_DEPENDENCIES since -# simply running autoconf will not actually regenerate configure for us when -# the content of that file changes (due to autoconf dependency checking not -# knowing about that without us creating yet another file for it to include). -# -# The MAKECMDGOALS check is a gnu-make'ism, but will degrade 'gracefully' for -# makes that don't support it. The only loss of functionality is not forcing -# an update of package_version for `make dist` if AUTO_UPDATE=no, but that is -# unlikely to be a real problem for any real user. -$(top_srcdir)/configure.ac: force - @case "$(MAKECMDGOALS)" in \ - dist-hook) exit 0 ;; \ - dist-* | dist | distcheck | distclean) _arg=release ;; \ - esac; \ - if ! $(top_srcdir)/update_version $$_arg 2> /dev/null; then \ - if [ ! -e $(top_srcdir)/package_version ]; then \ - echo 'PACKAGE_VERSION="unknown"' > $(top_srcdir)/package_version; \ - fi; \ - . $(top_srcdir)/package_version || exit 1; \ - [ "$(PACKAGE_VERSION)" != "$$PACKAGE_VERSION" ] || exit 0; \ - fi; \ - touch $@ - -force: - -# Create a minimal package_version file when make dist is run. -dist-hook: - echo 'PACKAGE_VERSION="$(PACKAGE_VERSION)"' > $(top_distdir)/package_version - -.PHONY: opus check-opus install-opus docs install-docs - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/external/opus-1.0.3/celt/bands.c b/external/opus-1.0.3/celt/bands.c deleted file mode 100644 index 9721d7ed..00000000 --- a/external/opus-1.0.3/celt/bands.c +++ /dev/null @@ -1,1337 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Copyright (c) 2008-2009 Gregory Maxwell - Written by Jean-Marc Valin and Gregory Maxwell */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "bands.h" -#include "modes.h" -#include "vq.h" -#include "cwrs.h" -#include "stack_alloc.h" -#include "os_support.h" -#include "mathops.h" -#include "rate.h" - -opus_uint32 celt_lcg_rand(opus_uint32 seed) -{ - return 1664525 * seed + 1013904223; -} - -/* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness - with this approximation is important because it has an impact on the bit allocation */ -static opus_int16 bitexact_cos(opus_int16 x) -{ - opus_int32 tmp; - opus_int16 x2; - tmp = (4096+((opus_int32)(x)*(x)))>>13; - celt_assert(tmp<=32767); - x2 = tmp; - x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2))))); - celt_assert(x2<=32766); - return 1+x2; -} - -static int bitexact_log2tan(int isin,int icos) -{ - int lc; - int ls; - lc=EC_ILOG(icos); - ls=EC_ILOG(isin); - icos<<=15-lc; - isin<<=15-ls; - return (ls-lc)*(1<<11) - +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932) - -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932); -} - -#ifdef FIXED_POINT -/* Compute the amplitude (sqrt energy) in each of the bands */ -void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int M) -{ - int i, c, N; - const opus_int16 *eBands = m->eBands; - N = M*m->shortMdctSize; - c=0; do { - for (i=0;i 0) - { - int shift = celt_ilog2(maxval)-10; - j=M*eBands[i]; do { - sum = MAC16_16(sum, EXTRACT16(VSHR32(X[j+c*N],shift)), - EXTRACT16(VSHR32(X[j+c*N],shift))); - } while (++jnbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift); - } else { - bandE[i+c*m->nbEBands] = EPSILON; - } - /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ - } - } while (++ceBands; - N = M*m->shortMdctSize; - c=0; do { - i=0; do { - opus_val16 g; - int j,shift; - opus_val16 E; - shift = celt_zlog2(bandE[i+c*m->nbEBands])-13; - E = VSHR32(bandE[i+c*m->nbEBands], shift); - g = EXTRACT16(celt_rcp(SHL32(E,3))); - j=M*eBands[i]; do { - X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); - } while (++jeBands; - N = M*m->shortMdctSize; - c=0; do { - for (i=0;inbEBands] = celt_sqrt(sum); - /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ - } - } while (++ceBands; - N = M*m->shortMdctSize; - c=0; do { - for (i=0;inbEBands]); - for (j=M*eBands[i];jeBands; - N = M*m->shortMdctSize; - celt_assert2(C<=2, "denormalise_bands() not implemented for >2 channels"); - c=0; do { - celt_sig * OPUS_RESTRICT f; - const celt_norm * OPUS_RESTRICT x; - f = freq+c*N; - x = X+c*N; - for (i=0;inbEBands],1); - j=M*eBands[i]; - band_end = M*eBands[i+1]; - do { - *f++ = SHL32(MULT16_32_Q15(*x, g),2); - x++; - } while (++jeBands[i+1]-m->eBands[i]; - /* depth in 1/8 bits */ - depth = (1+pulses[i])/((m->eBands[i+1]-m->eBands[i])<>1; - t = SHL32(t, (7-shift)<<1); - sqrt_1 = celt_rsqrt_norm(t); - } -#else - thresh = .5f*celt_exp2(-.125f*depth); - sqrt_1 = celt_rsqrt(N0<nbEBands+i]; - prev2 = prev2logE[c*m->nbEBands+i]; - if (C==1) - { - prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]); - prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]); - } - Ediff = EXTEND32(logE[c*m->nbEBands+i])-EXTEND32(MIN16(prev1,prev2)); - Ediff = MAX32(0, Ediff); - -#ifdef FIXED_POINT - if (Ediff < 16384) - { - opus_val32 r32 = SHR32(celt_exp2(-EXTRACT16(Ediff)),1); - r = 2*MIN16(16383,r32); - } else { - r = 0; - } - if (LM==3) - r = MULT16_16_Q14(23170, MIN32(23169, r)); - r = SHR16(MIN16(thresh, r),1); - r = SHR32(MULT16_16_Q15(sqrt_1, r),shift); -#else - /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because - short blocks don't have the same energy as long */ - r = 2.f*celt_exp2(-Ediff); - if (LM==3) - r *= 1.41421356f; - r = MIN16(thresh, r); - r = r*sqrt_1; -#endif - X = X_+c*size+(m->eBands[i]<nbEBands]))-13; -#endif - left = VSHR32(bandE[i],shift); - right = VSHR32(bandE[i+m->nbEBands],shift); - norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right)); - a1 = DIV32_16(SHL32(EXTEND32(left),14),norm); - a2 = DIV32_16(SHL32(EXTEND32(right),14),norm); - for (j=0;j>1; - kr = celt_ilog2(Er)>>1; -#endif - t = VSHR32(El, (kl-7)<<1); - lgain = celt_rsqrt_norm(t); - t = VSHR32(Er, (kr-7)<<1); - rgain = celt_rsqrt_norm(t); - -#ifdef FIXED_POINT - if (kl < 7) - kl = 7; - if (kr < 7) - kr = 7; -#endif - - for (j=0;jeBands; - int decision; - int hf_sum=0; - - celt_assert(end>0); - - N0 = M*m->shortMdctSize; - - if (M*(eBands[end]-eBands[end-1]) <= 8) - return SPREAD_NONE; - c=0; do { - for (i=0;im->nbEBands-4) - hf_sum += 32*(tcount[1]+tcount[0])/N; - tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); - sum += tmp*256; - nbBands++; - } - } while (++cnbEBands+end); - *hf_average = (*hf_average+hf_sum)>>1; - hf_sum = *hf_average; - if (*tapset_decision==2) - hf_sum += 4; - else if (*tapset_decision==0) - hf_sum -= 4; - if (hf_sum > 22) - *tapset_decision=2; - else if (hf_sum > 18) - *tapset_decision=1; - else - *tapset_decision=0; - } - /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ - celt_assert(nbBands>0); /*M*(eBands[end]-eBands[end-1]) <= 8 assures this*/ - sum /= nbBands; - /* Recursive averaging */ - sum = (sum+*average)>>1; - *average = sum; - /* Hysteresis */ - sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2; - if (sum < 80) - { - decision = SPREAD_AGGRESSIVE; - } else if (sum < 256) - { - decision = SPREAD_NORMAL; - } else if (sum < 384) - { - decision = SPREAD_LIGHT; - } else { - decision = SPREAD_NONE; - } -#ifdef FUZZING - decision = rand()&0x3; - *tapset_decision=rand()%3; -#endif - return decision; -} - -#ifdef MEASURE_NORM_MSE - -float MSE[30] = {0}; -int nbMSEBands = 0; -int MSECount[30] = {0}; - -void dump_norm_mse(void) -{ - int i; - for (i=0;inbEBands;i++) - { - int j; - int c; - float g; - if (bandE0[i]<10 || (C==2 && bandE0[i+m->nbEBands]<1)) - continue; - c=0; do { - g = bandE[i+c*m->nbEBands]/(1e-15+bandE0[i+c*m->nbEBands]); - for (j=M*m->eBands[i];jeBands[i+1];j++) - MSE[i] += (g*X[j+c*N]-X0[j+c*N])*(g*X[j+c*N]-X0[j+c*N]); - } while (++cnbEBands; -} - -#endif - -/* Indexing table for converting from natural Hadamard to ordery Hadamard - This is essentially a bit-reversed Gray, on top of which we've added - an inversion of the order because we want the DC at the end rather than - the beginning. The lines are for N=2, 4, 8, 16 */ -static const int ordery_table[] = { - 1, 0, - 3, 0, 2, 1, - 7, 0, 4, 3, 6, 1, 5, 2, - 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5, -}; - -static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard) -{ - int i,j; - VARDECL(celt_norm, tmp); - int N; - SAVE_STACK; - N = N0*stride; - ALLOC(tmp, N, celt_norm); - celt_assert(stride>0); - if (hadamard) - { - const int *ordery = ordery_table+stride-2; - for (i=0;i>= 1; - for (i=0;i>1)) { - qn = 1; - } else { - qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES)); - qn = (qn+1)>>1<<1; - } - celt_assert(qn <= 256); - return qn; -} - -/* This function is responsible for encoding and decoding a band for both - the mono and stereo case. Even in the mono case, it can split the band - in two and transmit the energy difference with the two half-bands. It - can be called recursively so bands can end up being split in 8 parts. */ -static unsigned quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_norm *Y, - int N, int b, int spread, int B, int intensity, int tf_change, celt_norm *lowband, ec_ctx *ec, - opus_int32 *remaining_bits, int LM, celt_norm *lowband_out, const celt_ener *bandE, int level, - opus_uint32 *seed, opus_val16 gain, celt_norm *lowband_scratch, int fill) -{ - const unsigned char *cache; - int q; - int curr_bits; - int stereo, split; - int imid=0, iside=0; - int N0=N; - int N_B=N; - int N_B0; - int B0=B; - int time_divide=0; - int recombine=0; - int inv = 0; - opus_val16 mid=0, side=0; - int longBlocks; - unsigned cm=0; -#ifdef RESYNTH - int resynth = 1; -#else - int resynth = !encode; -#endif - - longBlocks = B0==1; - - N_B /= B; - N_B0 = N_B; - - split = stereo = Y != NULL; - - /* Special case for one sample */ - if (N==1) - { - int c; - celt_norm *x = X; - c=0; do { - int sign=0; - if (*remaining_bits>=1<0) - recombine = tf_change; - /* Band recombining to increase frequency resolution */ - - if (lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1)) - { - int j; - for (j=0;j>k, 1<>k, 1<>4]<<2; - } - B>>=recombine; - N_B<<=recombine; - - /* Increasing the time resolution */ - while ((N_B&1) == 0 && tf_change<0) - { - #ifdef OPUS_ENABLE_ENCODER - if (encode) - haar1(X, N_B, B); - #endif - if (lowband) - haar1(lowband, N_B, B); - fill |= fill<>= 1; - time_divide++; - tf_change++; - } - B0=B; - N_B0 = N_B; - - /* Reorganize the samples in time order instead of frequency order */ - if (B0>1) - { - #ifdef OPUS_ENABLE_ENCODER - if (encode) - deinterleave_hadamard(X, N_B>>recombine, B0<>recombine, B0<cache.bits + m->cache.index[(LM+1)*m->nbEBands+i]; - if (!stereo && LM != -1 && b > cache[cache[0]]+12 && N>2) - { - N >>= 1; - Y = X+N; - split = 1; - LM -= 1; - if (B==1) - fill = (fill&1)|(fill<<1); - B = (B+1)>>1; - } - - if (split) - { - int qn; - int itheta=0; - int mbits, sbits, delta; - int qalloc; - int pulse_cap; - int offset; - int orig_fill; - opus_int32 tell; - - /* Decide on the resolution to give to the split parameter theta */ - pulse_cap = m->logN[i]+LM*(1<>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET); - qn = compute_qn(N, b, offset, pulse_cap, stereo); - if (stereo && i>=intensity) - qn = 1; - #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - /* theta is the atan() of the ratio between the (normalized) - side and mid. With just that parameter, we can re-scale both - mid and side because we know that 1) they have unit norm and - 2) they are orthogonal. */ - itheta = stereo_itheta(X, Y, stereo, N); - } - #endif - tell = ec_tell_frac(ec); - if (qn!=1) - { - #ifdef OPUS_ENABLE_ENCODER - if (encode) - itheta = (itheta*qn+8192)>>14; - #endif - - /* Entropy coding of the angle. We use a uniform pdf for the - time split, a step for stereo, and a triangular one for the rest. */ - if (stereo && N>2) - { - int p0 = 3; - int x = itheta; - int x0 = qn/2; - int ft = p0*(x0+1) + x0; - /* Use a probability of p0 up to itheta=8192 and then use 1 after */ - #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); - } else - #endif - { - int fs; - fs=ec_decode(ec,ft); - if (fs<(x0+1)*p0) - x=fs/p0; - else - x=x0+1+(fs-(x0+1)*p0); - ec_dec_update(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); - itheta = x; - } - } else if (B0>1 || stereo) { - /* Uniform pdf */ - #ifdef OPUS_ENABLE_ENCODER - if (encode) - ec_enc_uint(ec, itheta, qn+1); - else - #endif - itheta = ec_dec_uint(ec, qn+1); - } else { - int fs=1, ft; - ft = ((qn>>1)+1)*((qn>>1)+1); - #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - int fl; - - fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta; - fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 : - ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); - - ec_encode(ec, fl, fl+fs, ft); - } else - #endif - { - /* Triangular pdf */ - int fl=0; - int fm; - fm = ec_decode(ec, ft); - - if (fm < ((qn>>1)*((qn>>1) + 1)>>1)) - { - itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1; - fs = itheta + 1; - fl = itheta*(itheta + 1)>>1; - } - else - { - itheta = (2*(qn + 1) - - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1; - fs = qn + 1 - itheta; - fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); - } - - ec_dec_update(ec, fl, fl+fs, ft); - } - } - itheta = (opus_int32)itheta*16384/qn; - #ifdef OPUS_ENABLE_ENCODER - if (encode && stereo) - { - if (itheta==0) - intensity_stereo(m, X, Y, bandE, i, N); - else - stereo_split(X, Y, N); - } - #endif - /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate. - Let's do that at higher complexity */ - } else if (stereo) { - #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - inv = itheta > 8192; - if (inv) - { - int j; - for (j=0;j2< 2< 8192; - *remaining_bits -= qalloc+sbits; - - x2 = c ? Y : X; - y2 = c ? X : Y; - if (sbits) - { - #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - /* Here we only need to encode a sign for the side */ - sign = x2[0]*y2[1] - x2[1]*y2[0] < 0; - ec_enc_bits(ec, sign, 1); - } else - #endif - { - sign = ec_dec_bits(ec, 1); - } - } - sign = 1-2*sign; - /* We use orig_fill here because we want to fold the side, but if - itheta==16384, we'll have cleared the low bits of fill. */ - cm = quant_band(encode, m, i, x2, NULL, N, mbits, spread, B, intensity, tf_change, lowband, ec, remaining_bits, LM, lowband_out, NULL, level, seed, gain, lowband_scratch, orig_fill); - /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), - and there's no need to worry about mixing with the other channel. */ - y2[0] = -sign*x2[1]; - y2[1] = sign*x2[0]; - if (resynth) - { - celt_norm tmp; - X[0] = MULT16_16_Q15(mid, X[0]); - X[1] = MULT16_16_Q15(mid, X[1]); - Y[0] = MULT16_16_Q15(side, Y[0]); - Y[1] = MULT16_16_Q15(side, Y[1]); - tmp = X[0]; - X[0] = SUB16(tmp,Y[0]); - Y[0] = ADD16(tmp,Y[0]); - tmp = X[1]; - X[1] = SUB16(tmp,Y[1]); - Y[1] = ADD16(tmp,Y[1]); - } - } else { - /* "Normal" split code */ - celt_norm *next_lowband2=NULL; - celt_norm *next_lowband_out1=NULL; - int next_level=0; - opus_int32 rebalance; - - /* Give more bits to low-energy MDCTs than they would otherwise deserve */ - if (B0>1 && !stereo && (itheta&0x3fff)) - { - if (itheta > 8192) - /* Rough approximation for pre-echo masking */ - delta -= delta>>(4-LM); - else - /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */ - delta = IMIN(0, delta + (N<>(5-LM))); - } - mbits = IMAX(0, IMIN(b, (b-delta)/2)); - sbits = b-mbits; - *remaining_bits -= qalloc; - - if (lowband && !stereo) - next_lowband2 = lowband+N; /* >32-bit split case */ - - /* Only stereo needs to pass on lowband_out. Otherwise, it's - handled at the end */ - if (stereo) - next_lowband_out1 = lowband_out; - else - next_level = level+1; - - rebalance = *remaining_bits; - if (mbits >= sbits) - { - /* In stereo mode, we do not apply a scaling to the mid because we need the normalized - mid for folding later */ - cm = quant_band(encode, m, i, X, NULL, N, mbits, spread, B, intensity, tf_change, - lowband, ec, remaining_bits, LM, next_lowband_out1, - NULL, next_level, seed, stereo ? Q15ONE : MULT16_16_P15(gain,mid), lowband_scratch, fill); - rebalance = mbits - (rebalance-*remaining_bits); - if (rebalance > 3<>B)<<((B0>>1)&(stereo-1)); - } else { - /* For a stereo split, the high bits of fill are always zero, so no - folding will be done to the side. */ - cm = quant_band(encode, m, i, Y, NULL, N, sbits, spread, B, intensity, tf_change, - next_lowband2, ec, remaining_bits, LM, NULL, - NULL, next_level, seed, MULT16_16_P15(gain,side), NULL, fill>>B)<<((B0>>1)&(stereo-1)); - rebalance = sbits - (rebalance-*remaining_bits); - if (rebalance > 3< 0) - { - *remaining_bits += curr_bits; - q--; - curr_bits = pulses2bits(m, i, LM, q); - *remaining_bits -= curr_bits; - } - - if (q!=0) - { - int K = get_pulses(q); - - /* Finally do the actual quantization */ - #ifdef OPUS_ENABLE_ENCODER - if (encode) - { - cm = alg_quant(X, N, K, spread, B, ec -#ifdef RESYNTH - , gain -#endif - ); - } else - #endif - { - cm = alg_unquant(X, N, K, spread, B, ec, gain); - } - } else { - /* If there's no pulse, fill the band anyway */ - int j; - if (resynth) - { - unsigned cm_mask; - /*B can be as large as 16, so this shift might overflow an int on a - 16-bit platform; use a long to get defined behavior.*/ - cm_mask = (unsigned)(1UL<>20); - } - cm = cm_mask; - } else { - /* Folded spectrum */ - for (j=0;j1) - interleave_hadamard(X, N_B>>recombine, B0<>= 1; - N_B <<= 1; - cm |= cm>>B; - haar1(X, N_B, B); - } - - for (k=0;k>k, 1<eBands; - celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; - VARDECL(celt_norm, _norm); - VARDECL(celt_norm, lowband_scratch); - int B; - int M; - int lowband_offset; - int update_lowband = 1; - int C = Y_ != NULL ? 2 : 1; -#ifdef RESYNTH - int resynth = 1; -#else - int resynth = !encode; -#endif - SAVE_STACK; - - M = 1<nbEBands], celt_norm); - ALLOC(lowband_scratch, M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]), celt_norm); - norm = _norm; - norm2 = norm + M*eBands[m->nbEBands]; - - lowband_offset = 0; - for (i=start;i= M*eBands[start] && (update_lowband || lowband_offset==0)) - lowband_offset = i; - - tf_change = tf_res[i]; - if (i>=m->effEBands) - { - X=norm; - if (Y_!=NULL) - Y = norm; - } - - /* Get a conservative estimate of the collapse_mask's for the bands we're - going to be folding from. */ - if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0)) - { - int fold_start; - int fold_end; - int fold_i; - /* This ensures we never repeat spectral content within one band */ - effective_lowband = IMAX(M*eBands[start], M*eBands[lowband_offset]-N); - fold_start = lowband_offset; - while(M*eBands[--fold_start] > effective_lowband); - fold_end = lowband_offset-1; - while(M*eBands[++fold_end] < effective_lowband+N); - x_cm = y_cm = 0; - fold_i = fold_start; do { - x_cm |= collapse_masks[fold_i*C+0]; - y_cm |= collapse_masks[fold_i*C+C-1]; - } while (++fold_i(N< -#include "celt.h" -#include "pitch.h" -#include "bands.h" -#include "modes.h" -#include "entcode.h" -#include "quant_bands.h" -#include "rate.h" -#include "stack_alloc.h" -#include "mathops.h" -#include "float_cast.h" -#include -#include "celt_lpc.h" -#include "vq.h" - -#ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "unknown" -#endif - -#ifdef CUSTOM_MODES -#define OPUS_CUSTOM_NOSTATIC -#else -#define OPUS_CUSTOM_NOSTATIC static inline -#endif - -static const unsigned char trim_icdf[11] = {126, 124, 119, 109, 87, 41, 19, 9, 4, 2, 0}; -/* Probs: NONE: 21.875%, LIGHT: 6.25%, NORMAL: 65.625%, AGGRESSIVE: 6.25% */ -static const unsigned char spread_icdf[4] = {25, 23, 2, 0}; - -static const unsigned char tapset_icdf[3]={2,1,0}; - -#ifdef CUSTOM_MODES -static const unsigned char toOpusTable[20] = { - 0xE0, 0xE8, 0xF0, 0xF8, - 0xC0, 0xC8, 0xD0, 0xD8, - 0xA0, 0xA8, 0xB0, 0xB8, - 0x00, 0x00, 0x00, 0x00, - 0x80, 0x88, 0x90, 0x98, -}; - -static const unsigned char fromOpusTable[16] = { - 0x80, 0x88, 0x90, 0x98, - 0x40, 0x48, 0x50, 0x58, - 0x20, 0x28, 0x30, 0x38, - 0x00, 0x08, 0x10, 0x18 -}; - -static inline int toOpus(unsigned char c) -{ - int ret=0; - if (c<0xA0) - ret = toOpusTable[c>>3]; - if (ret == 0) - return -1; - else - return ret|(c&0x7); -} - -static inline int fromOpus(unsigned char c) -{ - if (c<0x80) - return -1; - else - return fromOpusTable[(c>>3)-16] | (c&0x7); -} -#endif /* CUSTOM_MODES */ - -#define COMBFILTER_MAXPERIOD 1024 -#define COMBFILTER_MINPERIOD 15 - -static int resampling_factor(opus_int32 rate) -{ - int ret; - switch (rate) - { - case 48000: - ret = 1; - break; - case 24000: - ret = 2; - break; - case 16000: - ret = 3; - break; - case 12000: - ret = 4; - break; - case 8000: - ret = 6; - break; - default: -#ifndef CUSTOM_MODES - celt_assert(0); -#endif - ret = 0; - break; - } - return ret; -} - -#ifdef OPUS_ENABLE_ENCODER -/** Encoder state - @brief Encoder state - */ -struct OpusCustomEncoder { - const OpusCustomMode *mode; /**< Mode used by the encoder */ - int overlap; - int channels; - int stream_channels; - - int force_intra; - int clip; - int disable_pf; - int complexity; - int upsample; - int start, end; - - opus_int32 bitrate; - int vbr; - int signalling; - int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */ - int loss_rate; - int lsb_depth; - - /* Everything beyond this point gets cleared on a reset */ -#define ENCODER_RESET_START rng - - opus_uint32 rng; - int spread_decision; - opus_val32 delayedIntra; - int tonal_average; - int lastCodedBands; - int hf_average; - int tapset_decision; - - int prefilter_period; - opus_val16 prefilter_gain; - int prefilter_tapset; -#ifdef RESYNTH - int prefilter_period_old; - opus_val16 prefilter_gain_old; - int prefilter_tapset_old; -#endif - int consec_transient; - - opus_val32 preemph_memE[2]; - opus_val32 preemph_memD[2]; - - /* VBR-related parameters */ - opus_int32 vbr_reservoir; - opus_int32 vbr_drift; - opus_int32 vbr_offset; - opus_int32 vbr_count; - -#ifdef RESYNTH - celt_sig syn_mem[2][2*MAX_PERIOD]; -#endif - - celt_sig in_mem[1]; /* Size = channels*mode->overlap */ - /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_MAXPERIOD */ - /* opus_val16 oldBandE[], Size = channels*mode->nbEBands */ - /* opus_val16 oldLogE[], Size = channels*mode->nbEBands */ - /* opus_val16 oldLogE2[], Size = channels*mode->nbEBands */ -#ifdef RESYNTH - /* opus_val16 overlap_mem[], Size = channels*overlap */ -#endif -}; - -int celt_encoder_get_size(int channels) -{ - CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); - return opus_custom_encoder_get_size(mode, channels); -} - -OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels) -{ - int size = sizeof(struct CELTEncoder) - + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[channels*mode->overlap]; */ - + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */ - + 3*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */ - /* opus_val16 oldLogE[channels*mode->nbEBands]; */ - /* opus_val16 oldLogE2[channels*mode->nbEBands]; */ -#ifdef RESYNTH - size += channels*mode->overlap*sizeof(celt_sig); /* celt_sig overlap_mem[channels*mode->nbEBands]; */ -#endif - return size; -} - -#ifdef CUSTOM_MODES -CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int *error) -{ - int ret; - CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode, channels)); - /* init will handle the NULL case */ - ret = opus_custom_encoder_init(st, mode, channels); - if (ret != OPUS_OK) - { - opus_custom_encoder_destroy(st); - st = NULL; - } - if (error) - *error = ret; - return st; -} -#endif /* CUSTOM_MODES */ - -int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels) -{ - int ret; - ret = opus_custom_encoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels); - if (ret != OPUS_OK) - return ret; - st->upsample = resampling_factor(sampling_rate); - return OPUS_OK; -} - -OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels) -{ - if (channels < 0 || channels > 2) - return OPUS_BAD_ARG; - - if (st==NULL || mode==NULL) - return OPUS_ALLOC_FAIL; - - OPUS_CLEAR((char*)st, opus_custom_encoder_get_size(mode, channels)); - - st->mode = mode; - st->overlap = mode->overlap; - st->stream_channels = st->channels = channels; - - st->upsample = 1; - st->start = 0; - st->end = st->mode->effEBands; - st->signalling = 1; - - st->constrained_vbr = 1; - st->clip = 1; - - st->bitrate = OPUS_BITRATE_MAX; - st->vbr = 0; - st->force_intra = 0; - st->complexity = 5; - st->lsb_depth=24; - - opus_custom_encoder_ctl(st, OPUS_RESET_STATE); - - return OPUS_OK; -} -#endif /* OPUS_ENABLE_ENCODER */ - -#ifdef CUSTOM_MODES -void opus_custom_encoder_destroy(CELTEncoder *st) -{ - opus_free(st); -} -#endif /* CUSTOM_MODES */ - -static inline opus_val16 SIG2WORD16(celt_sig x) -{ -#ifdef FIXED_POINT - x = PSHR32(x, SIG_SHIFT); - x = MAX32(x, -32768); - x = MIN32(x, 32767); - return EXTRACT16(x); -#else - return (opus_val16)x; -#endif -} - -#ifdef OPUS_ENABLE_ENCODER -static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C, - int overlap) -{ - int i; - VARDECL(opus_val16, tmp); - opus_val32 mem0=0,mem1=0; - int is_transient = 0; - int block; - int N; - VARDECL(opus_val16, bins); - SAVE_STACK; - ALLOC(tmp, len, opus_val16); - - block = overlap/2; - N=len/block; - ALLOC(bins, N, opus_val16); - if (C==1) - { - for (i=0;i=3) - is_transient=1; - conseq = 0; - for (j=i+1;j=7) - is_transient=1; - } - RESTORE_STACK; -#ifdef FUZZING - is_transient = rand()&0x1; -#endif - return is_transient; -} - -/** Apply window and compute the MDCT for all sub-frames and - all channels in a frame */ -static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * OPUS_RESTRICT in, celt_sig * OPUS_RESTRICT out, int C, int LM) -{ - if (C==1 && !shortBlocks) - { - const int overlap = OVERLAP(mode); - clt_mdct_forward(&mode->mdct, in, out, mode->window, overlap, mode->maxLM-LM, 1); - } else { - const int overlap = OVERLAP(mode); - int N = mode->shortMdctSize<shortMdctSize; - B = shortBlocks; - } - c=0; do { - for (b=0;bmdct, in+c*(B*N+overlap)+b*N, &out[b+c*N*B], mode->window, overlap, shortBlocks ? mode->maxLM : mode->maxLM-LM, B); - } - } while (++cshortMdctSize<shortMdctSize; - B = shortBlocks; - } - /* Prevents problems from the imdct doing the overlap-add */ - OPUS_CLEAR(x, overlap); - - for (b=0;bmdct, &X[b+c*N2*B], x+N2*b, mode->window, overlap, shortBlocks ? mode->maxLM : mode->maxLM-LM, B); - } - - for (j=0;j>LM;j++) - L2 = MAC16_16(L2, tmp[(j<eBands[len]-m->eBands[len-1])<eBands[i+1]-m->eBands[i])<eBands[i]<eBands[i]<>LM); - best_L1 = L1; - /*printf ("%f ", L1);*/ - for (k=0;k>(LM-k), 1<<(LM-k)); - else - haar1(tmp, N>>k, 1<>LM); - - if (L1 < best_L1) - { - best_L1 = L1; - best_level = k+1; - } - } - /*printf ("%d ", isTransient ? LM-best_level : best_level);*/ - if (isTransient) - metric[i] = best_level; - else - metric[i] = -best_level; - *tf_sum += metric[i]; - } - /*printf("\n");*/ - /* NOTE: Future optimized implementations could detect extreme transients and set - tf_select = 1 but so far we have not found a reliable way of making this useful */ - tf_select = 0; - - cost0 = 0; - cost1 = isTransient ? 0 : lambda; - /* Viterbi forward pass */ - for (i=1;i=0;i--) - { - if (tf_res[i+1] == 1) - tf_res[i] = path1[i+1]; - else - tf_res[i] = path0[i+1]; - } - RESTORE_STACK; -#ifdef FUZZING - tf_select = rand()&0x1; - tf_res[0] = rand()&0x1; - for (i=1;istorage*8; - tell = ec_tell(enc); - logp = isTransient ? 2 : 4; - /* Reserve space to code the tf_select decision. */ - tf_select_rsv = LM>0 && tell+logp+1 <= budget; - budget -= tf_select_rsv; - curr = tf_changed = 0; - for (i=start;istorage*8; - tell = ec_tell(dec); - logp = isTransient ? 2 : 4; - tf_select_rsv = LM>0 && tell+logp+1<=budget; - budget -= tf_select_rsv; - tf_changed = curr = 0; - for (i=start;inbEBands;i++) - { - int N; - N=(m->eBands[i+1]-m->eBands[i])<cache.caps[m->nbEBands*(2*LM+C-1)+i]+64)*C*N>>2; - } -} - -#ifdef OPUS_ENABLE_ENCODER -static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X, - const opus_val16 *bandLogE, int end, int LM, int C, int N0) -{ - int i; - opus_val32 diff=0; - int c; - int trim_index = 5; - if (C==2) - { - opus_val16 sum = 0; /* Q10 */ - /* Compute inter-channel correlation for low frequencies */ - for (i=0;i<8;i++) - { - int j; - opus_val32 partial = 0; - for (j=m->eBands[i]<eBands[i+1]< QCONST16(.995f,10)) - trim_index-=4; - else if (sum > QCONST16(.92f,10)) - trim_index-=3; - else if (sum > QCONST16(.85f,10)) - trim_index-=2; - else if (sum > QCONST16(.8f,10)) - trim_index-=1; - } - - /* Estimate spectral tilt */ - c=0; do { - for (i=0;inbEBands]*(opus_int32)(2+2*i-m->nbEBands); - } - } while (++c QCONST16(2.f, DB_SHIFT)) - trim_index--; - if (diff > QCONST16(8.f, DB_SHIFT)) - trim_index--; - if (diff < -QCONST16(4.f, DB_SHIFT)) - trim_index++; - if (diff < -QCONST16(10.f, DB_SHIFT)) - trim_index++; - - if (trim_index<0) - trim_index = 0; - if (trim_index>10) - trim_index = 10; -#ifdef FUZZING - trim_index = rand()%11; -#endif - return trim_index; -} - -static int stereo_analysis(const CELTMode *m, const celt_norm *X, - int LM, int N0) -{ - int i; - int thetas; - opus_val32 sumLR = EPSILON, sumMS = EPSILON; - - /* Use the L1 norm to model the entropy of the L/R signal vs the M/S signal */ - for (i=0;i<13;i++) - { - int j; - for (j=m->eBands[i]<eBands[i+1]<eBands[13]<<(LM+1))+thetas, sumMS) - > MULT16_32_Q15(m->eBands[13]<<(LM+1), sumLR); -} - -int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc) -{ - int i, c, N; - opus_int32 bits; - ec_enc _enc; - VARDECL(celt_sig, in); - VARDECL(celt_sig, freq); - VARDECL(celt_norm, X); - VARDECL(celt_ener, bandE); - VARDECL(opus_val16, bandLogE); - VARDECL(int, fine_quant); - VARDECL(opus_val16, error); - VARDECL(int, pulses); - VARDECL(int, cap); - VARDECL(int, offsets); - VARDECL(int, fine_priority); - VARDECL(int, tf_res); - VARDECL(unsigned char, collapse_masks); - celt_sig *prefilter_mem; - opus_val16 *oldBandE, *oldLogE, *oldLogE2; - int shortBlocks=0; - int isTransient=0; - const int CC = st->channels; - const int C = st->stream_channels; - int LM, M; - int tf_select; - int nbFilledBytes, nbAvailableBytes; - int effEnd; - int codedBands; - int tf_sum; - int alloc_trim; - int pitch_index=COMBFILTER_MINPERIOD; - opus_val16 gain1 = 0; - int intensity=0; - int dual_stereo=0; - int effectiveBytes; - opus_val16 pf_threshold; - int dynalloc_logp; - opus_int32 vbr_rate; - opus_int32 total_bits; - opus_int32 total_boost; - opus_int32 balance; - opus_int32 tell; - int prefilter_tapset=0; - int pf_on; - int anti_collapse_rsv; - int anti_collapse_on=0; - int silence=0; - ALLOC_STACK; - - if (nbCompressedBytes<2 || pcm==NULL) - return OPUS_BAD_ARG; - - frame_size *= st->upsample; - for (LM=0;LM<=st->mode->maxLM;LM++) - if (st->mode->shortMdctSize<st->mode->maxLM) - return OPUS_BAD_ARG; - M=1<mode->shortMdctSize; - - prefilter_mem = st->in_mem+CC*(st->overlap); - oldBandE = (opus_val16*)(st->in_mem+CC*(st->overlap+COMBFILTER_MAXPERIOD)); - oldLogE = oldBandE + CC*st->mode->nbEBands; - oldLogE2 = oldLogE + CC*st->mode->nbEBands; - - if (enc==NULL) - { - tell=1; - nbFilledBytes=0; - } else { - tell=ec_tell(enc); - nbFilledBytes=(tell+4)>>3; - } - -#ifdef CUSTOM_MODES - if (st->signalling && enc==NULL) - { - int tmp = (st->mode->effEBands-st->end)>>1; - st->end = IMAX(1, st->mode->effEBands-tmp); - compressed[0] = tmp<<5; - compressed[0] |= LM<<3; - compressed[0] |= (C==2)<<2; - /* Convert "standard mode" to Opus header */ - if (st->mode->Fs==48000 && st->mode->shortMdctSize==120) - { - int c0 = toOpus(compressed[0]); - if (c0<0) - return OPUS_BAD_ARG; - compressed[0] = c0; - } - compressed++; - nbCompressedBytes--; - } -#else - celt_assert(st->signalling==0); -#endif - - /* Can't produce more than 1275 output bytes */ - nbCompressedBytes = IMIN(nbCompressedBytes,1275); - nbAvailableBytes = nbCompressedBytes - nbFilledBytes; - - if (st->vbr && st->bitrate!=OPUS_BITRATE_MAX) - { - opus_int32 den=st->mode->Fs>>BITRES; - vbr_rate=(st->bitrate*frame_size+(den>>1))/den; -#ifdef CUSTOM_MODES - if (st->signalling) - vbr_rate -= 8<>(3+BITRES); - } else { - opus_int32 tmp; - vbr_rate = 0; - tmp = st->bitrate*frame_size; - if (tell>1) - tmp += tell; - if (st->bitrate!=OPUS_BITRATE_MAX) - nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes, - (tmp+4*st->mode->Fs)/(8*st->mode->Fs)-!!st->signalling)); - effectiveBytes = nbCompressedBytes; - } - - if (enc==NULL) - { - ec_enc_init(&_enc, compressed, nbCompressedBytes); - enc = &_enc; - } - - if (vbr_rate>0) - { - /* Computes the max bit-rate allowed in VBR mode to avoid violating the - target rate and buffering. - We must do this up front so that bust-prevention logic triggers - correctly if we don't have enough bits. */ - if (st->constrained_vbr) - { - opus_int32 vbr_bound; - opus_int32 max_allowed; - /* We could use any multiple of vbr_rate as bound (depending on the - delay). - This is clamped to ensure we use at least two bytes if the encoder - was entirely empty, but to allow 0 in hybrid mode. */ - vbr_bound = vbr_rate; - max_allowed = IMIN(IMAX(tell==1?2:0, - (vbr_rate+vbr_bound-st->vbr_reservoir)>>(BITRES+3)), - nbAvailableBytes); - if(max_allowed < nbAvailableBytes) - { - nbCompressedBytes = nbFilledBytes+max_allowed; - nbAvailableBytes = max_allowed; - ec_enc_shrink(enc, nbCompressedBytes); - } - } - } - total_bits = nbCompressedBytes*8; - - effEnd = st->end; - if (effEnd > st->mode->effEBands) - effEnd = st->mode->effEBands; - - ALLOC(in, CC*(N+st->overlap), celt_sig); - - /* Find pitch period and gain */ - { - VARDECL(celt_sig, _pre); - celt_sig *pre[2]; - SAVE_STACK; - ALLOC(_pre, CC*(N+COMBFILTER_MAXPERIOD), celt_sig); - - pre[0] = _pre; - pre[1] = _pre + (N+COMBFILTER_MAXPERIOD); - - silence = 1; - c=0; do { - int count = 0; - const opus_val16 * OPUS_RESTRICT pcmp = pcm+c; - celt_sig * OPUS_RESTRICT inp = in+c*(N+st->overlap)+st->overlap; - - for (i=0;iclip) - x = MAX32(-65536.f, MIN32(65536.f,x)); -#endif - if (++count==st->upsample) - { - count=0; - pcmp+=CC; - } else { - x = 0; - } - /* Apply pre-emphasis */ - tmp = MULT16_16(st->mode->preemph[2], x); - *inp = tmp + st->preemph_memE[c]; - st->preemph_memE[c] = MULT16_32_Q15(st->mode->preemph[1], *inp) - - MULT16_32_Q15(st->mode->preemph[0], tmp); - silence = silence && *inp == 0; - inp++; - } - OPUS_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD); - OPUS_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N); - } while (++c0) - { - effectiveBytes=nbCompressedBytes=IMIN(nbCompressedBytes, nbFilledBytes+2); - total_bits=nbCompressedBytes*8; - nbAvailableBytes=2; - ec_enc_shrink(enc, nbCompressedBytes); - } - /* Pretend we've filled all the remaining bits with zeros - (that's what the initialiser did anyway) */ - tell = nbCompressedBytes*8; - enc->nbits_total+=tell-ec_tell(enc); - } - if (nbAvailableBytes>12*C && st->start==0 && !silence && !st->disable_pf && st->complexity >= 5) - { - VARDECL(opus_val16, pitch_buf); - ALLOC(pitch_buf, (COMBFILTER_MAXPERIOD+N)>>1, opus_val16); - - pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC); - pitch_search(pitch_buf+(COMBFILTER_MAXPERIOD>>1), pitch_buf, N, - COMBFILTER_MAXPERIOD-COMBFILTER_MINPERIOD, &pitch_index); - pitch_index = COMBFILTER_MAXPERIOD-pitch_index; - - gain1 = remove_doubling(pitch_buf, COMBFILTER_MAXPERIOD, COMBFILTER_MINPERIOD, - N, &pitch_index, st->prefilter_period, st->prefilter_gain); - if (pitch_index > COMBFILTER_MAXPERIOD-2) - pitch_index = COMBFILTER_MAXPERIOD-2; - gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1); - if (st->loss_rate>2) - gain1 = HALF32(gain1); - if (st->loss_rate>4) - gain1 = HALF32(gain1); - if (st->loss_rate>8) - gain1 = 0; - prefilter_tapset = st->tapset_decision; - } else { - gain1 = 0; - } - - /* Gain threshold for enabling the prefilter/postfilter */ - pf_threshold = QCONST16(.2f,15); - - /* Adjusting the threshold based on rate and continuity */ - if (abs(pitch_index-st->prefilter_period)*10>pitch_index) - pf_threshold += QCONST16(.2f,15); - if (nbAvailableBytes<25) - pf_threshold += QCONST16(.1f,15); - if (nbAvailableBytes<35) - pf_threshold += QCONST16(.1f,15); - if (st->prefilter_gain > QCONST16(.4f,15)) - pf_threshold -= QCONST16(.1f,15); - if (st->prefilter_gain > QCONST16(.55f,15)) - pf_threshold -= QCONST16(.1f,15); - - /* Hard threshold at 0.2 */ - pf_threshold = MAX16(pf_threshold, QCONST16(.2f,15)); - if (gain1start==0 && tell+16<=total_bits) - ec_enc_bit_logp(enc, 0, 1); - gain1 = 0; - pf_on = 0; - } else { - /*This block is not gated by a total bits check only because - of the nbAvailableBytes check above.*/ - int qg; - int octave; - - if (ABS16(gain1-st->prefilter_gain)prefilter_gain; - -#ifdef FIXED_POINT - qg = ((gain1+1536)>>10)/3-1; -#else - qg = (int)floor(.5f+gain1*32/3)-1; -#endif - qg = IMAX(0, IMIN(7, qg)); - ec_enc_bit_logp(enc, 1, 1); - pitch_index += 1; - octave = EC_ILOG(pitch_index)-5; - ec_enc_uint(enc, octave, 6); - ec_enc_bits(enc, pitch_index-(16<mode->shortMdctSize-st->mode->overlap; - st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); - OPUS_COPY(in+c*(N+st->overlap), st->in_mem+c*(st->overlap), st->overlap); - if (offset) - comb_filter(in+c*(N+st->overlap)+st->overlap, pre[c]+COMBFILTER_MAXPERIOD, - st->prefilter_period, st->prefilter_period, offset, -st->prefilter_gain, -st->prefilter_gain, - st->prefilter_tapset, st->prefilter_tapset, NULL, 0); - - comb_filter(in+c*(N+st->overlap)+st->overlap+offset, pre[c]+COMBFILTER_MAXPERIOD+offset, - st->prefilter_period, pitch_index, N-offset, -st->prefilter_gain, -gain1, - st->prefilter_tapset, prefilter_tapset, st->mode->window, st->mode->overlap); - OPUS_COPY(st->in_mem+c*(st->overlap), in+c*(N+st->overlap)+N, st->overlap); - - if (N>COMBFILTER_MAXPERIOD) - { - OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD); - } else { - OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N); - OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N); - } - } while (++c0 && ec_tell(enc)+3<=total_bits) - { - if (st->complexity > 1) - { - isTransient = transient_analysis(in, N+st->overlap, CC, - st->overlap); - if (isTransient) - shortBlocks = M; - } - ec_enc_bit_logp(enc, isTransient, 3); - } - - ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */ - ALLOC(bandE,st->mode->nbEBands*CC, celt_ener); - ALLOC(bandLogE,st->mode->nbEBands*CC, opus_val16); - /* Compute MDCTs */ - compute_mdcts(st->mode, shortBlocks, in, freq, CC, LM); - - if (CC==2&&C==1) - { - for (i=0;iupsample != 1) - { - c=0; do - { - int bound = N/st->upsample; - for (i=0;iupsample; - for (;imode, freq, bandE, effEnd, C, M); - - amp2Log2(st->mode, effEnd, st->end, bandE, bandLogE, C); - - /* Band normalisation */ - normalise_bands(st->mode, freq, X, bandE, effEnd, C, M); - - ALLOC(tf_res, st->mode->nbEBands, int); - tf_select = tf_analysis(st->mode, effEnd, C, isTransient, tf_res, effectiveBytes, X, N, LM, st->start, &tf_sum); - for (i=effEnd;iend;i++) - tf_res[i] = tf_res[effEnd-1]; - - ALLOC(error, C*st->mode->nbEBands, opus_val16); - quant_coarse_energy(st->mode, st->start, st->end, effEnd, bandLogE, - oldBandE, total_bits, error, enc, - C, LM, nbAvailableBytes, st->force_intra, - &st->delayedIntra, st->complexity >= 4, st->loss_rate); - - tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc); - - if (ec_tell(enc)+4<=total_bits) - { - if (shortBlocks || st->complexity < 3 - || nbAvailableBytes < 10*C || st->start!=0) - { - if (st->complexity == 0) - st->spread_decision = SPREAD_NONE; - else - st->spread_decision = SPREAD_NORMAL; - } else { - st->spread_decision = spreading_decision(st->mode, X, - &st->tonal_average, st->spread_decision, &st->hf_average, - &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M); - } - ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5); - } - - ALLOC(cap, st->mode->nbEBands, int); - ALLOC(offsets, st->mode->nbEBands, int); - - init_caps(st->mode,cap,LM,C); - for (i=0;imode->nbEBands;i++) - offsets[i] = 0; - /* Dynamic allocation code */ - /* Make sure that dynamic allocation can't make us bust the budget */ - if (effectiveBytes > 50 && LM>=1) - { - int t1, t2; - if (LM <= 1) - { - t1 = 3; - t2 = 5; - } else { - t1 = 2; - t2 = 4; - } - for (i=st->start+1;iend-1;i++) - { - opus_val32 d2; - d2 = 2*bandLogE[i]-bandLogE[i-1]-bandLogE[i+1]; - if (C==2) - d2 = HALF32(d2 + 2*bandLogE[i+st->mode->nbEBands]- - bandLogE[i-1+st->mode->nbEBands]-bandLogE[i+1+st->mode->nbEBands]); -#ifdef FUZZING - if((rand()&0xF)==0) - { - offsets[i] += 1; - if((rand()&0x3)==0) - offsets[i] += 1+(rand()&0x3); - } -#else - if (d2 > SHL16(t1,DB_SHIFT)) - offsets[i] += 1; - if (d2 > SHL16(t2,DB_SHIFT)) - offsets[i] += 1; -#endif - } - } - dynalloc_logp = 6; - total_bits<<=BITRES; - total_boost = 0; - tell = ec_tell_frac(enc); - for (i=st->start;iend;i++) - { - int width, quanta; - int dynalloc_loop_logp; - int boost; - int j; - width = C*(st->mode->eBands[i+1]-st->mode->eBands[i])<mode, X, bandLogE, - st->end, LM, C, N); - ec_enc_icdf(enc, alloc_trim, trim_icdf, 7); - tell = ec_tell_frac(enc); - } - - /* Variable bitrate */ - if (vbr_rate>0) - { - opus_val16 alpha; - opus_int32 delta; - /* The target rate in 8th bits per frame */ - opus_int32 target; - opus_int32 min_allowed; - int lm_diff = st->mode->maxLM - LM; - - /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms. - The CELT allocator will just not be able to use more than that anyway. */ - nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM)); - target = vbr_rate + (st->vbr_offset>>lm_diff) - ((40*C+20)<end-st->start)) - target = 7*target/4; - else if (tf_sum < -(st->end-st->start)) - target = 3*target/2; - else if (M > 1) - target-=(target+14)/28; - - /* The current offset is removed from the target and the space used - so far is added*/ - target=target+tell; - - /* In VBR mode the frame size must not be reduced so much that it would - result in the encoder running out of bits. - The margin of 2 bytes ensures that none of the bust-prevention logic - in the decoder will have triggered so far. */ - min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2 - nbFilledBytes; - - nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3); - nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes); - nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes) - nbFilledBytes; - - /* By how much did we "miss" the target on that frame */ - delta = target - vbr_rate; - - target=nbAvailableBytes<<(BITRES+3); - - /*If the frame is silent we don't adjust our drift, otherwise - the encoder will shoot to very high rates after hitting a - span of silence, but we do allow the bitres to refill. - This means that we'll undershoot our target in CVBR/VBR modes - on files with lots of silence. */ - if(silence) - { - nbAvailableBytes = 2; - target = 2*8<vbr_count < 970) - { - st->vbr_count++; - alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+20),16)); - } else - alpha = QCONST16(.001f,15); - /* How many bits have we used in excess of what we're allowed */ - if (st->constrained_vbr) - st->vbr_reservoir += target - vbr_rate; - /*printf ("%d\n", st->vbr_reservoir);*/ - - /* Compute the offset we need to apply in order to reach the target */ - st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,(delta*(1<vbr_offset-st->vbr_drift); - st->vbr_offset = -st->vbr_drift; - /*printf ("%d\n", st->vbr_drift);*/ - - if (st->constrained_vbr && st->vbr_reservoir < 0) - { - /* We're under the min value -- increase rate */ - int adjust = (-st->vbr_reservoir)/(8<vbr_reservoir = 0; - /*printf ("+%d\n", adjust);*/ - } - nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes); - /* This moves the raw bits to take into account the new compressed size */ - ec_enc_shrink(enc, nbCompressedBytes); - } - if (C==2) - { - int effectiveRate; - - /* Always use MS for 2.5 ms frames until we can do a better analysis */ - if (LM!=0) - dual_stereo = stereo_analysis(st->mode, X, LM, N); - - /* Account for coarse energy */ - effectiveRate = (8*effectiveBytes - 80)>>LM; - - /* effectiveRate in kb/s */ - effectiveRate = 2*effectiveRate/5; - if (effectiveRate<35) - intensity = 8; - else if (effectiveRate<50) - intensity = 12; - else if (effectiveRate<68) - intensity = 16; - else if (effectiveRate<84) - intensity = 18; - else if (effectiveRate<102) - intensity = 19; - else if (effectiveRate<130) - intensity = 20; - else - intensity = 100; - intensity = IMIN(st->end,IMAX(st->start, intensity)); - } - - /* Bit allocation */ - ALLOC(fine_quant, st->mode->nbEBands, int); - ALLOC(pulses, st->mode->nbEBands, int); - ALLOC(fine_priority, st->mode->nbEBands, int); - - /* bits = packet size - where we are - safety*/ - bits = (((opus_int32)nbCompressedBytes*8)<=2&&bits>=((LM+2)<mode, st->start, st->end, offsets, cap, - alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, - fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands); - st->lastCodedBands = codedBands; - - quant_fine_energy(st->mode, st->start, st->end, oldBandE, error, fine_quant, enc, C); - -#ifdef MEASURE_NORM_MSE - float X0[3000]; - float bandE0[60]; - c=0; do - for (i=0;imode->nbEBands;i++) - bandE0[i] = bandE[i]; -#endif - - /* Residual quantisation */ - ALLOC(collapse_masks, C*st->mode->nbEBands, unsigned char); - quant_all_bands(1, st->mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks, - bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, intensity, tf_res, - nbCompressedBytes*(8<rng); - - if (anti_collapse_rsv > 0) - { - anti_collapse_on = st->consec_transient<2; -#ifdef FUZZING - anti_collapse_on = rand()&0x1; -#endif - ec_enc_bits(enc, anti_collapse_on, 1); - } - quant_energy_finalise(st->mode, st->start, st->end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C); - - if (silence) - { - for (i=0;imode->nbEBands;i++) - oldBandE[i] = -QCONST16(28.f,DB_SHIFT); - } - -#ifdef RESYNTH - /* Re-synthesis of the coded audio if required */ - { - celt_sig *out_mem[2]; - celt_sig *overlap_mem[2]; - - log2Amp(st->mode, st->start, st->end, bandE, oldBandE, C); - if (silence) - { - for (i=0;imode->nbEBands;i++) - bandE[i] = 0; - } - -#ifdef MEASURE_NORM_MSE - measure_norm_mse(st->mode, X, X0, bandE, bandE0, M, N, C); -#endif - if (anti_collapse_on) - { - anti_collapse(st->mode, X, collapse_masks, LM, C, N, - st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); - } - - /* Synthesis */ - denormalise_bands(st->mode, X, freq, bandE, effEnd, C, M); - - OPUS_MOVE(st->syn_mem[0], st->syn_mem[0]+N, MAX_PERIOD); - if (CC==2) - OPUS_MOVE(st->syn_mem[1], st->syn_mem[1]+N, MAX_PERIOD); - - c=0; do - for (i=0;imode->eBands[st->start];i++) - freq[c*N+i] = 0; - while (++cmode->eBands[st->end];isyn_mem[0]+MAX_PERIOD; - if (CC==2) - out_mem[1] = st->syn_mem[1]+MAX_PERIOD; - - overlap_mem[0] = (celt_sig*)(oldLogE2 + CC*st->mode->nbEBands); - if (CC==2) - overlap_mem[1] = overlap_mem[0] + st->overlap; - - compute_inv_mdcts(st->mode, shortBlocks, freq, out_mem, overlap_mem, CC, LM); - - c=0; do { - st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); - st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINPERIOD); - comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefilter_period, st->mode->shortMdctSize, - st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_old, st->prefilter_tapset, - st->mode->window, st->overlap); - if (LM!=0) - comb_filter(out_mem[c]+st->mode->shortMdctSize, out_mem[c]+st->mode->shortMdctSize, st->prefilter_period, pitch_index, N-st->mode->shortMdctSize, - st->prefilter_gain, gain1, st->prefilter_tapset, prefilter_tapset, - st->mode->window, st->mode->overlap); - } while (++cupsample, st->mode->preemph, st->preemph_memD); - st->prefilter_period_old = st->prefilter_period; - st->prefilter_gain_old = st->prefilter_gain; - st->prefilter_tapset_old = st->prefilter_tapset; - } -#endif - - st->prefilter_period = pitch_index; - st->prefilter_gain = gain1; - st->prefilter_tapset = prefilter_tapset; -#ifdef RESYNTH - if (LM!=0) - { - st->prefilter_period_old = st->prefilter_period; - st->prefilter_gain_old = st->prefilter_gain; - st->prefilter_tapset_old = st->prefilter_tapset; - } -#endif - - if (CC==2&&C==1) { - for (i=0;imode->nbEBands;i++) - oldBandE[st->mode->nbEBands+i]=oldBandE[i]; - } - - if (!isTransient) - { - for (i=0;imode->nbEBands;i++) - oldLogE2[i] = oldLogE[i]; - for (i=0;imode->nbEBands;i++) - oldLogE[i] = oldBandE[i]; - } else { - for (i=0;imode->nbEBands;i++) - oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); - } - /* In case start or end were to change */ - c=0; do - { - for (i=0;istart;i++) - { - oldBandE[c*st->mode->nbEBands+i]=0; - oldLogE[c*st->mode->nbEBands+i]=oldLogE2[c*st->mode->nbEBands+i]=-QCONST16(28.f,DB_SHIFT); - } - for (i=st->end;imode->nbEBands;i++) - { - oldBandE[c*st->mode->nbEBands+i]=0; - oldLogE[c*st->mode->nbEBands+i]=oldLogE2[c*st->mode->nbEBands+i]=-QCONST16(28.f,DB_SHIFT); - } - } while (++cconsec_transient++; - else - st->consec_transient=0; - st->rng = enc->rng; - - /* If there's any room left (can only happen for very high rates), - it's already filled with zeros */ - ec_enc_done(enc); - -#ifdef CUSTOM_MODES - if (st->signalling) - nbCompressedBytes++; -#endif - - RESTORE_STACK; - if (ec_get_error(enc)) - return OPUS_INTERNAL_ERROR; - else - return nbCompressedBytes; -} - - -#ifdef CUSTOM_MODES - -#ifdef FIXED_POINT -int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) -{ - return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL); -} - -#ifndef DISABLE_FLOAT_API -int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) -{ - int j, ret, C, N; - VARDECL(opus_int16, in); - ALLOC_STACK; - - if (pcm==NULL) - return OPUS_BAD_ARG; - - C = st->channels; - N = frame_size; - ALLOC(in, C*N, opus_int16); - - for (j=0;jchannels; - N=frame_size; - ALLOC(in, C*N, celt_sig); - for (j=0;j10) - goto bad_arg; - st->complexity = value; - } - break; - case CELT_SET_START_BAND_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value<0 || value>=st->mode->nbEBands) - goto bad_arg; - st->start = value; - } - break; - case CELT_SET_END_BAND_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value<1 || value>st->mode->nbEBands) - goto bad_arg; - st->end = value; - } - break; - case CELT_SET_PREDICTION_REQUEST: - { - int value = va_arg(ap, opus_int32); - if (value<0 || value>2) - goto bad_arg; - st->disable_pf = value<=1; - st->force_intra = value==0; - } - break; - case OPUS_SET_PACKET_LOSS_PERC_REQUEST: - { - int value = va_arg(ap, opus_int32); - if (value<0 || value>100) - goto bad_arg; - st->loss_rate = value; - } - break; - case OPUS_SET_VBR_CONSTRAINT_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - st->constrained_vbr = value; - } - break; - case OPUS_SET_VBR_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - st->vbr = value; - } - break; - case OPUS_SET_BITRATE_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value<=500 && value!=OPUS_BITRATE_MAX) - goto bad_arg; - value = IMIN(value, 260000*st->channels); - st->bitrate = value; - } - break; - case CELT_SET_CHANNELS_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value<1 || value>2) - goto bad_arg; - st->stream_channels = value; - } - break; - case OPUS_SET_LSB_DEPTH_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value<8 || value>24) - goto bad_arg; - st->lsb_depth=value; - } - break; - case OPUS_GET_LSB_DEPTH_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value=st->lsb_depth; - } - break; - case OPUS_RESET_STATE: - { - int i; - opus_val16 *oldBandE, *oldLogE, *oldLogE2; - oldBandE = (opus_val16*)(st->in_mem+st->channels*(st->overlap+COMBFILTER_MAXPERIOD)); - oldLogE = oldBandE + st->channels*st->mode->nbEBands; - oldLogE2 = oldLogE + st->channels*st->mode->nbEBands; - OPUS_CLEAR((char*)&st->ENCODER_RESET_START, - opus_custom_encoder_get_size(st->mode, st->channels)- - ((char*)&st->ENCODER_RESET_START - (char*)st)); - for (i=0;ichannels*st->mode->nbEBands;i++) - oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); - st->vbr_offset = 0; - st->delayedIntra = 1; - st->spread_decision = SPREAD_NORMAL; - st->tonal_average = 256; - st->hf_average = 0; - st->tapset_decision = 0; - } - break; -#ifdef CUSTOM_MODES - case CELT_SET_INPUT_CLIPPING_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - st->clip = value; - } - break; -#endif - case CELT_SET_SIGNALLING_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - st->signalling = value; - } - break; - case CELT_GET_MODE_REQUEST: - { - const CELTMode ** value = va_arg(ap, const CELTMode**); - if (value==0) - goto bad_arg; - *value=st->mode; - } - break; - case OPUS_GET_FINAL_RANGE_REQUEST: - { - opus_uint32 * value = va_arg(ap, opus_uint32 *); - if (value==0) - goto bad_arg; - *value=st->rng; - } - break; - default: - goto bad_request; - } - va_end(ap); - return OPUS_OK; -bad_arg: - va_end(ap); - return OPUS_BAD_ARG; -bad_request: - va_end(ap); - return OPUS_UNIMPLEMENTED; -} -#endif /* OPUS_ENABLE_ENCODER */ - -/**********************************************************************/ -/* */ -/* DECODER */ -/* */ -/**********************************************************************/ -#define DECODE_BUFFER_SIZE 2048 - -/** Decoder state - @brief Decoder state - */ -struct OpusCustomDecoder { - const OpusCustomMode *mode; - int overlap; - int channels; - int stream_channels; - - int downsample; - int start, end; - int signalling; - - /* Everything beyond this point gets cleared on a reset */ -#define DECODER_RESET_START rng - - opus_uint32 rng; - int error; - int last_pitch_index; - int loss_count; - int postfilter_period; - int postfilter_period_old; - opus_val16 postfilter_gain; - opus_val16 postfilter_gain_old; - int postfilter_tapset; - int postfilter_tapset_old; - - celt_sig preemph_memD[2]; - - celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */ - /* opus_val16 lpc[], Size = channels*LPC_ORDER */ - /* opus_val16 oldEBands[], Size = 2*mode->nbEBands */ - /* opus_val16 oldLogE[], Size = 2*mode->nbEBands */ - /* opus_val16 oldLogE2[], Size = 2*mode->nbEBands */ - /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */ -}; - -int celt_decoder_get_size(int channels) -{ - const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); - return opus_custom_decoder_get_size(mode, channels); -} - -OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels) -{ - int size = sizeof(struct CELTDecoder) - + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig) - + channels*LPC_ORDER*sizeof(opus_val16) - + 4*2*mode->nbEBands*sizeof(opus_val16); - return size; -} - -#ifdef CUSTOM_MODES -CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error) -{ - int ret; - CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels)); - ret = opus_custom_decoder_init(st, mode, channels); - if (ret != OPUS_OK) - { - opus_custom_decoder_destroy(st); - st = NULL; - } - if (error) - *error = ret; - return st; -} -#endif /* CUSTOM_MODES */ - -int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels) -{ - int ret; - ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels); - if (ret != OPUS_OK) - return ret; - st->downsample = resampling_factor(sampling_rate); - if (st->downsample==0) - return OPUS_BAD_ARG; - else - return OPUS_OK; -} - -OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels) -{ - if (channels < 0 || channels > 2) - return OPUS_BAD_ARG; - - if (st==NULL) - return OPUS_ALLOC_FAIL; - - OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels)); - - st->mode = mode; - st->overlap = mode->overlap; - st->stream_channels = st->channels = channels; - - st->downsample = 1; - st->start = 0; - st->end = st->mode->effEBands; - st->signalling = 1; - - st->loss_count = 0; - - opus_custom_decoder_ctl(st, OPUS_RESET_STATE); - - return OPUS_OK; -} - -#ifdef CUSTOM_MODES -void opus_custom_decoder_destroy(CELTDecoder *st) -{ - opus_free(st); -} -#endif /* CUSTOM_MODES */ - -static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, opus_val16 * OPUS_RESTRICT pcm, int N, int LM) -{ - int c; - int pitch_index; - opus_val16 fade = Q15ONE; - int i, len; - const int C = st->channels; - int offset; - celt_sig *out_mem[2]; - celt_sig *decode_mem[2]; - celt_sig *overlap_mem[2]; - opus_val16 *lpc; - opus_val32 *out_syn[2]; - opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; - const OpusCustomMode *mode; - int nbEBands; - int overlap; - const opus_int16 *eBands; - SAVE_STACK; - - mode = st->mode; - nbEBands = mode->nbEBands; - overlap = mode->overlap; - eBands = mode->eBands; - - c=0; do { - decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap); - out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD; - overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE; - } while (++c_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C); - oldBandE = lpc+C*LPC_ORDER; - oldLogE = oldBandE + 2*nbEBands; - oldLogE2 = oldLogE + 2*nbEBands; - backgroundLogE = oldLogE2 + 2*nbEBands; - - c=0; do { - out_syn[c] = out_mem[c]+MAX_PERIOD-N; - } while (++closs_count >= 5 || st->start!=0) - { - /* Noise-based PLC/CNG */ - VARDECL(celt_sig, freq); - VARDECL(celt_norm, X); - VARDECL(celt_ener, bandE); - opus_uint32 seed; - int effEnd; - - effEnd = st->end; - if (effEnd > mode->effEBands) - effEnd = mode->effEBands; - - ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */ - ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ - ALLOC(bandE, nbEBands*C, celt_ener); - - if (st->loss_count >= 5) - log2Amp(mode, st->start, st->end, bandE, backgroundLogE, C); - else { - /* Energy decay */ - opus_val16 decay = st->loss_count==0 ? QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT); - c=0; do - { - for (i=st->start;iend;i++) - oldBandE[c*nbEBands+i] -= decay; - } while (++cstart, st->end, bandE, oldBandE, C); - } - seed = st->rng; - for (c=0;cmode->eBands[st->start]<start;ieffEBands;i++) - { - int j; - int boffs; - int blen; - boffs = N*c+(eBands[i]<>20); - } - renormalise_vector(X+boffs, blen, Q15ONE); - } - for (i=(st->mode->eBands[st->end]<rng = seed; - - denormalise_bands(mode, X, freq, bandE, mode->effEBands, C, 1<mode->eBands[st->start]<downsample!=1) - bound = IMIN(bound, N/st->downsample); - for (i=bound;iloss_count == 0) - { - opus_val16 pitch_buf[DECODE_BUFFER_SIZE>>1]; - /* Corresponds to a min pitch of 67 Hz. It's possible to save CPU in this - search by using only part of the decode buffer */ - int poffset = 720; - pitch_downsample(decode_mem, pitch_buf, DECODE_BUFFER_SIZE, C); - /* Max pitch is 100 samples (480 Hz) */ - pitch_search(pitch_buf+((poffset)>>1), pitch_buf, DECODE_BUFFER_SIZE-poffset, - poffset-100, &pitch_index); - pitch_index = poffset-pitch_index; - st->last_pitch_index = pitch_index; - } else { - pitch_index = st->last_pitch_index; - fade = QCONST16(.8f,15); - } - - ALLOC(etmp, overlap, opus_val32); - c=0; do { - opus_val16 exc[MAX_PERIOD]; - opus_val32 ac[LPC_ORDER+1]; - opus_val16 decay; - opus_val16 attenuation; - opus_val32 S1=0; - opus_val16 mem[LPC_ORDER]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - opus_val32 *e = out_syn[c]; - - - offset = MAX_PERIOD-pitch_index; - for (i=0;iloss_count == 0) - { - _celt_autocorr(exc, ac, mode->window, overlap, - LPC_ORDER, MAX_PERIOD); - - /* Noise floor -40 dB */ -#ifdef FIXED_POINT - ac[0] += SHR32(ac[0],13); -#else - ac[0] *= 1.0001f; -#endif - /* Lag windowing */ - for (i=1;i<=LPC_ORDER;i++) - { - /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ -#ifdef FIXED_POINT - ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); -#else - ac[i] -= ac[i]*(.008f*i)*(.008f*i); -#endif - } - - _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER); - } - /* Samples just before the beginning of exc */ - for (i=0;i E2) - E1 = E2; - decay = celt_sqrt(frac_div32(SHR32(E1,1),E2)); - attenuation = decay; - } - - /* Move memory one frame to the left */ - OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+overlap); - - /* Extrapolate excitation with the right period, taking decay into account */ - for (i=0;i= MAX_PERIOD) - { - offset -= pitch_index; - attenuation = MULT16_16_Q15(attenuation, decay); - } - e[i] = SHL32(EXTEND32(MULT16_16_Q15(attenuation, exc[offset+i])), SIG_SHIFT); - /* Compute the energy of the previously decoded signal whose - excitation we're copying */ - tmp = ROUND16(out_mem[c][-N+offset+i],SIG_SHIFT); - S1 += SHR32(MULT16_16(tmp,tmp),8); - } - - /* Copy the last decoded samples (prior to the overlap region) to - synthesis filter memory so we can have a continuous signal. */ - for (i=0;i SHR32(S2,2))) -#else - /* Float test is written this way to catch NaNs at the same time */ - if (!(S1 > 0.2f*S2)) -#endif - { - for (i=0;iwindow[i], Q15ONE-ratio); - e[i] = MULT16_32_Q15(tmp_g, e[i]); - } - for (i=overlap;ipostfilter_period, st->postfilter_period, st->overlap, - -st->postfilter_gain, -st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset, - NULL, 0); - - /* Simulate TDAC on the concealed audio so that it blends with the - MDCT of next frames. */ - for (i=0;iwindow[i], etmp[overlap-1-i]) + - MULT16_32_Q15(mode->window[overlap-i-1], etmp[i ]); - out_mem[c][MAX_PERIOD+i] = MULT16_32_Q15(mode->window[overlap-i-1], tmp); - out_mem[c][MAX_PERIOD+overlap-i-1] = MULT16_32_Q15(mode->window[i], tmp); - } - } while (++cdownsample, mode->preemph, st->preemph_memD); - - st->loss_count++; - - RESTORE_STACK; -} - -int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec) -{ - int c, i, N; - int spread_decision; - opus_int32 bits; - ec_dec _dec; - VARDECL(celt_sig, freq); - VARDECL(celt_norm, X); - VARDECL(celt_ener, bandE); - VARDECL(int, fine_quant); - VARDECL(int, pulses); - VARDECL(int, cap); - VARDECL(int, offsets); - VARDECL(int, fine_priority); - VARDECL(int, tf_res); - VARDECL(unsigned char, collapse_masks); - celt_sig *out_mem[2]; - celt_sig *decode_mem[2]; - celt_sig *overlap_mem[2]; - celt_sig *out_syn[2]; - opus_val16 *lpc; - opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; - - int shortBlocks; - int isTransient; - int intra_ener; - const int CC = st->channels; - int LM, M; - int effEnd; - int codedBands; - int alloc_trim; - int postfilter_pitch; - opus_val16 postfilter_gain; - int intensity=0; - int dual_stereo=0; - opus_int32 total_bits; - opus_int32 balance; - opus_int32 tell; - int dynalloc_logp; - int postfilter_tapset; - int anti_collapse_rsv; - int anti_collapse_on=0; - int silence; - int C = st->stream_channels; - ALLOC_STACK; - - frame_size *= st->downsample; - - c=0; do { - decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap); - out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD; - overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE; - } while (++c_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*CC); - oldBandE = lpc+CC*LPC_ORDER; - oldLogE = oldBandE + 2*st->mode->nbEBands; - oldLogE2 = oldLogE + 2*st->mode->nbEBands; - backgroundLogE = oldLogE2 + 2*st->mode->nbEBands; - -#ifdef CUSTOM_MODES - if (st->signalling && data!=NULL) - { - int data0=data[0]; - /* Convert "standard mode" to Opus header */ - if (st->mode->Fs==48000 && st->mode->shortMdctSize==120) - { - data0 = fromOpus(data0); - if (data0<0) - return OPUS_INVALID_PACKET; - } - st->end = IMAX(1, st->mode->effEBands-2*(data0>>5)); - LM = (data0>>3)&0x3; - C = 1 + ((data0>>2)&0x1); - data++; - len--; - if (LM>st->mode->maxLM) - return OPUS_INVALID_PACKET; - if (frame_size < st->mode->shortMdctSize<mode->shortMdctSize<mode->maxLM;LM++) - if (st->mode->shortMdctSize<st->mode->maxLM) - return OPUS_BAD_ARG; - } - M=1<1275 || pcm==NULL) - return OPUS_BAD_ARG; - - N = M*st->mode->shortMdctSize; - - effEnd = st->end; - if (effEnd > st->mode->effEBands) - effEnd = st->mode->effEBands; - - if (data == NULL || len<=1) - { - celt_decode_lost(st, pcm, N, LM); - RESTORE_STACK; - return frame_size/st->downsample; - } - - ALLOC(freq, IMAX(CC,C)*N, celt_sig); /**< Interleaved signal MDCTs */ - ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ - ALLOC(bandE, st->mode->nbEBands*C, celt_ener); - c=0; do - for (i=0;imode->eBands[st->start];i++) - X[c*N+i] = 0; - while (++cmode->eBands[effEnd];imode->nbEBands;i++) - oldBandE[i]=MAX16(oldBandE[i],oldBandE[st->mode->nbEBands+i]); - } - - total_bits = len*8; - tell = ec_tell(dec); - - if (tell >= total_bits) - silence = 1; - else if (tell==1) - silence = ec_dec_bit_logp(dec, 15); - else - silence = 0; - if (silence) - { - /* Pretend we've read all the remaining bits */ - tell = len*8; - dec->nbits_total+=tell-ec_tell(dec); - } - - postfilter_gain = 0; - postfilter_pitch = 0; - postfilter_tapset = 0; - if (st->start==0 && tell+16 <= total_bits) - { - if(ec_dec_bit_logp(dec, 1)) - { - int qg, octave; - octave = ec_dec_uint(dec, 6); - postfilter_pitch = (16< 0 && tell+3 <= total_bits) - { - isTransient = ec_dec_bit_logp(dec, 3); - tell = ec_tell(dec); - } - else - isTransient = 0; - - if (isTransient) - shortBlocks = M; - else - shortBlocks = 0; - - /* Decode the global flags (first symbols in the stream) */ - intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0; - /* Get band energies */ - unquant_coarse_energy(st->mode, st->start, st->end, oldBandE, - intra_ener, dec, C, LM); - - ALLOC(tf_res, st->mode->nbEBands, int); - tf_decode(st->start, st->end, isTransient, tf_res, LM, dec); - - tell = ec_tell(dec); - spread_decision = SPREAD_NORMAL; - if (tell+4 <= total_bits) - spread_decision = ec_dec_icdf(dec, spread_icdf, 5); - - ALLOC(pulses, st->mode->nbEBands, int); - ALLOC(cap, st->mode->nbEBands, int); - ALLOC(offsets, st->mode->nbEBands, int); - ALLOC(fine_priority, st->mode->nbEBands, int); - - init_caps(st->mode,cap,LM,C); - - dynalloc_logp = 6; - total_bits<<=BITRES; - tell = ec_tell_frac(dec); - for (i=st->start;iend;i++) - { - int width, quanta; - int dynalloc_loop_logp; - int boost; - width = C*(st->mode->eBands[i+1]-st->mode->eBands[i])<0) - dynalloc_logp = IMAX(2, dynalloc_logp-1); - } - - ALLOC(fine_quant, st->mode->nbEBands, int); - alloc_trim = tell+(6<=2&&bits>=((LM+2)<mode, st->start, st->end, offsets, cap, - alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, - fine_quant, fine_priority, C, LM, dec, 0, 0); - - unquant_fine_energy(st->mode, st->start, st->end, oldBandE, fine_quant, dec, C); - - /* Decode fixed codebook */ - ALLOC(collapse_masks, C*st->mode->nbEBands, unsigned char); - quant_all_bands(0, st->mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks, - NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res, - len*(8<rng); - - if (anti_collapse_rsv > 0) - { - anti_collapse_on = ec_dec_bits(dec, 1); - } - - unquant_energy_finalise(st->mode, st->start, st->end, oldBandE, - fine_quant, fine_priority, len*8-ec_tell(dec), dec, C); - - if (anti_collapse_on) - anti_collapse(st->mode, X, collapse_masks, LM, C, N, - st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); - - log2Amp(st->mode, st->start, st->end, bandE, oldBandE, C); - - if (silence) - { - for (i=0;imode->nbEBands;i++) - { - bandE[i] = 0; - oldBandE[i] = -QCONST16(28.f,DB_SHIFT); - } - } - /* Synthesis */ - denormalise_bands(st->mode, X, freq, bandE, effEnd, C, M); - - OPUS_MOVE(decode_mem[0], decode_mem[0]+N, DECODE_BUFFER_SIZE-N); - if (CC==2) - OPUS_MOVE(decode_mem[1], decode_mem[1]+N, DECODE_BUFFER_SIZE-N); - - c=0; do - for (i=0;imode->eBands[st->start];i++) - freq[c*N+i] = 0; - while (++cmode->eBands[effEnd]; - if (st->downsample!=1) - bound = IMIN(bound, N/st->downsample); - for (i=bound;imode, shortBlocks, freq, out_syn, overlap_mem, CC, LM); - - c=0; do { - st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD); - st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD); - comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, st->mode->shortMdctSize, - st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset, - st->mode->window, st->overlap); - if (LM!=0) - comb_filter(out_syn[c]+st->mode->shortMdctSize, out_syn[c]+st->mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-st->mode->shortMdctSize, - st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset, - st->mode->window, st->mode->overlap); - - } while (++cpostfilter_period_old = st->postfilter_period; - st->postfilter_gain_old = st->postfilter_gain; - st->postfilter_tapset_old = st->postfilter_tapset; - st->postfilter_period = postfilter_pitch; - st->postfilter_gain = postfilter_gain; - st->postfilter_tapset = postfilter_tapset; - if (LM!=0) - { - st->postfilter_period_old = st->postfilter_period; - st->postfilter_gain_old = st->postfilter_gain; - st->postfilter_tapset_old = st->postfilter_tapset; - } - - if (C==1) { - for (i=0;imode->nbEBands;i++) - oldBandE[st->mode->nbEBands+i]=oldBandE[i]; - } - - /* In case start or end were to change */ - if (!isTransient) - { - for (i=0;i<2*st->mode->nbEBands;i++) - oldLogE2[i] = oldLogE[i]; - for (i=0;i<2*st->mode->nbEBands;i++) - oldLogE[i] = oldBandE[i]; - for (i=0;i<2*st->mode->nbEBands;i++) - backgroundLogE[i] = MIN16(backgroundLogE[i] + M*QCONST16(0.001f,DB_SHIFT), oldBandE[i]); - } else { - for (i=0;i<2*st->mode->nbEBands;i++) - oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); - } - c=0; do - { - for (i=0;istart;i++) - { - oldBandE[c*st->mode->nbEBands+i]=0; - oldLogE[c*st->mode->nbEBands+i]=oldLogE2[c*st->mode->nbEBands+i]=-QCONST16(28.f,DB_SHIFT); - } - for (i=st->end;imode->nbEBands;i++) - { - oldBandE[c*st->mode->nbEBands+i]=0; - oldLogE[c*st->mode->nbEBands+i]=oldLogE2[c*st->mode->nbEBands+i]=-QCONST16(28.f,DB_SHIFT); - } - } while (++c<2); - st->rng = dec->rng; - - deemphasis(out_syn, pcm, N, CC, st->downsample, st->mode->preemph, st->preemph_memD); - st->loss_count = 0; - RESTORE_STACK; - if (ec_tell(dec) > 8*len) - return OPUS_INTERNAL_ERROR; - if(ec_get_error(dec)) - st->error = 1; - return frame_size/st->downsample; -} - - -#ifdef CUSTOM_MODES - -#ifdef FIXED_POINT -int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) -{ - return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL); -} - -#ifndef DISABLE_FLOAT_API -int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size) -{ - int j, ret, C, N; - VARDECL(opus_int16, out); - ALLOC_STACK; - - if (pcm==NULL) - return OPUS_BAD_ARG; - - C = st->channels; - N = frame_size; - - ALLOC(out, C*N, opus_int16); - ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL); - if (ret>0) - for (j=0;jchannels; - N = frame_size; - ALLOC(out, C*N, celt_sig); - - ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL); - - if (ret>0) - for (j=0;j=st->mode->nbEBands) - goto bad_arg; - st->start = value; - } - break; - case CELT_SET_END_BAND_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value<1 || value>st->mode->nbEBands) - goto bad_arg; - st->end = value; - } - break; - case CELT_SET_CHANNELS_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value<1 || value>2) - goto bad_arg; - st->stream_channels = value; - } - break; - case CELT_GET_AND_CLEAR_ERROR_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (value==NULL) - goto bad_arg; - *value=st->error; - st->error = 0; - } - break; - case OPUS_GET_LOOKAHEAD_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (value==NULL) - goto bad_arg; - *value = st->overlap/st->downsample; - } - break; - case OPUS_RESET_STATE: - { - int i; - opus_val16 *lpc, *oldBandE, *oldLogE, *oldLogE2; - lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*st->channels); - oldBandE = lpc+st->channels*LPC_ORDER; - oldLogE = oldBandE + 2*st->mode->nbEBands; - oldLogE2 = oldLogE + 2*st->mode->nbEBands; - OPUS_CLEAR((char*)&st->DECODER_RESET_START, - opus_custom_decoder_get_size(st->mode, st->channels)- - ((char*)&st->DECODER_RESET_START - (char*)st)); - for (i=0;i<2*st->mode->nbEBands;i++) - oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); - } - break; - case OPUS_GET_PITCH_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (value==NULL) - goto bad_arg; - *value = st->postfilter_period; - } - break; - case CELT_GET_MODE_REQUEST: - { - const CELTMode ** value = va_arg(ap, const CELTMode**); - if (value==0) - goto bad_arg; - *value=st->mode; - } - break; - case CELT_SET_SIGNALLING_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - st->signalling = value; - } - break; - case OPUS_GET_FINAL_RANGE_REQUEST: - { - opus_uint32 * value = va_arg(ap, opus_uint32 *); - if (value==0) - goto bad_arg; - *value=st->rng; - } - break; - default: - goto bad_request; - } - va_end(ap); - return OPUS_OK; -bad_arg: - va_end(ap); - return OPUS_BAD_ARG; -bad_request: - va_end(ap); - return OPUS_UNIMPLEMENTED; -} - - - -const char *opus_strerror(int error) -{ - static const char * const error_strings[8] = { - "success", - "invalid argument", - "buffer too small", - "internal error", - "corrupted stream", - "request not implemented", - "invalid state", - "memory allocation failed" - }; - if (error > 0 || error < -7) - return "unknown error"; - else - return error_strings[-error]; -} - -const char *opus_get_version_string(void) -{ - return "libopus " PACKAGE_VERSION -#ifdef FIXED_POINT - "-fixed" -#endif -#ifdef FUZZING - "-fuzzing" -#endif - ; -} diff --git a/external/opus-1.0.3/celt/celt.h b/external/opus-1.0.3/celt/celt.h deleted file mode 100644 index 218cd883..00000000 --- a/external/opus-1.0.3/celt/celt.h +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Copyright (c) 2008 Gregory Maxwell - Written by Jean-Marc Valin and Gregory Maxwell */ -/** - @file celt.h - @brief Contains all the functions for encoding and decoding audio - */ - -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef CELT_H -#define CELT_H - -#include "opus_types.h" -#include "opus_defines.h" -#include "opus_custom.h" -#include "entenc.h" -#include "entdec.h" -#include "arch.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define CELTEncoder OpusCustomEncoder -#define CELTDecoder OpusCustomDecoder -#define CELTMode OpusCustomMode - -#define _celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr))) - -/* Encoder/decoder Requests */ - -#define CELT_SET_PREDICTION_REQUEST 10002 -/** Controls the use of interframe prediction. - 0=Independent frames - 1=Short term interframe prediction allowed - 2=Long term prediction allowed - */ -#define CELT_SET_PREDICTION(x) CELT_SET_PREDICTION_REQUEST, __opus_check_int(x) - -#define CELT_SET_INPUT_CLIPPING_REQUEST 10004 -#define CELT_SET_INPUT_CLIPPING(x) CELT_SET_INPUT_CLIPPING_REQUEST, __opus_check_int(x) - -#define CELT_GET_AND_CLEAR_ERROR_REQUEST 10007 -#define CELT_GET_AND_CLEAR_ERROR(x) CELT_GET_AND_CLEAR_ERROR_REQUEST, __opus_check_int_ptr(x) - -#define CELT_SET_CHANNELS_REQUEST 10008 -#define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, __opus_check_int(x) - - -/* Internal */ -#define CELT_SET_START_BAND_REQUEST 10010 -#define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, __opus_check_int(x) - -#define CELT_SET_END_BAND_REQUEST 10012 -#define CELT_SET_END_BAND(x) CELT_SET_END_BAND_REQUEST, __opus_check_int(x) - -#define CELT_GET_MODE_REQUEST 10015 -/** Get the CELTMode used by an encoder or decoder */ -#define CELT_GET_MODE(x) CELT_GET_MODE_REQUEST, _celt_check_mode_ptr_ptr(x) - -#define CELT_SET_SIGNALLING_REQUEST 10016 -#define CELT_SET_SIGNALLING(x) CELT_SET_SIGNALLING_REQUEST, __opus_check_int(x) - - - -/* Encoder stuff */ - -int celt_encoder_get_size(int channels); - -int celt_encode_with_ec(OpusCustomEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc); - -int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels); - - - -/* Decoder stuff */ - -int celt_decoder_get_size(int channels); - - -int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels); - -int celt_decode_with_ec(OpusCustomDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec); - -#define celt_encoder_ctl opus_custom_encoder_ctl -#define celt_decoder_ctl opus_custom_decoder_ctl - -#ifdef __cplusplus -} -#endif - -#endif /* CELT_H */ diff --git a/external/opus-1.0.3/celt/celt.vcxproj b/external/opus-1.0.3/celt/celt.vcxproj deleted file mode 100644 index b44abc33..00000000 --- a/external/opus-1.0.3/celt/celt.vcxproj +++ /dev/null @@ -1,237 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {245603E3-F580-41A5-9632-B25FE3372CBF} - Win32Proj - celt - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - ../win32;../include;%(AdditionalIncludeDirectories) - MultiThreadedDebug - - - Windows - true - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) - ../win32;../include;%(AdditionalIncludeDirectories) - MultiThreadedDebug - - - Windows - true - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - Level3 - - - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - ../win32;../include;%(AdditionalIncludeDirectories) - MultiThreaded - - - Windows - true - true - true - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - Level3 - - - MaxSpeed - true - true - HAVE_CONFIG_H;WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) - ../win32;../include;%(AdditionalIncludeDirectories) - MultiThreaded - - - Windows - true - true - true - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/external/opus-1.0.3/celt/celt.vcxproj.filters b/external/opus-1.0.3/celt/celt.vcxproj.filters deleted file mode 100644 index 2773bae8..00000000 --- a/external/opus-1.0.3/celt/celt.vcxproj.filters +++ /dev/null @@ -1,141 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/external/opus-1.0.3/celt/celt_lpc.c b/external/opus-1.0.3/celt/celt_lpc.c deleted file mode 100644 index d2addbf2..00000000 --- a/external/opus-1.0.3/celt/celt_lpc.c +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (c) 2009-2010 Xiph.Org Foundation - Written by Jean-Marc Valin */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "celt_lpc.h" -#include "stack_alloc.h" -#include "mathops.h" - -void _celt_lpc( - opus_val16 *_lpc, /* out: [0...p-1] LPC coefficients */ -const opus_val32 *ac, /* in: [0...p] autocorrelation values */ -int p -) -{ - int i, j; - opus_val32 r; - opus_val32 error = ac[0]; -#ifdef FIXED_POINT - opus_val32 lpc[LPC_ORDER]; -#else - float *lpc = _lpc; -#endif - - for (i = 0; i < p; i++) - lpc[i] = 0; - if (ac[0] != 0) - { - for (i = 0; i < p; i++) { - /* Sum up this iteration's reflection coefficient */ - opus_val32 rr = 0; - for (j = 0; j < i; j++) - rr += MULT32_32_Q31(lpc[j],ac[i - j]); - rr += SHR32(ac[i + 1],3); - r = -frac_div32(SHL32(rr,3), error); - /* Update LPC coefficients and total error */ - lpc[i] = SHR32(r,3); - for (j = 0; j < (i+1)>>1; j++) - { - opus_val32 tmp1, tmp2; - tmp1 = lpc[j]; - tmp2 = lpc[i-1-j]; - lpc[j] = tmp1 + MULT32_32_Q31(r,tmp2); - lpc[i-1-j] = tmp2 + MULT32_32_Q31(r,tmp1); - } - - error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error); - /* Bail out once we get 30 dB gain */ -#ifdef FIXED_POINT - if (error=1;j--) - { - mem[j]=mem[j-1]; - } - mem[0] = x[i]; - y[i] = ROUND16(sum, SIG_SHIFT); - } -} - -void celt_iir(const opus_val32 *x, - const opus_val16 *den, - opus_val32 *y, - int N, - int ord, - opus_val16 *mem) -{ - int i,j; - for (i=0;i=1;j--) - { - mem[j]=mem[j-1]; - } - mem[0] = ROUND16(sum,SIG_SHIFT); - y[i] = sum; - } -} - -void _celt_autocorr( - const opus_val16 *x, /* in: [0...n-1] samples x */ - opus_val32 *ac, /* out: [0...lag-1] ac values */ - const opus_val16 *window, - int overlap, - int lag, - int n - ) -{ - opus_val32 d; - int i; - VARDECL(opus_val16, xx); - SAVE_STACK; - ALLOC(xx, n, opus_val16); - celt_assert(n>0); - celt_assert(overlap>=0); - for (i=0;i=0) - { - for (i = lag, d = 0; i < n; i++) - d += xx[i] * xx[i-lag]; - ac[lag] = d; - /*printf ("%f ", ac[lag]);*/ - lag--; - } - /*printf ("\n");*/ - ac[0] += 10; - - RESTORE_STACK; -} diff --git a/external/opus-1.0.3/celt/cwrs.c b/external/opus-1.0.3/celt/cwrs.c deleted file mode 100644 index 2200552c..00000000 --- a/external/opus-1.0.3/celt/cwrs.c +++ /dev/null @@ -1,647 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Copyright (c) 2007-2009 Timothy B. Terriberry - Written by Timothy B. Terriberry and Jean-Marc Valin */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "os_support.h" -#include "cwrs.h" -#include "mathops.h" -#include "arch.h" - -#ifdef CUSTOM_MODES - -/*Guaranteed to return a conservatively large estimate of the binary logarithm - with frac bits of fractional precision. - Tested for all possible 32-bit inputs with frac=4, where the maximum - overestimation is 0.06254243 bits.*/ -int log2_frac(opus_uint32 val, int frac) -{ - int l; - l=EC_ILOG(val); - if(val&(val-1)){ - /*This is (val>>l-16), but guaranteed to round up, even if adding a bias - before the shift would cause overflow (e.g., for 0xFFFFxxxx). - Doesn't work for val=0, but that case fails the test above.*/ - if(l>16)val=((val-1)>>(l-16))+1; - else val<<=16-l; - l=(l-1)<>16); - l+=b<>b; - val=(val*val+0x7FFF)>>15; - } - while(frac-->0); - /*If val is not exactly 0x8000, then we have to round up the remainder.*/ - return l+(val>0x8000); - } - /*Exact powers of two require no rounding.*/ - else return (l-1)<0); - celt_assert(_d<=54); - shift=EC_ILOG(_d^(_d-1)); - inv=INV_TABLE[(_d-1)>>shift]; - shift--; - one=1<>shift)-(_c>>shift)+ - ((_a*(_b&mask)+one-(_c&mask))>>shift)-1)*inv&MASK32; -} - -#endif /* SMALL_FOOTPRINT */ - -/*Although derived separately, the pulse vector coding scheme is equivalent to - a Pyramid Vector Quantizer \cite{Fis86}. - Some additional notes about an early version appear at - http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering - and the definitions of some terms have evolved since that was written. - - The conversion from a pulse vector to an integer index (encoding) and back - (decoding) is governed by two related functions, V(N,K) and U(N,K). - - V(N,K) = the number of combinations, with replacement, of N items, taken K - at a time, when a sign bit is added to each item taken at least once (i.e., - the number of N-dimensional unit pulse vectors with K pulses). - One way to compute this is via - V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1, - where choose() is the binomial function. - A table of values for N<10 and K<10 looks like: - V[10][10] = { - {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {1, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {1, 4, 8, 12, 16, 20, 24, 28, 32, 36}, - {1, 6, 18, 38, 66, 102, 146, 198, 258, 326}, - {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, - {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, - {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, - {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, - {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, - {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146} - }; - - U(N,K) = the number of such combinations wherein N-1 objects are taken at - most K-1 at a time. - This is given by - U(N,K) = sum(k=0...K-1,V(N-1,k)) - = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0. - The latter expression also makes clear that U(N,K) is half the number of such - combinations wherein the first object is taken at least once. - Although it may not be clear from either of these definitions, U(N,K) is the - natural function to work with when enumerating the pulse vector codebooks, - not V(N,K). - U(N,K) is not well-defined for N=0, but with the extension - U(0,K) = K>0 ? 0 : 1, - the function becomes symmetric: U(N,K) = U(K,N), with a similar table: - U[10][10] = { - {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {0, 1, 3, 5, 7, 9, 11, 13, 15, 17}, - {0, 1, 5, 13, 25, 41, 61, 85, 113, 145}, - {0, 1, 7, 25, 63, 129, 231, 377, 575, 833}, - {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649}, - {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073}, - {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081}, - {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545}, - {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729} - }; - - With this extension, V(N,K) may be written in terms of U(N,K): - V(N,K) = U(N,K) + U(N,K+1) - for all N>=0, K>=0. - Thus U(N,K+1) represents the number of combinations where the first element - is positive or zero, and U(N,K) represents the number of combinations where - it is negative. - With a large enough table of U(N,K) values, we could write O(N) encoding - and O(min(N*log(K),N+K)) decoding routines, but such a table would be - prohibitively large for small embedded devices (K may be as large as 32767 - for small N, and N may be as large as 200). - - Both functions obey the same recurrence relation: - V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), - U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1), - for all N>0, K>0, with different initial conditions at N=0 or K=0. - This allows us to construct a row of one of the tables above given the - previous row or the next row. - Thus we can derive O(NK) encoding and decoding routines with O(K) memory - using only addition and subtraction. - - When encoding, we build up from the U(2,K) row and work our way forwards. - When decoding, we need to start at the U(N,K) row and work our way backwards, - which requires a means of computing U(N,K). - U(N,K) may be computed from two previous values with the same N: - U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2) - for all N>1, and since U(N,K) is symmetric, a similar relation holds for two - previous values with the same K: - U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K) - for all K>1. - This allows us to construct an arbitrary row of the U(N,K) table by starting - with the first two values, which are constants. - This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K) - multiplications. - Similar relations can be derived for V(N,K), but are not used here. - - For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree - polynomial for fixed N. - The first few are - U(1,K) = 1, - U(2,K) = 2*K-1, - U(3,K) = (2*K-2)*K+1, - U(4,K) = (((4*K-6)*K+8)*K-3)/3, - U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3, - and - V(1,K) = 2, - V(2,K) = 4*K, - V(3,K) = 4*K*K+2, - V(4,K) = 8*(K*K+2)*K/3, - V(5,K) = ((4*K*K+20)*K*K+6)/3, - for all K>0. - This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for - small N (and indeed decoding is also O(N) for N<3). - - @ARTICLE{Fis86, - author="Thomas R. Fischer", - title="A Pyramid Vector Quantizer", - journal="IEEE Transactions on Information Theory", - volume="IT-32", - number=4, - pages="568--583", - month=Jul, - year=1986 - }*/ - -#ifndef SMALL_FOOTPRINT -/*Compute U(2,_k). - Note that this may be called with _k=32768 (maxK[2]+1).*/ -static inline unsigned ucwrs2(unsigned _k){ - celt_assert(_k>0); - return _k+(_k-1); -} - -/*Compute V(2,_k).*/ -static inline opus_uint32 ncwrs2(int _k){ - celt_assert(_k>0); - return 4*(opus_uint32)_k; -} - -/*Compute U(3,_k). - Note that this may be called with _k=32768 (maxK[3]+1).*/ -static inline opus_uint32 ucwrs3(unsigned _k){ - celt_assert(_k>0); - return (2*(opus_uint32)_k-2)*_k+1; -} - -/*Compute V(3,_k).*/ -static inline opus_uint32 ncwrs3(int _k){ - celt_assert(_k>0); - return 2*(2*(unsigned)_k*(opus_uint32)_k+1); -} - -/*Compute U(4,_k).*/ -static inline opus_uint32 ucwrs4(int _k){ - celt_assert(_k>0); - return imusdiv32odd(2*_k,(2*_k-3)*(opus_uint32)_k+4,3,1); -} - -/*Compute V(4,_k).*/ -static inline opus_uint32 ncwrs4(int _k){ - celt_assert(_k>0); - return ((_k*(opus_uint32)_k+2)*_k)/3<<3; -} - -#endif /* SMALL_FOOTPRINT */ - -/*Computes the next row/column of any recurrence that obeys the relation - u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. - _ui0 is the base case for the new row/column.*/ -static inline void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ - opus_uint32 ui1; - unsigned j; - /*This do-while will overrun the array if we don't have storage for at least - 2 values.*/ - j=1; do { - ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0); - _ui[j-1]=_ui0; - _ui0=ui1; - } while (++j<_len); - _ui[j-1]=_ui0; -} - -/*Computes the previous row/column of any recurrence that obeys the relation - u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1]. - _ui0 is the base case for the new row/column.*/ -static inline void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){ - opus_uint32 ui1; - unsigned j; - /*This do-while will overrun the array if we don't have storage for at least - 2 values.*/ - j=1; do { - ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0); - _ui[j-1]=_ui0; - _ui0=ui1; - } while (++j<_n); - _ui[j-1]=_ui0; -} - -/*Compute V(_n,_k), as well as U(_n,0..._k+1). - _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ -static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){ - opus_uint32 um2; - unsigned len; - unsigned k; - len=_k+2; - /*We require storage at least 3 values (e.g., _k>0).*/ - celt_assert(len>=3); - _u[0]=0; - _u[1]=um2=1; -#ifndef SMALL_FOOTPRINT - /*_k>52 doesn't work in the false branch due to the limits of INV_TABLE, - but _k isn't tested here because k<=52 for n=7*/ - if(_n<=6) -#endif - { - /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ - /*If _n==1, _u[i] should be 1 for i>1.*/ - celt_assert(_n>=2); - /*If _k==0, the following do-while loop will overflow the buffer.*/ - celt_assert(_k>0); - k=2; - do _u[k]=(k<<1)-1; - while(++k=len)break; - _u[k]=um1=imusdiv32odd(n2m1,um2,um1,(k-1)>>1)+um1; - } - } -#endif /* SMALL_FOOTPRINT */ - return _u[_k]+_u[_k+1]; -} - -#ifndef SMALL_FOOTPRINT - -/*Returns the _i'th combination of _k elements (at most 32767) chosen from a - set of size 1 with associated sign bits. - _y: Returns the vector of pulses.*/ -static inline void cwrsi1(int _k,opus_uint32 _i,int *_y){ - int s; - s=-(int)_i; - _y[0]=(_k+s)^s; -} - -/*Returns the _i'th combination of _k elements (at most 32767) chosen from a - set of size 2 with associated sign bits. - _y: Returns the vector of pulses.*/ -static inline void cwrsi2(int _k,opus_uint32 _i,int *_y){ - opus_uint32 p; - int s; - int yj; - p=ucwrs2(_k+1U); - s=-(_i>=p); - _i-=p&s; - yj=_k; - _k=(_i+1)>>1; - p=_k?ucwrs2(_k):0; - _i-=p; - yj-=_k; - _y[0]=(yj+s)^s; - cwrsi1(_k,_i,_y+1); -} - -/*Returns the _i'th combination of _k elements (at most 32767) chosen from a - set of size 3 with associated sign bits. - _y: Returns the vector of pulses.*/ -static void cwrsi3(int _k,opus_uint32 _i,int *_y){ - opus_uint32 p; - int s; - int yj; - p=ucwrs3(_k+1U); - s=-(_i>=p); - _i-=p&s; - yj=_k; - /*Finds the maximum _k such that ucwrs3(_k)<=_i (tested for all - _i<2147418113=U(3,32768)).*/ - _k=_i>0?(isqrt32(2*_i-1)+1)>>1:0; - p=_k?ucwrs3(_k):0; - _i-=p; - yj-=_k; - _y[0]=(yj+s)^s; - cwrsi2(_k,_i,_y+1); -} - -/*Returns the _i'th combination of _k elements (at most 1172) chosen from a set - of size 4 with associated sign bits. - _y: Returns the vector of pulses.*/ -static void cwrsi4(int _k,opus_uint32 _i,int *_y){ - opus_uint32 p; - int s; - int yj; - int kl; - int kr; - p=ucwrs4(_k+1); - s=-(_i>=p); - _i-=p&s; - yj=_k; - /*We could solve a cubic for k here, but the form of the direct solution does - not lend itself well to exact integer arithmetic. - Instead we do a binary search on U(4,K).*/ - kl=0; - kr=_k; - for(;;){ - _k=(kl+kr)>>1; - p=_k?ucwrs4(_k):0; - if(p<_i){ - if(_k>=kr)break; - kl=_k+1; - } - else if(p>_i)kr=_k-1; - else break; - } - _i-=p; - yj-=_k; - _y[0]=(yj+s)^s; - cwrsi3(_k,_i,_y+1); -} - -#endif /* SMALL_FOOTPRINT */ - -/*Returns the _i'th combination of _k elements chosen from a set of size _n - with associated sign bits. - _y: Returns the vector of pulses. - _u: Must contain entries [0..._k+1] of row _n of U() on input. - Its contents will be destructively modified.*/ -static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){ - int j; - celt_assert(_n>0); - j=0; - do{ - opus_uint32 p; - int s; - int yj; - p=_u[_k+1]; - s=-(_i>=p); - _i-=p&s; - yj=_k; - p=_u[_k]; - while(p>_i)p=_u[--_k]; - _i-=p; - yj-=_k; - _y[j]=(yj+s)^s; - uprev(_u,_k+2,0); - } - while(++j<_n); -} - -/*Returns the index of the given combination of K elements chosen from a set - of size 1 with associated sign bits. - _y: The vector of pulses, whose sum of absolute values is K. - _k: Returns K.*/ -static inline opus_uint32 icwrs1(const int *_y,int *_k){ - *_k=abs(_y[0]); - return _y[0]<0; -} - -#ifndef SMALL_FOOTPRINT - -/*Returns the index of the given combination of K elements chosen from a set - of size 2 with associated sign bits. - _y: The vector of pulses, whose sum of absolute values is K. - _k: Returns K.*/ -static inline opus_uint32 icwrs2(const int *_y,int *_k){ - opus_uint32 i; - int k; - i=icwrs1(_y+1,&k); - i+=k?ucwrs2(k):0; - k+=abs(_y[0]); - if(_y[0]<0)i+=ucwrs2(k+1U); - *_k=k; - return i; -} - -/*Returns the index of the given combination of K elements chosen from a set - of size 3 with associated sign bits. - _y: The vector of pulses, whose sum of absolute values is K. - _k: Returns K.*/ -static inline opus_uint32 icwrs3(const int *_y,int *_k){ - opus_uint32 i; - int k; - i=icwrs2(_y+1,&k); - i+=k?ucwrs3(k):0; - k+=abs(_y[0]); - if(_y[0]<0)i+=ucwrs3(k+1U); - *_k=k; - return i; -} - -/*Returns the index of the given combination of K elements chosen from a set - of size 4 with associated sign bits. - _y: The vector of pulses, whose sum of absolute values is K. - _k: Returns K.*/ -static inline opus_uint32 icwrs4(const int *_y,int *_k){ - opus_uint32 i; - int k; - i=icwrs3(_y+1,&k); - i+=k?ucwrs4(k):0; - k+=abs(_y[0]); - if(_y[0]<0)i+=ucwrs4(k+1); - *_k=k; - return i; -} - -#endif /* SMALL_FOOTPRINT */ - -/*Returns the index of the given combination of K elements chosen from a set - of size _n with associated sign bits. - _y: The vector of pulses, whose sum of absolute values must be _k. - _nc: Returns V(_n,_k).*/ -static inline opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y, - opus_uint32 *_u){ - opus_uint32 i; - int j; - int k; - /*We can't unroll the first two iterations of the loop unless _n>=2.*/ - celt_assert(_n>=2); - _u[0]=0; - for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; - i=icwrs1(_y+_n-1,&k); - j=_n-2; - i+=_u[k]; - k+=abs(_y[j]); - if(_y[j]<0)i+=_u[k+1]; - while(j-->0){ - unext(_u,_k+2,0); - i+=_u[k]; - k+=abs(_y[j]); - if(_y[j]<0)i+=_u[k+1]; - } - *_nc=_u[k]+_u[k+1]; - return i; -} - -#ifdef CUSTOM_MODES -void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ - int k; - /*_maxk==0 => there's nothing to do.*/ - celt_assert(_maxk>0); - _bits[0]=0; - if (_n==1) - { - for (k=1;k<=_maxk;k++) - _bits[k] = 1<<_frac; - } - else { - VARDECL(opus_uint32,u); - SAVE_STACK; - ALLOC(u,_maxk+2U,opus_uint32); - ncwrs_urow(_n,_maxk,u); - for(k=1;k<=_maxk;k++) - _bits[k]=log2_frac(u[k]+u[k+1],_frac); - RESTORE_STACK; - } -} -#endif /* CUSTOM_MODES */ - -#ifdef OPUS_ENABLE_ENCODER -void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ - opus_uint32 i; - celt_assert(_k>0); -#ifndef SMALL_FOOTPRINT - switch(_n){ - case 2:{ - i=icwrs2(_y,&_k); - ec_enc_uint(_enc,i,ncwrs2(_k)); - }break; - case 3:{ - i=icwrs3(_y,&_k); - ec_enc_uint(_enc,i,ncwrs3(_k)); - }break; - case 4:{ - i=icwrs4(_y,&_k); - ec_enc_uint(_enc,i,ncwrs4(_k)); - }break; - default: - { -#endif - VARDECL(opus_uint32,u); - opus_uint32 nc; - SAVE_STACK; - ALLOC(u,_k+2U,opus_uint32); - i=icwrs(_n,_k,&nc,_y,u); - ec_enc_uint(_enc,i,nc); - RESTORE_STACK; -#ifndef SMALL_FOOTPRINT - } - break; - } -#endif -} -#endif /* OPUS_ENABLE_ENCODER */ - -void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec) -{ - celt_assert(_k>0); -#ifndef SMALL_FOOTPRINT - switch(_n){ - case 2:cwrsi2(_k,ec_dec_uint(_dec,ncwrs2(_k)),_y);break; - case 3:cwrsi3(_k,ec_dec_uint(_dec,ncwrs3(_k)),_y);break; - case 4:cwrsi4(_k,ec_dec_uint(_dec,ncwrs4(_k)),_y);break; - default: - { -#endif - VARDECL(opus_uint32,u); - SAVE_STACK; - ALLOC(u,_k+2U,opus_uint32); - cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); - RESTORE_STACK; -#ifndef SMALL_FOOTPRINT - } - break; - } -#endif -} diff --git a/external/opus-1.0.3/celt/kiss_fft.c b/external/opus-1.0.3/celt/kiss_fft.c deleted file mode 100644 index dcd69686..00000000 --- a/external/opus-1.0.3/celt/kiss_fft.c +++ /dev/null @@ -1,722 +0,0 @@ -/*Copyright (c) 2003-2004, Mark Borgerding - Lots of modifications by Jean-Marc Valin - Copyright (c) 2005-2007, Xiph.Org Foundation - Copyright (c) 2008, Xiph.Org Foundation, CSIRO - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE.*/ - -/* This code is originally from Mark Borgerding's KISS-FFT but has been - heavily modified to better suit Opus */ - -#ifndef SKIP_CONFIG_H -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif -#endif - -#include "_kiss_fft_guts.h" -#include "arch.h" -#include "os_support.h" -#include "mathops.h" -#include "stack_alloc.h" -#include "os_support.h" - -/* The guts header contains all the multiplication and addition macros that are defined for - complex numbers. It also delares the kf_ internal functions. -*/ - -static void kf_bfly2( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_state *st, - int m, - int N, - int mm - ) -{ - kiss_fft_cpx * Fout2; - const kiss_twiddle_cpx * tw1; - int i,j; - kiss_fft_cpx * Fout_beg = Fout; - for (i=0;itwiddles; - for(j=0;jr = SHR32(Fout->r, 1);Fout->i = SHR32(Fout->i, 1); - Fout2->r = SHR32(Fout2->r, 1);Fout2->i = SHR32(Fout2->i, 1); - C_MUL (t, *Fout2 , *tw1); - tw1 += fstride; - C_SUB( *Fout2 , *Fout , t ); - C_ADDTO( *Fout , t ); - ++Fout2; - ++Fout; - } - } -} - -static void ki_bfly2( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_state *st, - int m, - int N, - int mm - ) -{ - kiss_fft_cpx * Fout2; - const kiss_twiddle_cpx * tw1; - kiss_fft_cpx t; - int i,j; - kiss_fft_cpx * Fout_beg = Fout; - for (i=0;itwiddles; - for(j=0;jtwiddles; - for (j=0;jr = PSHR32(Fout->r, 2); - Fout->i = PSHR32(Fout->i, 2); - C_SUB( scratch[5] , *Fout, scratch[1] ); - C_ADDTO(*Fout, scratch[1]); - C_ADD( scratch[3] , scratch[0] , scratch[2] ); - C_SUB( scratch[4] , scratch[0] , scratch[2] ); - Fout[m2].r = PSHR32(Fout[m2].r, 2); - Fout[m2].i = PSHR32(Fout[m2].i, 2); - C_SUB( Fout[m2], *Fout, scratch[3] ); - tw1 += fstride; - tw2 += fstride*2; - tw3 += fstride*3; - C_ADDTO( *Fout , scratch[3] ); - - Fout[m].r = scratch[5].r + scratch[4].i; - Fout[m].i = scratch[5].i - scratch[4].r; - Fout[m3].r = scratch[5].r - scratch[4].i; - Fout[m3].i = scratch[5].i + scratch[4].r; - ++Fout; - } - } -} - -static void ki_bfly4( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_state *st, - int m, - int N, - int mm - ) -{ - const kiss_twiddle_cpx *tw1,*tw2,*tw3; - kiss_fft_cpx scratch[6]; - const size_t m2=2*m; - const size_t m3=3*m; - int i, j; - - kiss_fft_cpx * Fout_beg = Fout; - for (i=0;itwiddles; - for (j=0;jtwiddles[fstride*m]; - for (i=0;itwiddles; - k=m; - do { - C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); - - C_MUL(scratch[1],Fout[m] , *tw1); - C_MUL(scratch[2],Fout[m2] , *tw2); - - C_ADD(scratch[3],scratch[1],scratch[2]); - C_SUB(scratch[0],scratch[1],scratch[2]); - tw1 += fstride; - tw2 += fstride*2; - - Fout[m].r = Fout->r - HALF_OF(scratch[3].r); - Fout[m].i = Fout->i - HALF_OF(scratch[3].i); - - C_MULBYSCALAR( scratch[0] , epi3.i ); - - C_ADDTO(*Fout,scratch[3]); - - Fout[m2].r = Fout[m].r + scratch[0].i; - Fout[m2].i = Fout[m].i - scratch[0].r; - - Fout[m].r -= scratch[0].i; - Fout[m].i += scratch[0].r; - - ++Fout; - } while(--k); - } -} - -static void ki_bfly3( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_state *st, - int m, - int N, - int mm - ) -{ - int i, k; - const size_t m2 = 2*m; - const kiss_twiddle_cpx *tw1,*tw2; - kiss_fft_cpx scratch[5]; - kiss_twiddle_cpx epi3; - - kiss_fft_cpx * Fout_beg = Fout; - epi3 = st->twiddles[fstride*m]; - for (i=0;itwiddles; - k=m; - do{ - - C_MULC(scratch[1],Fout[m] , *tw1); - C_MULC(scratch[2],Fout[m2] , *tw2); - - C_ADD(scratch[3],scratch[1],scratch[2]); - C_SUB(scratch[0],scratch[1],scratch[2]); - tw1 += fstride; - tw2 += fstride*2; - - Fout[m].r = Fout->r - HALF_OF(scratch[3].r); - Fout[m].i = Fout->i - HALF_OF(scratch[3].i); - - C_MULBYSCALAR( scratch[0] , -epi3.i ); - - C_ADDTO(*Fout,scratch[3]); - - Fout[m2].r = Fout[m].r + scratch[0].i; - Fout[m2].i = Fout[m].i - scratch[0].r; - - Fout[m].r -= scratch[0].i; - Fout[m].i += scratch[0].r; - - ++Fout; - }while(--k); - } -} - -static void kf_bfly5( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_state *st, - int m, - int N, - int mm - ) -{ - kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; - int i, u; - kiss_fft_cpx scratch[13]; - const kiss_twiddle_cpx * twiddles = st->twiddles; - const kiss_twiddle_cpx *tw; - kiss_twiddle_cpx ya,yb; - kiss_fft_cpx * Fout_beg = Fout; - - ya = twiddles[fstride*m]; - yb = twiddles[fstride*2*m]; - tw=st->twiddles; - - for (i=0;ir += scratch[7].r + scratch[8].r; - Fout0->i += scratch[7].i + scratch[8].i; - - scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); - scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); - - scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); - scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); - - C_SUB(*Fout1,scratch[5],scratch[6]); - C_ADD(*Fout4,scratch[5],scratch[6]); - - scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); - scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); - scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); - scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); - - C_ADD(*Fout2,scratch[11],scratch[12]); - C_SUB(*Fout3,scratch[11],scratch[12]); - - ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; - } - } -} - -static void ki_bfly5( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_state *st, - int m, - int N, - int mm - ) -{ - kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; - int i, u; - kiss_fft_cpx scratch[13]; - const kiss_twiddle_cpx * twiddles = st->twiddles; - const kiss_twiddle_cpx *tw; - kiss_twiddle_cpx ya,yb; - kiss_fft_cpx * Fout_beg = Fout; - - ya = twiddles[fstride*m]; - yb = twiddles[fstride*2*m]; - tw=st->twiddles; - - for (i=0;ir += scratch[7].r + scratch[8].r; - Fout0->i += scratch[7].i + scratch[8].i; - - scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); - scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); - - scratch[6].r = -S_MUL(scratch[10].i,ya.i) - S_MUL(scratch[9].i,yb.i); - scratch[6].i = S_MUL(scratch[10].r,ya.i) + S_MUL(scratch[9].r,yb.i); - - C_SUB(*Fout1,scratch[5],scratch[6]); - C_ADD(*Fout4,scratch[5],scratch[6]); - - scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); - scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); - scratch[12].r = S_MUL(scratch[10].i,yb.i) - S_MUL(scratch[9].i,ya.i); - scratch[12].i = -S_MUL(scratch[10].r,yb.i) + S_MUL(scratch[9].r,ya.i); - - C_ADD(*Fout2,scratch[11],scratch[12]); - C_SUB(*Fout3,scratch[11],scratch[12]); - - ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; - } - } -} - -#endif - - -#ifdef CUSTOM_MODES - -static -void compute_bitrev_table( - int Fout, - opus_int16 *f, - const size_t fstride, - int in_stride, - opus_int16 * factors, - const kiss_fft_state *st - ) -{ - const int p=*factors++; /* the radix */ - const int m=*factors++; /* stage's fft length/p */ - - /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ - if (m==1) - { - int j; - for (j=0;j32000 || (opus_int32)p*(opus_int32)p > n) - p = n; /* no more factors, skip to end */ - } - n /= p; -#ifdef RADIX_TWO_ONLY - if (p!=2 && p != 4) -#else - if (p>5) -#endif - { - return 0; - } - *facbuf++ = p; - *facbuf++ = n; - } while (n > 1); - return 1; -} - -static void compute_twiddles(kiss_twiddle_cpx *twiddles, int nfft) -{ - int i; -#ifdef FIXED_POINT - for (i=0;i= memneeded) - st = (kiss_fft_state*)mem; - *lenmem = memneeded; - } - if (st) { - opus_int16 *bitrev; - kiss_twiddle_cpx *twiddles; - - st->nfft=nfft; -#ifndef FIXED_POINT - st->scale = 1.f/nfft; -#endif - if (base != NULL) - { - st->twiddles = base->twiddles; - st->shift = 0; - while (nfft<shift != base->nfft && st->shift < 32) - st->shift++; - if (st->shift>=32) - goto fail; - } else { - st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft); - compute_twiddles(twiddles, nfft); - st->shift = -1; - } - if (!kf_factor(nfft,st->factors)) - { - goto fail; - } - - /* bitrev */ - st->bitrev = bitrev = (opus_int16*)KISS_FFT_MALLOC(sizeof(opus_int16)*nfft); - if (st->bitrev==NULL) - goto fail; - compute_bitrev_table(0, bitrev, 1,1, st->factors,st); - } - return st; -fail: - opus_fft_free(st); - return NULL; -} - -kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem ) -{ - return opus_fft_alloc_twiddles(nfft, mem, lenmem, NULL); -} - -void opus_fft_free(const kiss_fft_state *cfg) -{ - if (cfg) - { - opus_free((opus_int16*)cfg->bitrev); - if (cfg->shift < 0) - opus_free((kiss_twiddle_cpx*)cfg->twiddles); - opus_free((kiss_fft_state*)cfg); - } -} - -#endif /* CUSTOM_MODES */ - -void opus_fft(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) -{ - int m2, m; - int p; - int L; - int fstride[MAXFACTORS]; - int i; - int shift; - - /* st->shift can be -1 */ - shift = st->shift>0 ? st->shift : 0; - - celt_assert2 (fin != fout, "In-place FFT not supported"); - /* Bit-reverse the input */ - for (i=0;infft;i++) - { - fout[st->bitrev[i]] = fin[i]; -#ifndef FIXED_POINT - fout[st->bitrev[i]].r *= st->scale; - fout[st->bitrev[i]].i *= st->scale; -#endif - } - - fstride[0] = 1; - L=0; - do { - p = st->factors[2*L]; - m = st->factors[2*L+1]; - fstride[L+1] = fstride[L]*p; - L++; - } while(m!=1); - m = st->factors[2*L-1]; - for (i=L-1;i>=0;i--) - { - if (i!=0) - m2 = st->factors[2*i-1]; - else - m2 = 1; - switch (st->factors[2*i]) - { - case 2: - kf_bfly2(fout,fstride[i]<shift can be -1 */ - shift = st->shift>0 ? st->shift : 0; - celt_assert2 (fin != fout, "In-place FFT not supported"); - /* Bit-reverse the input */ - for (i=0;infft;i++) - fout[st->bitrev[i]] = fin[i]; - - fstride[0] = 1; - L=0; - do { - p = st->factors[2*L]; - m = st->factors[2*L+1]; - fstride[L+1] = fstride[L]*p; - L++; - } while(m!=1); - m = st->factors[2*L-1]; - for (i=L-1;i>=0;i--) - { - if (i!=0) - m2 = st->factors[2*i-1]; - else - m2 = 1; - switch (st->factors[2*i]) - { - case 2: - ki_bfly2(fout,fstride[i]<], [ -int foo=10; -int *array = alloca(foo); -], -[ -has_alloca=yes; -if test x$has_var_arrays = "xno" ; then -AC_DEFINE([USE_ALLOCA], [], [Make use of alloca]) -fi -], -has_alloca=no -) -AC_MSG_RESULT($has_alloca) - -AC_CHECK_FUNC(exp,[fp_libm_not_needed=yes;LIBM=],[fp_libm_not_needed=dunno]) -if test x"$fp_libm_not_needed" = xdunno; then - AC_CHECK_LIB([m], [exp], [LIBS="-lm $LIBS"; LIBM="-lm"],[LIBM=]) -fi -AC_SUBST([LIBM]) - -has_float_approx=no -#case "$host_cpu" in -#i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64) -# has_float_approx=yes -# ;; -#esac - -ac_enable_fixed="no"; -ac_enable_float="yes"; -AC_ARG_ENABLE(fixed-point, [ --enable-fixed-point compile without floating point (for machines without a fast enough FPU)], -[if test "$enableval" = yes; then - ac_enable_fixed="yes"; - ac_enable_float="no"; - AC_DEFINE([FIXED_POINT], [1], [Compile as fixed-point (for machines without a fast enough FPU)]) -fi]) - -ac_enable_fixed_debug="no" -AC_ARG_ENABLE(fixed-point-debug, [ --enable-fixed-point-debug debug fixed-point implementation], -[if test "$enableval" = yes; then - ac_enable_fixed_debug="yes" - AC_DEFINE([FIXED_DEBUG], , [Debug fixed-point implementation]) -fi]) - -ac_enable_custom_modes="no" -AC_ARG_ENABLE(custom-modes, [ --enable-custom-modes enable non-Opus modes, e.g. 44.1 kHz & 2^n frames], -[if test "$enableval" = yes; then - ac_enable_custom_modes="yes" - AC_DEFINE([CUSTOM_MODES], , [Custom modes]) -fi]) - -float_approx=$has_float_approx -AC_ARG_ENABLE(float-approx, [ --enable-float-approx enable fast approximations for floating point], - [ if test "$enableval" = yes; then - AC_WARN([Floating point approximations are not supported on all platforms.]) - float_approx=yes - else - float_approx=no - fi], [ float_approx=$has_float_approx ]) - -if test "x${float_approx}" = "xyes"; then - AC_DEFINE([FLOAT_APPROX], , [Float approximations]) -fi - -ac_enable_assertions="no" -AC_ARG_ENABLE(assertions, [ --enable-assertions enable additional software error checking], -[if test "$enableval" = yes; then - ac_enable_assertions="yes" - AC_DEFINE([ENABLE_ASSERTIONS], , [Assertions]) -fi]) - -ac_enable_fuzzing="no" -AC_ARG_ENABLE(fuzzing, [ --enable-fuzzing causes the encoder to make random decisions], -[if test "$enableval" = yes; then - ac_enable_fuzzing="yes" - AC_DEFINE([FUZZING], , [Fuzzing]) -fi]) - -ac_enable_doc="yes" -AC_ARG_ENABLE([doc], - AS_HELP_STRING([--disable-doc], [Do not build API documentation]), - [ac_enable_doc=$enableval]) -AC_CHECK_PROG(HAVE_DOXYGEN, [doxygen], [yes], [no]) -if test "$HAVE_DOXYGEN" != "yes" -o "$ac_enable_doc" != "yes"; then - HAVE_DOXYGEN="false" - ac_enable_doc="no" -fi -AM_CONDITIONAL(HAVE_DOXYGEN, [test $HAVE_DOXYGEN = yes]) - -ac_enable_encoder="no"; -AC_ARG_ENABLE(encoder, [ --enable-encoder compile with encoder support], -[if test "$enableval" = yes; then - ac_enable_encoder="yes"; - AC_DEFINE([OPUS_ENABLE_ENCODER], [1], [Compile with encoder support]) -fi]) - -saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -fvisibility=hidden" -AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])], - [ AC_MSG_RESULT([yes]) - SYMBOL_VISIBILITY="-fvisibility=hidden" ], - AC_MSG_RESULT([no])) -CFLAGS="$saved_CFLAGS $SYMBOL_VISIBILITY" -AC_SUBST(SYMBOL_VISIBILITY) - -CFLAGS="$CFLAGS -W" - -saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" -AC_MSG_CHECKING([if ${CC} supports -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])], - [ AC_MSG_RESULT([yes]) - EXTRA_WARNS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" ], - AC_MSG_RESULT([no])) -CFLAGS="$saved_CFLAGS $EXTRA_WARNS" - -AC_CHECK_FUNCS([lrintf]) -AC_CHECK_FUNCS([lrint]) -AC_CHECK_FUNCS([__malloc_hook]) - -AC_CHECK_SIZEOF(short) -AC_CHECK_SIZEOF(int) -AC_CHECK_SIZEOF(long) -AC_CHECK_SIZEOF(long long) - -if test x$has_char16 = "xyes" ; then - case 1 in - $ac_cv_sizeof_short) SIZE16="short";; - $ac_cv_sizeof_int) SIZE16="int";; - esac -else - case 2 in - $ac_cv_sizeof_short) SIZE16="short";; - $ac_cv_sizeof_int) SIZE16="int";; - esac -fi - -if test x$has_char16 = "xyes" ; then - case 2 in - $ac_cv_sizeof_int) SIZE32="int";; - $ac_cv_sizeof_long) SIZE32="long";; - $ac_cv_sizeof_short) SIZE32="short";; - esac -else - case 4 in - $ac_cv_sizeof_int) SIZE32="int";; - $ac_cv_sizeof_long) SIZE32="long";; - $ac_cv_sizeof_short) SIZE32="short";; - esac -fi - -AC_SUBST(SIZE16) -AC_SUBST(SIZE32) - -AM_CONDITIONAL([FIXED_POINT], [test x$ac_enable_fixed = xyes]) -AM_CONDITIONAL([CUSTOM_MODES], [test x$ac_enable_custom_modes = xyes]) -AM_CONDITIONAL([USE_ENCODER], [test x$ac_enable_encoder = xyes]) - -dnl subsitutions for the pkg-config files -if test x$ac_enable_float = xyes; then - PC_BUILD="floating-point" - PC_LIBM=$LIBM -else - PC_BUILD="fixed-point" - PC_LIBM= -fi -dnl opus_custom requires libm as well -if test x$ac_enable_custom_modes = xyes; then - PC_BUILD="${PC_BUILD}, custom modes" - PC_LIBM=$LIBM -fi -AC_SUBST([PC_BUILD]) -AC_SUBST([PC_LIBM]) - - -AC_CONFIG_FILES([Makefile opus.pc opus-uninstalled.pc - doc/Makefile doc/Doxyfile]) -AC_CONFIG_HEADERS([config.h]) - -AC_OUTPUT - -AC_MSG_RESULT([ ------------------------------------------------------------------------- - $PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK. - - Compiler support: - - C99 var arrays: ................ ${has_var_arrays} - C99 lrintf: .................... ${ac_cv_func_lrintf} - Alloca: ........................ ${has_alloca} - - General configuration: - - Floating point support: ........ ${ac_enable_float} - Fast float approximations: ..... ${float_approx} - Fixed point debugging: ......... ${ac_enable_fixed_debug} - Encoder support: ............... ${ac_enable_encoder} - Custom modes: .................. ${ac_enable_custom_modes} - Assertion checking: ............ ${ac_enable_assertions} - Fuzzing: ....................... ${ac_enable_fuzzing} - - API documentation: ............. ${ac_enable_doc} ------------------------------------------------------------------------- -]) - -echo "Type \"make; make install\" to compile and install"; -echo "Type \"make check\" to run the test suite"; diff --git a/external/opus-1.0.3/doc/Doxyfile.in b/external/opus-1.0.3/doc/Doxyfile.in deleted file mode 100644 index 7f5f7dc1..00000000 --- a/external/opus-1.0.3/doc/Doxyfile.in +++ /dev/null @@ -1,1724 +0,0 @@ -# Doxyfile 1.7.4 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" "). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = Opus - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = @VERSION@ - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "IETF low-delay audio codec: API and operations manual" - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = YES - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. The create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = @top_srcdir@/include/opus.h \ - @top_srcdir@/include/opus_types.h \ - @top_srcdir@/include/opus_defines.h \ - @top_srcdir@/include/opus_multistream.h \ - @top_srcdir@/include/opus_custom.h - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is advised to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = @top_srcdir@/doc/header.html - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = @top_srcdir@/doc/footer.html - -# If the HTML_TIMESTAMP tag is set to YES then the generated HTML documentation will contain the timesstamp. - -HTML_TIMESTAMP = NO - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = @top_srcdir@/doc/customdoxygen.css - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = @top_srcdir@/doc/opus_logo.svg - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 0 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = YES - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = letter - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = YES - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = YES - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = OPUS_EXPORT= OPUS_CUSTOM_EXPORT= OPUS_CUSTOM_EXPORT_STATIC= OPUS_WARN_UNUSED_RESULT= OPUS_ARG_NONNULL(_x)= - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will write a font called Helvetica to the output -# directory and reference it in all dot files that doxygen generates. -# When you want a differently looking font you can specify the font name -# using DOT_FONTNAME. You need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/external/opus-1.0.3/doc/footer.html b/external/opus-1.0.3/doc/footer.html deleted file mode 100644 index 8d917c5b..00000000 --- a/external/opus-1.0.3/doc/footer.html +++ /dev/null @@ -1,20 +0,0 @@ - -

- - - - - -
-For more information visit the Opus Website. -
- - - diff --git a/external/opus-1.0.3/missing b/external/opus-1.0.3/missing deleted file mode 100755 index 86a8fc31..00000000 --- a/external/opus-1.0.3/missing +++ /dev/null @@ -1,331 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. - -scriptversion=2012-01-06.13; # UTC - -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -msg="missing on your system" - -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - yacc create \`y.tab.[ch]', if possible, from existing .[ch] - -Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and -\`g' are ignored when checking the name. - -Send bug reports to ." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - -esac - -# normalize program name to check for. -program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). This is about non-GNU programs, so use $1 not -# $program. -case $1 in - lex*|yacc*) - # Not GNU programs, they don't have --version. - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $program in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te*) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison*|yacc*) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex*|flex*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit $? - fi - ;; - - makeinfo*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/external/opus-1.0.3/opus.sln b/external/opus-1.0.3/opus.sln deleted file mode 100644 index 93b38c31..00000000 --- a/external/opus-1.0.3/opus.sln +++ /dev/null @@ -1,140 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "silk_common", "silk\silk_common.vcxproj", "{C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}" - ProjectSection(ProjectDependencies) = postProject - {245603E3-F580-41A5-9632-B25FE3372CBF} = {245603E3-F580-41A5-9632-B25FE3372CBF} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus", "src\opus.vcxproj", "{219EC965-228A-1824-174D-96449D05F88A}" - ProjectSection(ProjectDependencies) = postProject - {8484C90D-1561-402F-A91D-2DB10F8C5171} = {8484C90D-1561-402F-A91D-2DB10F8C5171} - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} - {245603E3-F580-41A5-9632-B25FE3372CBF} = {245603E3-F580-41A5-9632-B25FE3372CBF} - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "silk_fixed", "silk\fixed\silk_fixed.vcxproj", "{8484C90D-1561-402F-A91D-2DB10F8C5171}" - ProjectSection(ProjectDependencies) = postProject - {245603E3-F580-41A5-9632-B25FE3372CBF} = {245603E3-F580-41A5-9632-B25FE3372CBF} - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "silk_float", "silk\float\silk_float.vcxproj", "{9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}" - ProjectSection(ProjectDependencies) = postProject - {8484C90D-1561-402F-A91D-2DB10F8C5171} = {8484C90D-1561-402F-A91D-2DB10F8C5171} - {245603E3-F580-41A5-9632-B25FE3372CBF} = {245603E3-F580-41A5-9632-B25FE3372CBF} - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "celt", "celt\celt.vcxproj", "{245603E3-F580-41A5-9632-B25FE3372CBF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus_demo", "src\opus_demo.vcxproj", "{016C739D-6389-43BF-8D88-24B2BF6F620F}" - ProjectSection(ProjectDependencies) = postProject - {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} - {245603E3-F580-41A5-9632-B25FE3372CBF} = {245603E3-F580-41A5-9632-B25FE3372CBF} - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_api", "tests\test_opus_api.vcxproj", "{1D257A17-D254-42E5-82D6-1C87A6EC775A}" - ProjectSection(ProjectDependencies) = postProject - {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} - {245603E3-F580-41A5-9632-B25FE3372CBF} = {245603E3-F580-41A5-9632-B25FE3372CBF} - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_decode", "tests\test_opus_decode.vcxproj", "{8578322A-1883-486B-B6FA-E0094B65C9F2}" - ProjectSection(ProjectDependencies) = postProject - {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} - {245603E3-F580-41A5-9632-B25FE3372CBF} = {245603E3-F580-41A5-9632-B25FE3372CBF} - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_encode", "tests\test_opus_encode.vcxproj", "{84DAA768-1A38-4312-BB61-4C78BB59E5B8}" - ProjectSection(ProjectDependencies) = postProject - {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} - {245603E3-F580-41A5-9632-B25FE3372CBF} = {245603E3-F580-41A5-9632-B25FE3372CBF} - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.ActiveCfg = Debug|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.Build.0 = Debug|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.ActiveCfg = Debug|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.Build.0 = Debug|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.ActiveCfg = Release|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.Build.0 = Release|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.ActiveCfg = Release|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.Build.0 = Release|x64 - {219EC965-228A-1824-174D-96449D05F88A}.Debug|Win32.ActiveCfg = Debug|Win32 - {219EC965-228A-1824-174D-96449D05F88A}.Debug|Win32.Build.0 = Debug|Win32 - {219EC965-228A-1824-174D-96449D05F88A}.Debug|x64.ActiveCfg = Debug|x64 - {219EC965-228A-1824-174D-96449D05F88A}.Debug|x64.Build.0 = Debug|x64 - {219EC965-228A-1824-174D-96449D05F88A}.Release|Win32.ActiveCfg = Release|Win32 - {219EC965-228A-1824-174D-96449D05F88A}.Release|Win32.Build.0 = Release|Win32 - {219EC965-228A-1824-174D-96449D05F88A}.Release|x64.ActiveCfg = Release|x64 - {219EC965-228A-1824-174D-96449D05F88A}.Release|x64.Build.0 = Release|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.ActiveCfg = Debug|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.Build.0 = Debug|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.ActiveCfg = Debug|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.Build.0 = Debug|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.ActiveCfg = Release|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.Build.0 = Release|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.ActiveCfg = Release|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.Build.0 = Release|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.ActiveCfg = Debug|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.Build.0 = Debug|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.ActiveCfg = Debug|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.Build.0 = Debug|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.ActiveCfg = Release|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.Build.0 = Release|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.ActiveCfg = Release|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.Build.0 = Release|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.ActiveCfg = Debug|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.Build.0 = Debug|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.ActiveCfg = Debug|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.Build.0 = Debug|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.ActiveCfg = Release|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.Build.0 = Release|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.ActiveCfg = Release|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.Build.0 = Release|x64 - {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|Win32.ActiveCfg = Debug|Win32 - {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|Win32.Build.0 = Debug|Win32 - {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|x64.ActiveCfg = Debug|Win32 - {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|Win32.ActiveCfg = Release|Win32 - {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|Win32.Build.0 = Release|Win32 - {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|x64.ActiveCfg = Release|Win32 - {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|Win32.ActiveCfg = Debug|Win32 - {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|Win32.Build.0 = Debug|Win32 - {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|x64.ActiveCfg = Debug|Win32 - {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|Win32.ActiveCfg = Release|Win32 - {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|Win32.Build.0 = Release|Win32 - {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|x64.ActiveCfg = Release|Win32 - {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|Win32.ActiveCfg = Debug|Win32 - {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|Win32.Build.0 = Debug|Win32 - {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|x64.ActiveCfg = Debug|Win32 - {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|Win32.ActiveCfg = Release|Win32 - {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|Win32.Build.0 = Release|Win32 - {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|x64.ActiveCfg = Release|Win32 - {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|Win32.ActiveCfg = Debug|Win32 - {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|Win32.Build.0 = Debug|Win32 - {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|x64.ActiveCfg = Debug|Win32 - {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|Win32.ActiveCfg = Release|Win32 - {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|Win32.Build.0 = Release|Win32 - {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|x64.ActiveCfg = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/external/opus-1.0.3/opus_headers.mk b/external/opus-1.0.3/opus_headers.mk deleted file mode 100644 index f160710c..00000000 --- a/external/opus-1.0.3/opus_headers.mk +++ /dev/null @@ -1,4 +0,0 @@ -OPUS_HEAD = \ -include/opus.h \ -include/opus_multistream.h \ -src/opus_private.h diff --git a/external/opus-1.0.3/opus_sources.mk b/external/opus-1.0.3/opus_sources.mk deleted file mode 100644 index a092aff0..00000000 --- a/external/opus-1.0.3/opus_sources.mk +++ /dev/null @@ -1,6 +0,0 @@ -OPUS_SOURCES = src/opus_decoder.c \ -src/opus_multistream.c - -OPUS_SOURCES_ENC = src/opus.c \ -src/opus_encoder.c \ -src/repacketizer.c diff --git a/external/opus-1.0.3/package_version b/external/opus-1.0.3/package_version deleted file mode 100644 index 92849af8..00000000 --- a/external/opus-1.0.3/package_version +++ /dev/null @@ -1 +0,0 @@ -PACKAGE_VERSION="1.0.3" diff --git a/external/opus-1.0.3/silk/VQ_WMat_EC.c b/external/opus-1.0.3/silk/VQ_WMat_EC.c deleted file mode 100644 index a308cfbf..00000000 --- a/external/opus-1.0.3/silk/VQ_WMat_EC.c +++ /dev/null @@ -1,111 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main.h" - -/* Entropy constrained matrix-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */ -void silk_VQ_WMat_EC( - opus_int8 *ind, /* O index of best codebook vector */ - opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ - const opus_int16 *in_Q14, /* I input vector to be quantized */ - const opus_int32 *W_Q18, /* I weighting matrix */ - const opus_int8 *cb_Q7, /* I codebook */ - const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ - const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ - opus_int L /* I number of vectors in codebook */ -) -{ - opus_int k; - const opus_int8 *cb_row_Q7; - opus_int16 diff_Q14[ 5 ]; - opus_int32 sum1_Q14, sum2_Q16; - - /* Loop over codebook */ - *rate_dist_Q14 = silk_int32_MAX; - cb_row_Q7 = cb_Q7; - for( k = 0; k < L; k++ ) { - diff_Q14[ 0 ] = in_Q14[ 0 ] - silk_LSHIFT( cb_row_Q7[ 0 ], 7 ); - diff_Q14[ 1 ] = in_Q14[ 1 ] - silk_LSHIFT( cb_row_Q7[ 1 ], 7 ); - diff_Q14[ 2 ] = in_Q14[ 2 ] - silk_LSHIFT( cb_row_Q7[ 2 ], 7 ); - diff_Q14[ 3 ] = in_Q14[ 3 ] - silk_LSHIFT( cb_row_Q7[ 3 ], 7 ); - diff_Q14[ 4 ] = in_Q14[ 4 ] - silk_LSHIFT( cb_row_Q7[ 4 ], 7 ); - - /* Weighted rate */ - sum1_Q14 = silk_SMULBB( mu_Q9, cl_Q5[ k ] ); - - silk_assert( sum1_Q14 >= 0 ); - - /* first row of W_Q18 */ - sum2_Q16 = silk_SMULWB( W_Q18[ 1 ], diff_Q14[ 1 ] ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 2 ], diff_Q14[ 2 ] ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 3 ], diff_Q14[ 3 ] ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 4 ], diff_Q14[ 4 ] ); - sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 0 ], diff_Q14[ 0 ] ); - sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 0 ] ); - - /* second row of W_Q18 */ - sum2_Q16 = silk_SMULWB( W_Q18[ 7 ], diff_Q14[ 2 ] ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 8 ], diff_Q14[ 3 ] ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 9 ], diff_Q14[ 4 ] ); - sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 6 ], diff_Q14[ 1 ] ); - sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 1 ] ); - - /* third row of W_Q18 */ - sum2_Q16 = silk_SMULWB( W_Q18[ 13 ], diff_Q14[ 3 ] ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 14 ], diff_Q14[ 4 ] ); - sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 12 ], diff_Q14[ 2 ] ); - sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 2 ] ); - - /* fourth row of W_Q18 */ - sum2_Q16 = silk_SMULWB( W_Q18[ 19 ], diff_Q14[ 4 ] ); - sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); - sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 18 ], diff_Q14[ 3 ] ); - sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 3 ] ); - - /* last row of W_Q18 */ - sum2_Q16 = silk_SMULWB( W_Q18[ 24 ], diff_Q14[ 4 ] ); - sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 4 ] ); - - silk_assert( sum1_Q14 >= 0 ); - - /* find best */ - if( sum1_Q14 < *rate_dist_Q14 ) { - *rate_dist_Q14 = sum1_Q14; - *ind = (opus_int8)k; - } - - /* Go to next cbk vector */ - cb_row_Q7 += LTP_ORDER; - } -} diff --git a/external/opus-1.0.3/silk/control_SNR.c b/external/opus-1.0.3/silk/control_SNR.c deleted file mode 100644 index aea6cf20..00000000 --- a/external/opus-1.0.3/silk/control_SNR.c +++ /dev/null @@ -1,76 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main.h" -#include "tuning_parameters.h" - -/* Control SNR of redidual quantizer */ -opus_int silk_control_SNR( - silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ - opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ -) -{ - opus_int k, ret = SILK_NO_ERROR; - opus_int32 frac_Q6; - const opus_int32 *rateTable; - - /* Set bitrate/coding quality */ - TargetRate_bps = silk_LIMIT( TargetRate_bps, MIN_TARGET_RATE_BPS, MAX_TARGET_RATE_BPS ); - if( TargetRate_bps != psEncC->TargetRate_bps ) { - psEncC->TargetRate_bps = TargetRate_bps; - - /* If new TargetRate_bps, translate to SNR_dB value */ - if( psEncC->fs_kHz == 8 ) { - rateTable = silk_TargetRate_table_NB; - } else if( psEncC->fs_kHz == 12 ) { - rateTable = silk_TargetRate_table_MB; - } else { - rateTable = silk_TargetRate_table_WB; - } - - /* Reduce bitrate for 10 ms modes in these calculations */ - if( psEncC->nb_subfr == 2 ) { - TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS; - } - - /* Find bitrate interval in table and interpolate */ - for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) { - if( TargetRate_bps <= rateTable[ k ] ) { - frac_Q6 = silk_DIV32( silk_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ), - rateTable[ k ] - rateTable[ k - 1 ] ); - psEncC->SNR_dB_Q7 = silk_LSHIFT( silk_SNR_table_Q1[ k - 1 ], 6 ) + silk_MUL( frac_Q6, silk_SNR_table_Q1[ k ] - silk_SNR_table_Q1[ k - 1 ] ); - break; - } - } - } - - return ret; -} diff --git a/external/opus-1.0.3/silk/fixed/find_LTP_FIX.c b/external/opus-1.0.3/silk/fixed/find_LTP_FIX.c deleted file mode 100644 index bd210874..00000000 --- a/external/opus-1.0.3/silk/fixed/find_LTP_FIX.c +++ /dev/null @@ -1,244 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main_FIX.h" -#include "tuning_parameters.h" - -/* Head room for correlations */ -#define LTP_CORRS_HEAD_ROOM 2 - -void silk_fit_LTP( - opus_int32 LTP_coefs_Q16[ LTP_ORDER ], - opus_int16 LTP_coefs_Q14[ LTP_ORDER ] -); - -void silk_find_LTP_FIX( - opus_int16 b_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ - opus_int32 WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ - opus_int *LTPredCodGain_Q7, /* O LTP coding gain */ - const opus_int16 r_lpc[], /* I residual signal after LPC signal + state for first 10 ms */ - const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ - const opus_int32 Wght_Q15[ MAX_NB_SUBFR ], /* I weights */ - const opus_int subfr_length, /* I subframe length */ - const opus_int nb_subfr, /* I number of subframes */ - const opus_int mem_offset, /* I number of samples in LTP memory */ - opus_int corr_rshifts[ MAX_NB_SUBFR ] /* O right shifts applied to correlations */ -) -{ - opus_int i, k, lshift; - const opus_int16 *r_ptr, *lag_ptr; - opus_int16 *b_Q14_ptr; - - opus_int32 regu; - opus_int32 *WLTP_ptr; - opus_int32 b_Q16[ LTP_ORDER ], delta_b_Q14[ LTP_ORDER ], d_Q14[ MAX_NB_SUBFR ], nrg[ MAX_NB_SUBFR ], g_Q26; - opus_int32 w[ MAX_NB_SUBFR ], WLTP_max, max_abs_d_Q14, max_w_bits; - - opus_int32 temp32, denom32; - opus_int extra_shifts; - opus_int rr_shifts, maxRshifts, maxRshifts_wxtra, LZs; - opus_int32 LPC_res_nrg, LPC_LTP_res_nrg, div_Q16; - opus_int32 Rr[ LTP_ORDER ], rr[ MAX_NB_SUBFR ]; - opus_int32 wd, m_Q12; - - b_Q14_ptr = b_Q14; - WLTP_ptr = WLTP; - r_ptr = &r_lpc[ mem_offset ]; - for( k = 0; k < nb_subfr; k++ ) { - lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); - - silk_sum_sqr_shift( &rr[ k ], &rr_shifts, r_ptr, subfr_length ); /* rr[ k ] in Q( -rr_shifts ) */ - - /* Assure headroom */ - LZs = silk_CLZ32( rr[k] ); - if( LZs < LTP_CORRS_HEAD_ROOM ) { - rr[ k ] = silk_RSHIFT_ROUND( rr[ k ], LTP_CORRS_HEAD_ROOM - LZs ); - rr_shifts += ( LTP_CORRS_HEAD_ROOM - LZs ); - } - corr_rshifts[ k ] = rr_shifts; - silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, LTP_CORRS_HEAD_ROOM, WLTP_ptr, &corr_rshifts[ k ] ); /* WLTP_fix_ptr in Q( -corr_rshifts[ k ] ) */ - - /* The correlation vector always has lower max abs value than rr and/or RR so head room is assured */ - silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, Rr, corr_rshifts[ k ] ); /* Rr_fix_ptr in Q( -corr_rshifts[ k ] ) */ - if( corr_rshifts[ k ] > rr_shifts ) { - rr[ k ] = silk_RSHIFT( rr[ k ], corr_rshifts[ k ] - rr_shifts ); /* rr[ k ] in Q( -corr_rshifts[ k ] ) */ - } - silk_assert( rr[ k ] >= 0 ); - - regu = 1; - regu = silk_SMLAWB( regu, rr[ k ], SILK_FIX_CONST( LTP_DAMPING/3, 16 ) ); - regu = silk_SMLAWB( regu, matrix_ptr( WLTP_ptr, 0, 0, LTP_ORDER ), SILK_FIX_CONST( LTP_DAMPING/3, 16 ) ); - regu = silk_SMLAWB( regu, matrix_ptr( WLTP_ptr, LTP_ORDER-1, LTP_ORDER-1, LTP_ORDER ), SILK_FIX_CONST( LTP_DAMPING/3, 16 ) ); - silk_regularize_correlations_FIX( WLTP_ptr, &rr[k], regu, LTP_ORDER ); - - silk_solve_LDL_FIX( WLTP_ptr, LTP_ORDER, Rr, b_Q16 ); /* WLTP_fix_ptr and Rr_fix_ptr both in Q(-corr_rshifts[k]) */ - - /* Limit and store in Q14 */ - silk_fit_LTP( b_Q16, b_Q14_ptr ); - - /* Calculate residual energy */ - nrg[ k ] = silk_residual_energy16_covar_FIX( b_Q14_ptr, WLTP_ptr, Rr, rr[ k ], LTP_ORDER, 14 ); /* nrg_fix in Q( -corr_rshifts[ k ] ) */ - - /* temp = Wght[ k ] / ( nrg[ k ] * Wght[ k ] + 0.01f * subfr_length ); */ - extra_shifts = silk_min_int( corr_rshifts[ k ], LTP_CORRS_HEAD_ROOM ); - denom32 = silk_LSHIFT_SAT32( silk_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 + extra_shifts ) + /* Q( -corr_rshifts[ k ] + extra_shifts ) */ - silk_RSHIFT( silk_SMULWB( (opus_int32)subfr_length, 655 ), corr_rshifts[ k ] - extra_shifts ); /* Q( -corr_rshifts[ k ] + extra_shifts ) */ - denom32 = silk_max( denom32, 1 ); - silk_assert( ((opus_int64)Wght_Q15[ k ] << 16 ) < silk_int32_MAX ); /* Wght always < 0.5 in Q0 */ - temp32 = silk_DIV32( silk_LSHIFT( (opus_int32)Wght_Q15[ k ], 16 ), denom32 ); /* Q( 15 + 16 + corr_rshifts[k] - extra_shifts ) */ - temp32 = silk_RSHIFT( temp32, 31 + corr_rshifts[ k ] - extra_shifts - 26 ); /* Q26 */ - - /* Limit temp such that the below scaling never wraps around */ - WLTP_max = 0; - for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { - WLTP_max = silk_max( WLTP_ptr[ i ], WLTP_max ); - } - lshift = silk_CLZ32( WLTP_max ) - 1 - 3; /* keep 3 bits free for vq_nearest_neighbor_fix */ - silk_assert( 26 - 18 + lshift >= 0 ); - if( 26 - 18 + lshift < 31 ) { - temp32 = silk_min_32( temp32, silk_LSHIFT( (opus_int32)1, 26 - 18 + lshift ) ); - } - - silk_scale_vector32_Q26_lshift_18( WLTP_ptr, temp32, LTP_ORDER * LTP_ORDER ); /* WLTP_ptr in Q( 18 - corr_rshifts[ k ] ) */ - - w[ k ] = matrix_ptr( WLTP_ptr, LTP_ORDER/2, LTP_ORDER/2, LTP_ORDER ); /* w in Q( 18 - corr_rshifts[ k ] ) */ - silk_assert( w[k] >= 0 ); - - r_ptr += subfr_length; - b_Q14_ptr += LTP_ORDER; - WLTP_ptr += LTP_ORDER * LTP_ORDER; - } - - maxRshifts = 0; - for( k = 0; k < nb_subfr; k++ ) { - maxRshifts = silk_max_int( corr_rshifts[ k ], maxRshifts ); - } - - /* Compute LTP coding gain */ - if( LTPredCodGain_Q7 != NULL ) { - LPC_LTP_res_nrg = 0; - LPC_res_nrg = 0; - silk_assert( LTP_CORRS_HEAD_ROOM >= 2 ); /* Check that no overflow will happen when adding */ - for( k = 0; k < nb_subfr; k++ ) { - LPC_res_nrg = silk_ADD32( LPC_res_nrg, silk_RSHIFT( silk_ADD32( silk_SMULWB( rr[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */ - LPC_LTP_res_nrg = silk_ADD32( LPC_LTP_res_nrg, silk_RSHIFT( silk_ADD32( silk_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */ - } - LPC_LTP_res_nrg = silk_max( LPC_LTP_res_nrg, 1 ); /* avoid division by zero */ - - div_Q16 = silk_DIV32_varQ( LPC_res_nrg, LPC_LTP_res_nrg, 16 ); - *LTPredCodGain_Q7 = ( opus_int )silk_SMULBB( 3, silk_lin2log( div_Q16 ) - ( 16 << 7 ) ); - - silk_assert( *LTPredCodGain_Q7 == ( opus_int )silk_SAT16( silk_MUL( 3, silk_lin2log( div_Q16 ) - ( 16 << 7 ) ) ) ); - } - - /* smoothing */ - /* d = sum( B, 1 ); */ - b_Q14_ptr = b_Q14; - for( k = 0; k < nb_subfr; k++ ) { - d_Q14[ k ] = 0; - for( i = 0; i < LTP_ORDER; i++ ) { - d_Q14[ k ] += b_Q14_ptr[ i ]; - } - b_Q14_ptr += LTP_ORDER; - } - - /* m = ( w * d' ) / ( sum( w ) + 1e-3 ); */ - - /* Find maximum absolute value of d_Q14 and the bits used by w in Q0 */ - max_abs_d_Q14 = 0; - max_w_bits = 0; - for( k = 0; k < nb_subfr; k++ ) { - max_abs_d_Q14 = silk_max_32( max_abs_d_Q14, silk_abs( d_Q14[ k ] ) ); - /* w[ k ] is in Q( 18 - corr_rshifts[ k ] ) */ - /* Find bits needed in Q( 18 - maxRshifts ) */ - max_w_bits = silk_max_32( max_w_bits, 32 - silk_CLZ32( w[ k ] ) + corr_rshifts[ k ] - maxRshifts ); - } - - /* max_abs_d_Q14 = (5 << 15); worst case, i.e. LTP_ORDER * -silk_int16_MIN */ - silk_assert( max_abs_d_Q14 <= ( 5 << 15 ) ); - - /* How many bits is needed for w*d' in Q( 18 - maxRshifts ) in the worst case, of all d_Q14's being equal to max_abs_d_Q14 */ - extra_shifts = max_w_bits + 32 - silk_CLZ32( max_abs_d_Q14 ) - 14; - - /* Subtract what we got available; bits in output var plus maxRshifts */ - extra_shifts -= ( 32 - 1 - 2 + maxRshifts ); /* Keep sign bit free as well as 2 bits for accumulation */ - extra_shifts = silk_max_int( extra_shifts, 0 ); - - maxRshifts_wxtra = maxRshifts + extra_shifts; - - temp32 = silk_RSHIFT( 262, maxRshifts + extra_shifts ) + 1; /* 1e-3f in Q( 18 - (maxRshifts + extra_shifts) ) */ - wd = 0; - for( k = 0; k < nb_subfr; k++ ) { - /* w has at least 2 bits of headroom so no overflow should happen */ - temp32 = silk_ADD32( temp32, silk_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ) ); /* Q( 18 - maxRshifts_wxtra ) */ - wd = silk_ADD32( wd, silk_LSHIFT( silk_SMULWW( silk_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ), d_Q14[ k ] ), 2 ) ); /* Q( 18 - maxRshifts_wxtra ) */ - } - m_Q12 = silk_DIV32_varQ( wd, temp32, 12 ); - - b_Q14_ptr = b_Q14; - for( k = 0; k < nb_subfr; k++ ) { - /* w_fix[ k ] from Q( 18 - corr_rshifts[ k ] ) to Q( 16 ) */ - if( 2 - corr_rshifts[k] > 0 ) { - temp32 = silk_RSHIFT( w[ k ], 2 - corr_rshifts[ k ] ); - } else { - temp32 = silk_LSHIFT_SAT32( w[ k ], corr_rshifts[ k ] - 2 ); - } - - g_Q26 = silk_MUL( - silk_DIV32( - SILK_FIX_CONST( LTP_SMOOTHING, 26 ), - silk_RSHIFT( SILK_FIX_CONST( LTP_SMOOTHING, 26 ), 10 ) + temp32 ), /* Q10 */ - silk_LSHIFT_SAT32( silk_SUB_SAT32( (opus_int32)m_Q12, silk_RSHIFT( d_Q14[ k ], 2 ) ), 4 ) ); /* Q16 */ - - temp32 = 0; - for( i = 0; i < LTP_ORDER; i++ ) { - delta_b_Q14[ i ] = silk_max_16( b_Q14_ptr[ i ], 1638 ); /* 1638_Q14 = 0.1_Q0 */ - temp32 += delta_b_Q14[ i ]; /* Q14 */ - } - temp32 = silk_DIV32( g_Q26, temp32 ); /* Q14 -> Q12 */ - for( i = 0; i < LTP_ORDER; i++ ) { - b_Q14_ptr[ i ] = silk_LIMIT_32( (opus_int32)b_Q14_ptr[ i ] + silk_SMULWB( silk_LSHIFT_SAT32( temp32, 4 ), delta_b_Q14[ i ] ), -16000, 28000 ); - } - b_Q14_ptr += LTP_ORDER; - } -} - -void silk_fit_LTP( - opus_int32 LTP_coefs_Q16[ LTP_ORDER ], - opus_int16 LTP_coefs_Q14[ LTP_ORDER ] -) -{ - opus_int i; - - for( i = 0; i < LTP_ORDER; i++ ) { - LTP_coefs_Q14[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( LTP_coefs_Q16[ i ], 2 ) ); - } -} diff --git a/external/opus-1.0.3/silk/fixed/prefilter_FIX.c b/external/opus-1.0.3/silk/fixed/prefilter_FIX.c deleted file mode 100644 index a96f5118..00000000 --- a/external/opus-1.0.3/silk/fixed/prefilter_FIX.c +++ /dev/null @@ -1,204 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main_FIX.h" -#include "tuning_parameters.h" - -/* Prefilter for finding Quantizer input signal */ -static inline void silk_prefilt_FIX( - silk_prefilter_state_FIX *P, /* I/O state */ - opus_int32 st_res_Q12[], /* I short term residual signal */ - opus_int32 xw_Q3[], /* O prefiltered signal */ - opus_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */ - opus_int Tilt_Q14, /* I Tilt shaping coeficient */ - opus_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients */ - opus_int lag, /* I Lag for harmonic shaping */ - opus_int length /* I Length of signals */ -); - -void silk_warped_LPC_analysis_filter_FIX( - opus_int32 state[], /* I/O State [order + 1] */ - opus_int32 res_Q2[], /* O Residual signal [length] */ - const opus_int16 coef_Q13[], /* I Coefficients [order] */ - const opus_int16 input[], /* I Input signal [length] */ - const opus_int16 lambda_Q16, /* I Warping factor */ - const opus_int length, /* I Length of input signal */ - const opus_int order /* I Filter order (even) */ -) -{ - opus_int n, i; - opus_int32 acc_Q11, tmp1, tmp2; - - /* Order must be even */ - silk_assert( ( order & 1 ) == 0 ); - - for( n = 0; n < length; n++ ) { - /* Output of lowpass section */ - tmp2 = silk_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 ); - state[ 0 ] = silk_LSHIFT( input[ n ], 14 ); - /* Output of allpass section */ - tmp1 = silk_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 ); - state[ 1 ] = tmp2; - acc_Q11 = silk_RSHIFT( order, 1 ); - acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ 0 ] ); - /* Loop over allpass sections */ - for( i = 2; i < order; i += 2 ) { - /* Output of allpass section */ - tmp2 = silk_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 ); - state[ i ] = tmp1; - acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] ); - /* Output of allpass section */ - tmp1 = silk_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 ); - state[ i + 1 ] = tmp2; - acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] ); - } - state[ order ] = tmp1; - acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] ); - res_Q2[ n ] = silk_LSHIFT( (opus_int32)input[ n ], 2 ) - silk_RSHIFT_ROUND( acc_Q11, 9 ); - } -} - -void silk_prefilter_FIX( - silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ - const silk_encoder_control_FIX *psEncCtrl, /* I Encoder control */ - opus_int32 xw_Q3[], /* O Weighted signal */ - const opus_int16 x[] /* I Speech signal */ -) -{ - silk_prefilter_state_FIX *P = &psEnc->sPrefilt; - opus_int j, k, lag; - opus_int32 tmp_32; - const opus_int16 *AR1_shp_Q13; - const opus_int16 *px; - opus_int32 *pxw_Q3; - opus_int HarmShapeGain_Q12, Tilt_Q14; - opus_int32 HarmShapeFIRPacked_Q12, LF_shp_Q14; - opus_int32 x_filt_Q12[ MAX_SUB_FRAME_LENGTH ]; - opus_int32 st_res_Q2[ MAX_SUB_FRAME_LENGTH + MAX_LPC_ORDER ]; - opus_int16 B_Q10[ 2 ]; - - /* Set up pointers */ - px = x; - pxw_Q3 = xw_Q3; - lag = P->lagPrev; - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - /* Update Variables that change per sub frame */ - if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { - lag = psEncCtrl->pitchL[ k ]; - } - - /* Noise shape parameters */ - HarmShapeGain_Q12 = silk_SMULWB( (opus_int32)psEncCtrl->HarmShapeGain_Q14[ k ], 16384 - psEncCtrl->HarmBoost_Q14[ k ] ); - silk_assert( HarmShapeGain_Q12 >= 0 ); - HarmShapeFIRPacked_Q12 = silk_RSHIFT( HarmShapeGain_Q12, 2 ); - HarmShapeFIRPacked_Q12 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q12, 1 ), 16 ); - Tilt_Q14 = psEncCtrl->Tilt_Q14[ k ]; - LF_shp_Q14 = psEncCtrl->LF_shp_Q14[ k ]; - AR1_shp_Q13 = &psEncCtrl->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER ]; - - /* Short term FIR filtering*/ - silk_warped_LPC_analysis_filter_FIX( P->sAR_shp, st_res_Q2, AR1_shp_Q13, px, - psEnc->sCmn.warping_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.shapingLPCOrder ); - - /* Reduce (mainly) low frequencies during harmonic emphasis */ - B_Q10[ 0 ] = silk_RSHIFT_ROUND( psEncCtrl->GainsPre_Q14[ k ], 4 ); - tmp_32 = silk_SMLABB( SILK_FIX_CONST( INPUT_TILT, 26 ), psEncCtrl->HarmBoost_Q14[ k ], HarmShapeGain_Q12 ); /* Q26 */ - tmp_32 = silk_SMLABB( tmp_32, psEncCtrl->coding_quality_Q14, SILK_FIX_CONST( HIGH_RATE_INPUT_TILT, 12 ) ); /* Q26 */ - tmp_32 = silk_SMULWB( tmp_32, -psEncCtrl->GainsPre_Q14[ k ] ); /* Q24 */ - tmp_32 = silk_RSHIFT_ROUND( tmp_32, 14 ); /* Q10 */ - B_Q10[ 1 ]= silk_SAT16( tmp_32 ); - x_filt_Q12[ 0 ] = silk_MLA( silk_MUL( st_res_Q2[ 0 ], B_Q10[ 0 ] ), P->sHarmHP_Q2, B_Q10[ 1 ] ); - for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) { - x_filt_Q12[ j ] = silk_MLA( silk_MUL( st_res_Q2[ j ], B_Q10[ 0 ] ), st_res_Q2[ j - 1 ], B_Q10[ 1 ] ); - } - P->sHarmHP_Q2 = st_res_Q2[ psEnc->sCmn.subfr_length - 1 ]; - - silk_prefilt_FIX( P, x_filt_Q12, pxw_Q3, HarmShapeFIRPacked_Q12, Tilt_Q14, LF_shp_Q14, lag, psEnc->sCmn.subfr_length ); - - px += psEnc->sCmn.subfr_length; - pxw_Q3 += psEnc->sCmn.subfr_length; - } - - P->lagPrev = psEncCtrl->pitchL[ psEnc->sCmn.nb_subfr - 1 ]; -} - -/* Prefilter for finding Quantizer input signal */ -static inline void silk_prefilt_FIX( - silk_prefilter_state_FIX *P, /* I/O state */ - opus_int32 st_res_Q12[], /* I short term residual signal */ - opus_int32 xw_Q3[], /* O prefiltered signal */ - opus_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */ - opus_int Tilt_Q14, /* I Tilt shaping coeficient */ - opus_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients */ - opus_int lag, /* I Lag for harmonic shaping */ - opus_int length /* I Length of signals */ -) -{ - opus_int i, idx, LTP_shp_buf_idx; - opus_int32 n_LTP_Q12, n_Tilt_Q10, n_LF_Q10; - opus_int32 sLF_MA_shp_Q12, sLF_AR_shp_Q12; - opus_int16 *LTP_shp_buf; - - /* To speed up use temp variables instead of using the struct */ - LTP_shp_buf = P->sLTP_shp; - LTP_shp_buf_idx = P->sLTP_shp_buf_idx; - sLF_AR_shp_Q12 = P->sLF_AR_shp_Q12; - sLF_MA_shp_Q12 = P->sLF_MA_shp_Q12; - - for( i = 0; i < length; i++ ) { - if( lag > 0 ) { - /* unrolled loop */ - silk_assert( HARM_SHAPE_FIR_TAPS == 3 ); - idx = lag + LTP_shp_buf_idx; - n_LTP_Q12 = silk_SMULBB( LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); - n_LTP_Q12 = silk_SMLABT( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); - n_LTP_Q12 = silk_SMLABB( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); - } else { - n_LTP_Q12 = 0; - } - - n_Tilt_Q10 = silk_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 ); - n_LF_Q10 = silk_SMLAWB( silk_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 ); - - sLF_AR_shp_Q12 = silk_SUB32( st_res_Q12[ i ], silk_LSHIFT( n_Tilt_Q10, 2 ) ); - sLF_MA_shp_Q12 = silk_SUB32( sLF_AR_shp_Q12, silk_LSHIFT( n_LF_Q10, 2 ) ); - - LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; - LTP_shp_buf[ LTP_shp_buf_idx ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) ); - - xw_Q3[i] = silk_RSHIFT_ROUND( silk_SUB32( sLF_MA_shp_Q12, n_LTP_Q12 ), 9 ); - } - - /* Copy temp variable back to state */ - P->sLF_AR_shp_Q12 = sLF_AR_shp_Q12; - P->sLF_MA_shp_Q12 = sLF_MA_shp_Q12; - P->sLTP_shp_buf_idx = LTP_shp_buf_idx; -} diff --git a/external/opus-1.0.3/silk/fixed/silk_fixed.vcxproj b/external/opus-1.0.3/silk/fixed/silk_fixed.vcxproj deleted file mode 100644 index 5c94b30c..00000000 --- a/external/opus-1.0.3/silk/fixed/silk_fixed.vcxproj +++ /dev/null @@ -1,186 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {8484C90D-1561-402F-A91D-2DB10F8C5171} - Win32Proj - src_FIX - silk_fixed - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - ../;../../win32;../../celt;../../include - MultiThreadedDebug - - - Windows - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - ../;../../win32;../../celt;../../include - MultiThreadedDebug - - - Windows - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - - - Level3 - - - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - ../;../../win32;../../celt;../../include - MultiThreaded - - - Windows - true - true - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - - - Level3 - - - MaxSpeed - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - ../;../../win32;../../celt;../../include - MultiThreaded - - - Windows - true - true - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/external/opus-1.0.3/silk/fixed/silk_fixed.vcxproj.filters b/external/opus-1.0.3/silk/fixed/silk_fixed.vcxproj.filters deleted file mode 100644 index 7f67bcd2..00000000 --- a/external/opus-1.0.3/silk/fixed/silk_fixed.vcxproj.filters +++ /dev/null @@ -1,111 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/external/opus-1.0.3/silk/fixed/solve_LS_FIX.c b/external/opus-1.0.3/silk/fixed/solve_LS_FIX.c deleted file mode 100644 index fb913abe..00000000 --- a/external/opus-1.0.3/silk/fixed/solve_LS_FIX.c +++ /dev/null @@ -1,245 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main_FIX.h" -#include "tuning_parameters.h" - -/*****************************/ -/* Internal function headers */ -/*****************************/ - -typedef struct { - opus_int32 Q36_part; - opus_int32 Q48_part; -} inv_D_t; - -/* Factorize square matrix A into LDL form */ -static inline void silk_LDL_factorize_FIX( - opus_int32 *A, /* I/O Pointer to Symetric Square Matrix */ - opus_int M, /* I Size of Matrix */ - opus_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */ - inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */ -); - -/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */ -static inline void silk_LS_SolveFirst_FIX( - const opus_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ - opus_int M, /* I Dim of Matrix equation */ - const opus_int32 *b, /* I b Vector */ - opus_int32 *x_Q16 /* O x Vector */ -); - -/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */ -static inline void silk_LS_SolveLast_FIX( - const opus_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ - const opus_int M, /* I Dim of Matrix equation */ - const opus_int32 *b, /* I b Vector */ - opus_int32 *x_Q16 /* O x Vector */ -); - -static inline void silk_LS_divide_Q16_FIX( - opus_int32 T[], /* I/O Numenator vector */ - inv_D_t *inv_D, /* I 1 / D vector */ - opus_int M /* I dimension */ -); - -/* Solves Ax = b, assuming A is symmetric */ -void silk_solve_LDL_FIX( - opus_int32 *A, /* I Pointer to symetric square matrix A */ - opus_int M, /* I Size of matrix */ - const opus_int32 *b, /* I Pointer to b vector */ - opus_int32 *x_Q16 /* O Pointer to x solution vector */ -) -{ - opus_int32 L_Q16[ MAX_MATRIX_SIZE * MAX_MATRIX_SIZE ]; - opus_int32 Y[ MAX_MATRIX_SIZE ]; - inv_D_t inv_D[ MAX_MATRIX_SIZE ]; - - silk_assert( M <= MAX_MATRIX_SIZE ); - - /*************************************************** - Factorize A by LDL such that A = L*D*L', - where L is lower triangular with ones on diagonal - ****************************************************/ - silk_LDL_factorize_FIX( A, M, L_Q16, inv_D ); - - /**************************************************** - * substitute D*L'*x = Y. ie: - L*D*L'*x = b => L*Y = b <=> Y = inv(L)*b - ******************************************************/ - silk_LS_SolveFirst_FIX( L_Q16, M, b, Y ); - - /**************************************************** - D*L'*x = Y <=> L'*x = inv(D)*Y, because D is - diagonal just multiply with 1/d_i - ****************************************************/ - silk_LS_divide_Q16_FIX( Y, inv_D, M ); - - /**************************************************** - x = inv(L') * inv(D) * Y - *****************************************************/ - silk_LS_SolveLast_FIX( L_Q16, M, Y, x_Q16 ); -} - -static inline void silk_LDL_factorize_FIX( - opus_int32 *A, /* I/O Pointer to Symetric Square Matrix */ - opus_int M, /* I Size of Matrix */ - opus_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */ - inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */ -) -{ - opus_int i, j, k, status, loop_count; - const opus_int32 *ptr1, *ptr2; - opus_int32 diag_min_value, tmp_32, err; - opus_int32 v_Q0[ MAX_MATRIX_SIZE ], D_Q0[ MAX_MATRIX_SIZE ]; - opus_int32 one_div_diag_Q36, one_div_diag_Q40, one_div_diag_Q48; - - silk_assert( M <= MAX_MATRIX_SIZE ); - - status = 1; - diag_min_value = silk_max_32( silk_SMMUL( silk_ADD_SAT32( A[ 0 ], A[ silk_SMULBB( M, M ) - 1 ] ), SILK_FIX_CONST( FIND_LTP_COND_FAC, 31 ) ), 1 << 9 ); - for( loop_count = 0; loop_count < M && status == 1; loop_count++ ) { - status = 0; - for( j = 0; j < M; j++ ) { - ptr1 = matrix_adr( L_Q16, j, 0, M ); - tmp_32 = 0; - for( i = 0; i < j; i++ ) { - v_Q0[ i ] = silk_SMULWW( D_Q0[ i ], ptr1[ i ] ); /* Q0 */ - tmp_32 = silk_SMLAWW( tmp_32, v_Q0[ i ], ptr1[ i ] ); /* Q0 */ - } - tmp_32 = silk_SUB32( matrix_ptr( A, j, j, M ), tmp_32 ); - - if( tmp_32 < diag_min_value ) { - tmp_32 = silk_SUB32( silk_SMULBB( loop_count + 1, diag_min_value ), tmp_32 ); - /* Matrix not positive semi-definite, or ill conditioned */ - for( i = 0; i < M; i++ ) { - matrix_ptr( A, i, i, M ) = silk_ADD32( matrix_ptr( A, i, i, M ), tmp_32 ); - } - status = 1; - break; - } - D_Q0[ j ] = tmp_32; /* always < max(Correlation) */ - - /* two-step division */ - one_div_diag_Q36 = silk_INVERSE32_varQ( tmp_32, 36 ); /* Q36 */ - one_div_diag_Q40 = silk_LSHIFT( one_div_diag_Q36, 4 ); /* Q40 */ - err = silk_SUB32( (opus_int32)1 << 24, silk_SMULWW( tmp_32, one_div_diag_Q40 ) ); /* Q24 */ - one_div_diag_Q48 = silk_SMULWW( err, one_div_diag_Q40 ); /* Q48 */ - - /* Save 1/Ds */ - inv_D[ j ].Q36_part = one_div_diag_Q36; - inv_D[ j ].Q48_part = one_div_diag_Q48; - - matrix_ptr( L_Q16, j, j, M ) = 65536; /* 1.0 in Q16 */ - ptr1 = matrix_adr( A, j, 0, M ); - ptr2 = matrix_adr( L_Q16, j + 1, 0, M ); - for( i = j + 1; i < M; i++ ) { - tmp_32 = 0; - for( k = 0; k < j; k++ ) { - tmp_32 = silk_SMLAWW( tmp_32, v_Q0[ k ], ptr2[ k ] ); /* Q0 */ - } - tmp_32 = silk_SUB32( ptr1[ i ], tmp_32 ); /* always < max(Correlation) */ - - /* tmp_32 / D_Q0[j] : Divide to Q16 */ - matrix_ptr( L_Q16, i, j, M ) = silk_ADD32( silk_SMMUL( tmp_32, one_div_diag_Q48 ), - silk_RSHIFT( silk_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) ); - - /* go to next column */ - ptr2 += M; - } - } - } - - silk_assert( status == 0 ); -} - -static inline void silk_LS_divide_Q16_FIX( - opus_int32 T[], /* I/O Numenator vector */ - inv_D_t *inv_D, /* I 1 / D vector */ - opus_int M /* I dimension */ -) -{ - opus_int i; - opus_int32 tmp_32; - opus_int32 one_div_diag_Q36, one_div_diag_Q48; - - for( i = 0; i < M; i++ ) { - one_div_diag_Q36 = inv_D[ i ].Q36_part; - one_div_diag_Q48 = inv_D[ i ].Q48_part; - - tmp_32 = T[ i ]; - T[ i ] = silk_ADD32( silk_SMMUL( tmp_32, one_div_diag_Q48 ), silk_RSHIFT( silk_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) ); - } -} - -/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */ -static inline void silk_LS_SolveFirst_FIX( - const opus_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ - opus_int M, /* I Dim of Matrix equation */ - const opus_int32 *b, /* I b Vector */ - opus_int32 *x_Q16 /* O x Vector */ -) -{ - opus_int i, j; - const opus_int32 *ptr32; - opus_int32 tmp_32; - - for( i = 0; i < M; i++ ) { - ptr32 = matrix_adr( L_Q16, i, 0, M ); - tmp_32 = 0; - for( j = 0; j < i; j++ ) { - tmp_32 = silk_SMLAWW( tmp_32, ptr32[ j ], x_Q16[ j ] ); - } - x_Q16[ i ] = silk_SUB32( b[ i ], tmp_32 ); - } -} - -/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */ -static inline void silk_LS_SolveLast_FIX( - const opus_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ - const opus_int M, /* I Dim of Matrix equation */ - const opus_int32 *b, /* I b Vector */ - opus_int32 *x_Q16 /* O x Vector */ -) -{ - opus_int i, j; - const opus_int32 *ptr32; - opus_int32 tmp_32; - - for( i = M - 1; i >= 0; i-- ) { - ptr32 = matrix_adr( L_Q16, 0, i, M ); - tmp_32 = 0; - for( j = M - 1; j > i; j-- ) { - tmp_32 = silk_SMLAWW( tmp_32, ptr32[ silk_SMULBB( j, M ) ], x_Q16[ j ] ); - } - x_Q16[ i ] = silk_SUB32( b[ i ], tmp_32 ); - } -} diff --git a/external/opus-1.0.3/silk/float/find_LTP_FLP.c b/external/opus-1.0.3/silk/float/find_LTP_FLP.c deleted file mode 100644 index 0a3c71bb..00000000 --- a/external/opus-1.0.3/silk/float/find_LTP_FLP.c +++ /dev/null @@ -1,132 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main_FLP.h" -#include "tuning_parameters.h" - -void silk_find_LTP_FLP( - silk_float b[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ - silk_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ - silk_float *LTPredCodGain, /* O LTP coding gain */ - const silk_float r_lpc[], /* I LPC residual */ - const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ - const silk_float Wght[ MAX_NB_SUBFR ], /* I Weights */ - const opus_int subfr_length, /* I Subframe length */ - const opus_int nb_subfr, /* I number of subframes */ - const opus_int mem_offset /* I Number of samples in LTP memory */ -) -{ - opus_int i, k; - silk_float *b_ptr, temp, *WLTP_ptr; - silk_float LPC_res_nrg, LPC_LTP_res_nrg; - silk_float d[ MAX_NB_SUBFR ], m, g, delta_b[ LTP_ORDER ]; - silk_float w[ MAX_NB_SUBFR ], nrg[ MAX_NB_SUBFR ], regu; - silk_float Rr[ LTP_ORDER ], rr[ MAX_NB_SUBFR ]; - const silk_float *r_ptr, *lag_ptr; - - b_ptr = b; - WLTP_ptr = WLTP; - r_ptr = &r_lpc[ mem_offset ]; - for( k = 0; k < nb_subfr; k++ ) { - lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); - - silk_corrMatrix_FLP( lag_ptr, subfr_length, LTP_ORDER, WLTP_ptr ); - silk_corrVector_FLP( lag_ptr, r_ptr, subfr_length, LTP_ORDER, Rr ); - - rr[ k ] = ( silk_float )silk_energy_FLP( r_ptr, subfr_length ); - regu = 1.0f + rr[ k ] + - matrix_ptr( WLTP_ptr, 0, 0, LTP_ORDER ) + - matrix_ptr( WLTP_ptr, LTP_ORDER-1, LTP_ORDER-1, LTP_ORDER ); - regu *= LTP_DAMPING / 3; - silk_regularize_correlations_FLP( WLTP_ptr, &rr[ k ], regu, LTP_ORDER ); - silk_solve_LDL_FLP( WLTP_ptr, LTP_ORDER, Rr, b_ptr ); - - /* Calculate residual energy */ - nrg[ k ] = silk_residual_energy_covar_FLP( b_ptr, WLTP_ptr, Rr, rr[ k ], LTP_ORDER ); - - temp = Wght[ k ] / ( nrg[ k ] * Wght[ k ] + 0.01f * subfr_length ); - silk_scale_vector_FLP( WLTP_ptr, temp, LTP_ORDER * LTP_ORDER ); - w[ k ] = matrix_ptr( WLTP_ptr, LTP_ORDER / 2, LTP_ORDER / 2, LTP_ORDER ); - - r_ptr += subfr_length; - b_ptr += LTP_ORDER; - WLTP_ptr += LTP_ORDER * LTP_ORDER; - } - - /* Compute LTP coding gain */ - if( LTPredCodGain != NULL ) { - LPC_LTP_res_nrg = 1e-6f; - LPC_res_nrg = 0.0f; - for( k = 0; k < nb_subfr; k++ ) { - LPC_res_nrg += rr[ k ] * Wght[ k ]; - LPC_LTP_res_nrg += nrg[ k ] * Wght[ k ]; - } - - silk_assert( LPC_LTP_res_nrg > 0 ); - *LTPredCodGain = 3.0f * silk_log2( LPC_res_nrg / LPC_LTP_res_nrg ); - } - - /* Smoothing */ - /* d = sum( B, 1 ); */ - b_ptr = b; - for( k = 0; k < nb_subfr; k++ ) { - d[ k ] = 0; - for( i = 0; i < LTP_ORDER; i++ ) { - d[ k ] += b_ptr[ i ]; - } - b_ptr += LTP_ORDER; - } - /* m = ( w * d' ) / ( sum( w ) + 1e-3 ); */ - temp = 1e-3f; - for( k = 0; k < nb_subfr; k++ ) { - temp += w[ k ]; - } - m = 0; - for( k = 0; k < nb_subfr; k++ ) { - m += d[ k ] * w[ k ]; - } - m = m / temp; - - b_ptr = b; - for( k = 0; k < nb_subfr; k++ ) { - g = LTP_SMOOTHING / ( LTP_SMOOTHING + w[ k ] ) * ( m - d[ k ] ); - temp = 0; - for( i = 0; i < LTP_ORDER; i++ ) { - delta_b[ i ] = silk_max_float( b_ptr[ i ], 0.1f ); - temp += delta_b[ i ]; - } - temp = g / temp; - for( i = 0; i < LTP_ORDER; i++ ) { - b_ptr[ i ] = b_ptr[ i ] + delta_b[ i ] * temp; - } - b_ptr += LTP_ORDER; - } -} diff --git a/external/opus-1.0.3/silk/float/prefilter_FLP.c b/external/opus-1.0.3/silk/float/prefilter_FLP.c deleted file mode 100644 index d6c84398..00000000 --- a/external/opus-1.0.3/silk/float/prefilter_FLP.c +++ /dev/null @@ -1,206 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main_FLP.h" -#include "tuning_parameters.h" - -/* -* Prefilter for finding Quantizer input signal -*/ -static inline void silk_prefilt_FLP( - silk_prefilter_state_FLP *P, /* I/O state */ - silk_float st_res[], /* I */ - silk_float xw[], /* O */ - silk_float *HarmShapeFIR, /* I */ - silk_float Tilt, /* I */ - silk_float LF_MA_shp, /* I */ - silk_float LF_AR_shp, /* I */ - opus_int lag, /* I */ - opus_int length /* I */ -); - -static void silk_warped_LPC_analysis_filter_FLP( - silk_float state[], /* I/O State [order + 1] */ - silk_float res[], /* O Residual signal [length] */ - const silk_float coef[], /* I Coefficients [order] */ - const silk_float input[], /* I Input signal [length] */ - const silk_float lambda, /* I Warping factor */ - const opus_int length, /* I Length of input signal */ - const opus_int order /* I Filter order (even) */ -) -{ - opus_int n, i; - silk_float acc, tmp1, tmp2; - - /* Order must be even */ - silk_assert( ( order & 1 ) == 0 ); - - for( n = 0; n < length; n++ ) { - /* Output of lowpass section */ - tmp2 = state[ 0 ] + lambda * state[ 1 ]; - state[ 0 ] = input[ n ]; - /* Output of allpass section */ - tmp1 = state[ 1 ] + lambda * ( state[ 2 ] - tmp2 ); - state[ 1 ] = tmp2; - acc = coef[ 0 ] * tmp2; - /* Loop over allpass sections */ - for( i = 2; i < order; i += 2 ) { - /* Output of allpass section */ - tmp2 = state[ i ] + lambda * ( state[ i + 1 ] - tmp1 ); - state[ i ] = tmp1; - acc += coef[ i - 1 ] * tmp1; - /* Output of allpass section */ - tmp1 = state[ i + 1 ] + lambda * ( state[ i + 2 ] - tmp2 ); - state[ i + 1 ] = tmp2; - acc += coef[ i ] * tmp2; - } - state[ order ] = tmp1; - acc += coef[ order - 1 ] * tmp1; - res[ n ] = input[ n ] - acc; - } -} - -/* -* silk_prefilter. Main prefilter function -*/ -void silk_prefilter_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - const silk_encoder_control_FLP *psEncCtrl, /* I Encoder control FLP */ - silk_float xw[], /* O Weighted signal */ - const silk_float x[] /* I Speech signal */ -) -{ - silk_prefilter_state_FLP *P = &psEnc->sPrefilt; - opus_int j, k, lag; - silk_float HarmShapeGain, Tilt, LF_MA_shp, LF_AR_shp; - silk_float B[ 2 ]; - const silk_float *AR1_shp; - const silk_float *px; - silk_float *pxw; - silk_float HarmShapeFIR[ 3 ]; - silk_float st_res[ MAX_SUB_FRAME_LENGTH + MAX_LPC_ORDER ]; - - /* Set up pointers */ - px = x; - pxw = xw; - lag = P->lagPrev; - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - /* Update Variables that change per sub frame */ - if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { - lag = psEncCtrl->pitchL[ k ]; - } - - /* Noise shape parameters */ - HarmShapeGain = psEncCtrl->HarmShapeGain[ k ] * ( 1.0f - psEncCtrl->HarmBoost[ k ] ); - HarmShapeFIR[ 0 ] = 0.25f * HarmShapeGain; - HarmShapeFIR[ 1 ] = 32767.0f / 65536.0f * HarmShapeGain; - HarmShapeFIR[ 2 ] = 0.25f * HarmShapeGain; - Tilt = psEncCtrl->Tilt[ k ]; - LF_MA_shp = psEncCtrl->LF_MA_shp[ k ]; - LF_AR_shp = psEncCtrl->LF_AR_shp[ k ]; - AR1_shp = &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ]; - - /* Short term FIR filtering */ - silk_warped_LPC_analysis_filter_FLP( P->sAR_shp, st_res, AR1_shp, px, - (silk_float)psEnc->sCmn.warping_Q16 / 65536.0f, psEnc->sCmn.subfr_length, psEnc->sCmn.shapingLPCOrder ); - - /* Reduce (mainly) low frequencies during harmonic emphasis */ - B[ 0 ] = psEncCtrl->GainsPre[ k ]; - B[ 1 ] = -psEncCtrl->GainsPre[ k ] * - ( psEncCtrl->HarmBoost[ k ] * HarmShapeGain + INPUT_TILT + psEncCtrl->coding_quality * HIGH_RATE_INPUT_TILT ); - pxw[ 0 ] = B[ 0 ] * st_res[ 0 ] + B[ 1 ] * P->sHarmHP; - for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) { - pxw[ j ] = B[ 0 ] * st_res[ j ] + B[ 1 ] * st_res[ j - 1 ]; - } - P->sHarmHP = st_res[ psEnc->sCmn.subfr_length - 1 ]; - - silk_prefilt_FLP( P, pxw, pxw, HarmShapeFIR, Tilt, LF_MA_shp, LF_AR_shp, lag, psEnc->sCmn.subfr_length ); - - px += psEnc->sCmn.subfr_length; - pxw += psEnc->sCmn.subfr_length; - } - P->lagPrev = psEncCtrl->pitchL[ psEnc->sCmn.nb_subfr - 1 ]; -} - -/* -* Prefilter for finding Quantizer input signal -*/ -static inline void silk_prefilt_FLP( - silk_prefilter_state_FLP *P, /* I/O state */ - silk_float st_res[], /* I */ - silk_float xw[], /* O */ - silk_float *HarmShapeFIR, /* I */ - silk_float Tilt, /* I */ - silk_float LF_MA_shp, /* I */ - silk_float LF_AR_shp, /* I */ - opus_int lag, /* I */ - opus_int length /* I */ -) -{ - opus_int i; - opus_int idx, LTP_shp_buf_idx; - silk_float n_Tilt, n_LF, n_LTP; - silk_float sLF_AR_shp, sLF_MA_shp; - silk_float *LTP_shp_buf; - - /* To speed up use temp variables instead of using the struct */ - LTP_shp_buf = P->sLTP_shp; - LTP_shp_buf_idx = P->sLTP_shp_buf_idx; - sLF_AR_shp = P->sLF_AR_shp; - sLF_MA_shp = P->sLF_MA_shp; - - for( i = 0; i < length; i++ ) { - if( lag > 0 ) { - silk_assert( HARM_SHAPE_FIR_TAPS == 3 ); - idx = lag + LTP_shp_buf_idx; - n_LTP = LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ] * HarmShapeFIR[ 0 ]; - n_LTP += LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ] * HarmShapeFIR[ 1 ]; - n_LTP += LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ] * HarmShapeFIR[ 2 ]; - } else { - n_LTP = 0; - } - - n_Tilt = sLF_AR_shp * Tilt; - n_LF = sLF_AR_shp * LF_AR_shp + sLF_MA_shp * LF_MA_shp; - - sLF_AR_shp = st_res[ i ] - n_Tilt; - sLF_MA_shp = sLF_AR_shp - n_LF; - - LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; - LTP_shp_buf[ LTP_shp_buf_idx ] = sLF_MA_shp; - - xw[ i ] = sLF_MA_shp - n_LTP; - } - /* Copy temp variable back to state */ - P->sLF_AR_shp = sLF_AR_shp; - P->sLF_MA_shp = sLF_MA_shp; - P->sLTP_shp_buf_idx = LTP_shp_buf_idx; -} diff --git a/external/opus-1.0.3/silk/float/silk_float.vcxproj b/external/opus-1.0.3/silk/float/silk_float.vcxproj deleted file mode 100644 index 51a497e6..00000000 --- a/external/opus-1.0.3/silk/float/silk_float.vcxproj +++ /dev/null @@ -1,242 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} - Win32Proj - src_FLP - silk_float - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - - - - - - - - Compile - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - ../;../fixed;../../win32;../../celt;../../include - MultiThreadedDebug - - - Windows - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - "$(ProjectDir)..\..\win32\genversion.bat" "$(ProjectDir)..\..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) - ../;../fixed;../../win32;../../celt;../../include - MultiThreadedDebug - - - Windows - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - "$(ProjectDir)..\..\win32\genversion.bat" "$(ProjectDir)..\..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - Level3 - - - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - ../;../fixed;../../win32;../../celt;../../include - MultiThreaded - - - Windows - true - true - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - "$(ProjectDir)..\..\win32\genversion.bat" "$(ProjectDir)..\..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - Level3 - - - MaxSpeed - true - true - HAVE_CONFIG_H;WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) - ../;../fixed;../../win32;../../celt;../../include - MultiThreaded - - - Windows - true - true - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - "$(ProjectDir)..\..\win32\genversion.bat" "$(ProjectDir)..\..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/external/opus-1.0.3/silk/float/silk_float.vcxproj.filters b/external/opus-1.0.3/silk/float/silk_float.vcxproj.filters deleted file mode 100644 index dbec9655..00000000 --- a/external/opus-1.0.3/silk/float/silk_float.vcxproj.filters +++ /dev/null @@ -1,129 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/external/opus-1.0.3/silk/float/solve_LS_FLP.c b/external/opus-1.0.3/silk/float/solve_LS_FLP.c deleted file mode 100644 index a4bb0525..00000000 --- a/external/opus-1.0.3/silk/float/solve_LS_FLP.c +++ /dev/null @@ -1,207 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main_FLP.h" -#include "tuning_parameters.h" - -/********************************************************************** - * LDL Factorisation. Finds the upper triangular matrix L and the diagonal - * Matrix D (only the diagonal elements returned in a vector)such that - * the symmetric matric A is given by A = L*D*L'. - **********************************************************************/ -static inline void silk_LDL_FLP( - silk_float *A, /* I/O Pointer to Symetric Square Matrix */ - opus_int M, /* I Size of Matrix */ - silk_float *L, /* I/O Pointer to Square Upper triangular Matrix */ - silk_float *Dinv /* I/O Pointer to vector holding the inverse diagonal elements of D */ -); - -/********************************************************************** - * Function to solve linear equation Ax = b, when A is a MxM lower - * triangular matrix, with ones on the diagonal. - **********************************************************************/ -static inline void silk_SolveWithLowerTriangularWdiagOnes_FLP( - const silk_float *L, /* I Pointer to Lower Triangular Matrix */ - opus_int M, /* I Dim of Matrix equation */ - const silk_float *b, /* I b Vector */ - silk_float *x /* O x Vector */ -); - -/********************************************************************** - * Function to solve linear equation (A^T)x = b, when A is a MxM lower - * triangular, with ones on the diagonal. (ie then A^T is upper triangular) - **********************************************************************/ -static inline void silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP( - const silk_float *L, /* I Pointer to Lower Triangular Matrix */ - opus_int M, /* I Dim of Matrix equation */ - const silk_float *b, /* I b Vector */ - silk_float *x /* O x Vector */ -); - -/********************************************************************** - * Function to solve linear equation Ax = b, when A is a MxM - * symmetric square matrix - using LDL factorisation - **********************************************************************/ -void silk_solve_LDL_FLP( - silk_float *A, /* I/O Symmetric square matrix, out: reg. */ - const opus_int M, /* I Size of matrix */ - const silk_float *b, /* I Pointer to b vector */ - silk_float *x /* O Pointer to x solution vector */ -) -{ - opus_int i; - silk_float L[ MAX_MATRIX_SIZE ][ MAX_MATRIX_SIZE ]; - silk_float T[ MAX_MATRIX_SIZE ]; - silk_float Dinv[ MAX_MATRIX_SIZE ]; /* inverse diagonal elements of D*/ - - silk_assert( M <= MAX_MATRIX_SIZE ); - - /*************************************************** - Factorize A by LDL such that A = L*D*(L^T), - where L is lower triangular with ones on diagonal - ****************************************************/ - silk_LDL_FLP( A, M, &L[ 0 ][ 0 ], Dinv ); - - /**************************************************** - * substitute D*(L^T) = T. ie: - L*D*(L^T)*x = b => L*T = b <=> T = inv(L)*b - ******************************************************/ - silk_SolveWithLowerTriangularWdiagOnes_FLP( &L[ 0 ][ 0 ], M, b, T ); - - /**************************************************** - D*(L^T)*x = T <=> (L^T)*x = inv(D)*T, because D is - diagonal just multiply with 1/d_i - ****************************************************/ - for( i = 0; i < M; i++ ) { - T[ i ] = T[ i ] * Dinv[ i ]; - } - /**************************************************** - x = inv(L') * inv(D) * T - *****************************************************/ - silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP( &L[ 0 ][ 0 ], M, T, x ); -} - -static inline void silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP( - const silk_float *L, /* I Pointer to Lower Triangular Matrix */ - opus_int M, /* I Dim of Matrix equation */ - const silk_float *b, /* I b Vector */ - silk_float *x /* O x Vector */ -) -{ - opus_int i, j; - silk_float temp; - const silk_float *ptr1; - - for( i = M - 1; i >= 0; i-- ) { - ptr1 = matrix_adr( L, 0, i, M ); - temp = 0; - for( j = M - 1; j > i ; j-- ) { - temp += ptr1[ j * M ] * x[ j ]; - } - temp = b[ i ] - temp; - x[ i ] = temp; - } -} - -static inline void silk_SolveWithLowerTriangularWdiagOnes_FLP( - const silk_float *L, /* I Pointer to Lower Triangular Matrix */ - opus_int M, /* I Dim of Matrix equation */ - const silk_float *b, /* I b Vector */ - silk_float *x /* O x Vector */ -) -{ - opus_int i, j; - silk_float temp; - const silk_float *ptr1; - - for( i = 0; i < M; i++ ) { - ptr1 = matrix_adr( L, i, 0, M ); - temp = 0; - for( j = 0; j < i; j++ ) { - temp += ptr1[ j ] * x[ j ]; - } - temp = b[ i ] - temp; - x[ i ] = temp; - } -} - -static inline void silk_LDL_FLP( - silk_float *A, /* I/O Pointer to Symetric Square Matrix */ - opus_int M, /* I Size of Matrix */ - silk_float *L, /* I/O Pointer to Square Upper triangular Matrix */ - silk_float *Dinv /* I/O Pointer to vector holding the inverse diagonal elements of D */ -) -{ - opus_int i, j, k, loop_count, err = 1; - silk_float *ptr1, *ptr2; - double temp, diag_min_value; - silk_float v[ MAX_MATRIX_SIZE ], D[ MAX_MATRIX_SIZE ]; /* temp arrays*/ - - silk_assert( M <= MAX_MATRIX_SIZE ); - - diag_min_value = FIND_LTP_COND_FAC * 0.5f * ( A[ 0 ] + A[ M * M - 1 ] ); - for( loop_count = 0; loop_count < M && err == 1; loop_count++ ) { - err = 0; - for( j = 0; j < M; j++ ) { - ptr1 = matrix_adr( L, j, 0, M ); - temp = matrix_ptr( A, j, j, M ); /* element in row j column j*/ - for( i = 0; i < j; i++ ) { - v[ i ] = ptr1[ i ] * D[ i ]; - temp -= ptr1[ i ] * v[ i ]; - } - if( temp < diag_min_value ) { - /* Badly conditioned matrix: add white noise and run again */ - temp = ( loop_count + 1 ) * diag_min_value - temp; - for( i = 0; i < M; i++ ) { - matrix_ptr( A, i, i, M ) += ( silk_float )temp; - } - err = 1; - break; - } - D[ j ] = ( silk_float )temp; - Dinv[ j ] = ( silk_float )( 1.0f / temp ); - matrix_ptr( L, j, j, M ) = 1.0f; - - ptr1 = matrix_adr( A, j, 0, M ); - ptr2 = matrix_adr( L, j + 1, 0, M); - for( i = j + 1; i < M; i++ ) { - temp = 0.0; - for( k = 0; k < j; k++ ) { - temp += ptr2[ k ] * v[ k ]; - } - matrix_ptr( L, i, j, M ) = ( silk_float )( ( ptr1[ i ] - temp ) * Dinv[ j ] ); - ptr2 += M; /* go to next column*/ - } - } - } - silk_assert( err == 0 ); -} - diff --git a/external/opus-1.0.3/silk/quant_LTP_gains.c b/external/opus-1.0.3/silk/quant_LTP_gains.c deleted file mode 100644 index f73c0f50..00000000 --- a/external/opus-1.0.3/silk/quant_LTP_gains.c +++ /dev/null @@ -1,107 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main.h" - -void silk_quant_LTP_gains( - opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (un)quantized LTP gains */ - opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ - opus_int8 *periodicity_index, /* O Periodicity Index */ - const opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Error Weights in Q18 */ - opus_int mu_Q9, /* I Mu value (R/D tradeoff) */ - opus_int lowComplexity, /* I Flag for low complexity */ - const opus_int nb_subfr /* I number of subframes */ -) -{ - opus_int j, k, cbk_size; - opus_int8 temp_idx[ MAX_NB_SUBFR ]; - const opus_uint8 *cl_ptr_Q5; - const opus_int8 *cbk_ptr_Q7; - const opus_int16 *b_Q14_ptr; - const opus_int32 *W_Q18_ptr; - opus_int32 rate_dist_Q14_subfr, rate_dist_Q14, min_rate_dist_Q14; - - /***************************************************/ - /* iterate over different codebooks with different */ - /* rates/distortions, and choose best */ - /***************************************************/ - min_rate_dist_Q14 = silk_int32_MAX; - for( k = 0; k < 3; k++ ) { - cl_ptr_Q5 = silk_LTP_gain_BITS_Q5_ptrs[ k ]; - cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ k ]; - cbk_size = silk_LTP_vq_sizes[ k ]; - - /* Set up pointer to first subframe */ - W_Q18_ptr = W_Q18; - b_Q14_ptr = B_Q14; - - rate_dist_Q14 = 0; - for( j = 0; j < nb_subfr; j++ ) { - silk_VQ_WMat_EC( - &temp_idx[ j ], /* O index of best codebook vector */ - &rate_dist_Q14_subfr, /* O best weighted quantization error + mu * rate */ - b_Q14_ptr, /* I input vector to be quantized */ - W_Q18_ptr, /* I weighting matrix */ - cbk_ptr_Q7, /* I codebook */ - cl_ptr_Q5, /* I code length for each codebook vector */ - mu_Q9, /* I tradeoff between weighted error and rate */ - cbk_size /* I number of vectors in codebook */ - ); - - rate_dist_Q14 = silk_ADD_POS_SAT32( rate_dist_Q14, rate_dist_Q14_subfr ); - - b_Q14_ptr += LTP_ORDER; - W_Q18_ptr += LTP_ORDER * LTP_ORDER; - } - - /* Avoid never finding a codebook */ - rate_dist_Q14 = silk_min( silk_int32_MAX - 1, rate_dist_Q14 ); - - if( rate_dist_Q14 < min_rate_dist_Q14 ) { - min_rate_dist_Q14 = rate_dist_Q14; - *periodicity_index = (opus_int8)k; - silk_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( opus_int8 ) ); - } - - /* Break early in low-complexity mode if rate distortion is below threshold */ - if( lowComplexity && ( rate_dist_Q14 < silk_LTP_gain_middle_avg_RD_Q14 ) ) { - break; - } - } - - cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ *periodicity_index ]; - for( j = 0; j < nb_subfr; j++ ) { - for( k = 0; k < LTP_ORDER; k++ ) { - B_Q14[ j * LTP_ORDER + k ] = silk_LSHIFT( cbk_ptr_Q7[ cbk_index[ j ] * LTP_ORDER + k ], 7 ); - } - } -} - diff --git a/external/opus-1.0.3/silk/silk_common.vcxproj b/external/opus-1.0.3/silk/silk_common.vcxproj deleted file mode 100644 index 87eca609..00000000 --- a/external/opus-1.0.3/silk/silk_common.vcxproj +++ /dev/null @@ -1,307 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} - Win32Proj - src_common - silk_common - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - fixed;float;../win32;../celt;../include - MultiThreadedDebug - - - Windows - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) - fixed;float;../win32;../celt;../include - MultiThreadedDebug - - - Windows - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - Level3 - - - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - fixed;float;../win32;../celt;../include - MultiThreaded - Fast - - - Windows - true - true - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - Level3 - - - MaxSpeed - true - true - HAVE_CONFIG_H;WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) - fixed;float;../win32;../celt;../include - MultiThreaded - Fast - - - Windows - true - true - true - - - $(OutDir)$(TargetName)$(TargetExt) - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/external/opus-1.0.3/silk/silk_common.vcxproj.filters b/external/opus-1.0.3/silk/silk_common.vcxproj.filters deleted file mode 100644 index 318123ae..00000000 --- a/external/opus-1.0.3/silk/silk_common.vcxproj.filters +++ /dev/null @@ -1,315 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/external/opus-1.0.3/silk_headers.mk b/external/opus-1.0.3/silk_headers.mk deleted file mode 100644 index 45c69853..00000000 --- a/external/opus-1.0.3/silk_headers.mk +++ /dev/null @@ -1,26 +0,0 @@ -SILK_HEAD = \ -silk/debug.h \ -silk/control.h \ -silk/errors.h \ -silk/API.h \ -silk/typedef.h \ -silk/define.h \ -silk/main.h \ -silk/PLC.h \ -silk/structs.h \ -silk/tables.h \ -silk/tuning_parameters.h \ -silk/Inlines.h \ -silk/MacroCount.h \ -silk/MacroDebug.h \ -silk/macros.h \ -silk/pitch_est_defines.h \ -silk/resampler_private.h \ -silk/resampler_rom.h \ -silk/resampler_structs.h \ -silk/SigProc_FIX.h \ -silk/fixed/main_FIX.h \ -silk/fixed/structs_FIX.h \ -silk/float/main_FLP.h \ -silk/float/structs_FLP.h \ -silk/float/SigProc_FLP.h diff --git a/external/opus-1.0.3/src/opus.vcxproj b/external/opus-1.0.3/src/opus.vcxproj deleted file mode 100644 index a04d4c60..00000000 --- a/external/opus-1.0.3/src/opus.vcxproj +++ /dev/null @@ -1,218 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - Win32Proj - opus - {219EC965-228A-1824-174D-96449D05F88A} - - - - StaticLibrary - true - - - StaticLibrary - true - - - false - StaticLibrary - true - - - StaticLibrary - false - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - - - HAVE_CONFIG_H;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - ../silk;../celt;../win32;../include;%(AdditionalIncludeDirectories) - MultiThreadedDebug - Level3 - ProgramDatabase - Disabled - - - MachineX86 - true - Console - $(SolutionDir)$(Configuration)$(PlatformArchitecture);%(AdditionalLibraryDirectories) - celt.lib;silk_common.lib;silk_fixed.lib;silk_float.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - HAVE_CONFIG_H;WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - ../silk;../celt;../win32;../include;%(AdditionalIncludeDirectories) - MultiThreadedDebug - Level3 - ProgramDatabase - Disabled - - - true - Console - $(SolutionDir)$(Configuration)$(PlatformArchitecture);%(AdditionalLibraryDirectories) - celt.lib;silk_common.lib;silk_fixed.lib;silk_float.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - HAVE_CONFIG_H;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - ../silk;../celt;../win32;../include;%(AdditionalIncludeDirectories) - MultiThreaded - Level3 - ProgramDatabase - true - - - MachineX86 - false - Console - true - true - celt.lib;silk_common.lib;silk_fixed.lib;silk_float.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(SolutionDir)$(Configuration)$(PlatformArchitecture);%(AdditionalLibraryDirectories) - false - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - HAVE_CONFIG_H;WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - ../silk;../celt;../win32;../include;%(AdditionalIncludeDirectories) - MultiThreaded - Level3 - ProgramDatabase - - - false - Console - true - true - celt.lib;silk_common.lib;silk_fixed.lib;silk_float.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(SolutionDir)$(Configuration)$(PlatformArchitecture);%(AdditionalLibraryDirectories) - false - - - "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION - Generating version.h - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/external/opus-1.0.3/src/opus.vcxproj.filters b/external/opus-1.0.3/src/opus.vcxproj.filters deleted file mode 100644 index 1d1cd84f..00000000 --- a/external/opus-1.0.3/src/opus.vcxproj.filters +++ /dev/null @@ -1,75 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/external/opus-1.0.3/src/opus_demo.vcxproj b/external/opus-1.0.3/src/opus_demo.vcxproj deleted file mode 100644 index 9918ff06..00000000 --- a/external/opus-1.0.3/src/opus_demo.vcxproj +++ /dev/null @@ -1,101 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - - - - - - - - - - - - - - - - - - - - - - - {016C739D-6389-43BF-8D88-24B2BF6F620F} - Win32Proj - opus_demo - - - - Application - true - Unicode - - - Application - false - true - Unicode - - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - ../silk;../celt;../win32;../include; - MultiThreadedDebug - - - Console - true - $(SolutionDir)$(Configuration)\opus.lib;$(SolutionDir)$(Configuration)\celt.lib;$(SolutionDir)$(Configuration)\silk_common.lib;$(SolutionDir)$(Configuration)\silk_float.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - ../silk;../celt;../win32;../include; - true - - - Console - true - true - $(SolutionDir)$(Configuration)\opus.lib;$(SolutionDir)$(Configuration)\celt.lib;$(SolutionDir)$(Configuration)\silk_common.lib;$(SolutionDir)$(Configuration)\silk_float.lib;%(AdditionalDependencies) - - - - - - diff --git a/external/opus-1.0.3/src/opus_demo.vcxproj.filters b/external/opus-1.0.3/src/opus_demo.vcxproj.filters deleted file mode 100644 index 3e1ef57e..00000000 --- a/external/opus-1.0.3/src/opus_demo.vcxproj.filters +++ /dev/null @@ -1,75 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/external/opus-1.0.3/src/opus_encoder.c b/external/opus-1.0.3/src/opus_encoder.c deleted file mode 100644 index eadcf4ba..00000000 --- a/external/opus-1.0.3/src/opus_encoder.c +++ /dev/null @@ -1,1618 +0,0 @@ -/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited - Written by Jean-Marc Valin and Koen Vos */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "celt.h" -#include "entenc.h" -#include "modes.h" -#include "API.h" -#include "stack_alloc.h" -#include "float_cast.h" -#include "opus.h" -#include "arch.h" -#include "opus_private.h" -#include "os_support.h" - -#include "tuning_parameters.h" -#ifdef FIXED_POINT -#include "fixed/structs_FIX.h" -#else -#include "float/structs_FLP.h" -#endif - -#define MAX_ENCODER_BUFFER 480 - -struct OpusEncoder { - int celt_enc_offset; - int silk_enc_offset; - silk_EncControlStruct silk_mode; - int application; - int channels; - int delay_compensation; - int force_channels; - int signal_type; - int user_bandwidth; - int max_bandwidth; - int user_forced_mode; - int voice_ratio; - opus_int32 Fs; - int use_vbr; - int vbr_constraint; - opus_int32 bitrate_bps; - opus_int32 user_bitrate_bps; - int encoder_buffer; - -#define OPUS_ENCODER_RESET_START stream_channels - int stream_channels; - opus_int16 hybrid_stereo_width_Q14; - opus_int32 variable_HP_smth2_Q15; - opus_val32 hp_mem[4]; - int mode; - int prev_mode; - int prev_channels; - int prev_framesize; - int bandwidth; - int silk_bw_switch; - /* Sampling rate (at the API level) */ - int first; - opus_val16 delay_buffer[MAX_ENCODER_BUFFER*2]; - - opus_uint32 rangeFinal; -}; - -/* Transition tables for the voice and music. First column is the - middle (memoriless) threshold. The second column is the hysteresis - (difference with the middle) */ -static const opus_int32 mono_voice_bandwidth_thresholds[8] = { - 11000, 1000, /* NB<->MB */ - 14000, 1000, /* MB<->WB */ - 21000, 2000, /* WB<->SWB */ - 29000, 2000, /* SWB<->FB */ -}; -static const opus_int32 mono_music_bandwidth_thresholds[8] = { - 14000, 1000, /* MB not allowed */ - 18000, 2000, /* MB<->WB */ - 24000, 2000, /* WB<->SWB */ - 33000, 2000, /* SWB<->FB */ -}; -static const opus_int32 stereo_voice_bandwidth_thresholds[8] = { - 11000, 1000, /* NB<->MB */ - 14000, 1000, /* MB<->WB */ - 21000, 2000, /* WB<->SWB */ - 32000, 2000, /* SWB<->FB */ -}; -static const opus_int32 stereo_music_bandwidth_thresholds[8] = { - 14000, 1000, /* MB not allowed */ - 18000, 2000, /* MB<->WB */ - 24000, 2000, /* WB<->SWB */ - 48000, 2000, /* SWB<->FB */ -}; -/* Threshold bit-rates for switching between mono and stereo */ -static const opus_int32 stereo_voice_threshold = 26000; -static const opus_int32 stereo_music_threshold = 36000; - -/* Threshold bit-rate for switching between SILK/hybrid and CELT-only */ -static const opus_int32 mode_thresholds[2][2] = { - /* voice */ /* music */ - { 48000, 24000}, /* mono */ - { 48000, 24000}, /* stereo */ -}; - -int opus_encoder_get_size(int channels) -{ - int silkEncSizeBytes, celtEncSizeBytes; - int ret; - if (channels<1 || channels > 2) - return 0; - ret = silk_Get_Encoder_Size( &silkEncSizeBytes ); - if (ret) - return 0; - silkEncSizeBytes = align(silkEncSizeBytes); - celtEncSizeBytes = celt_encoder_get_size(channels); - return align(sizeof(OpusEncoder))+silkEncSizeBytes+celtEncSizeBytes; -} - -int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int application) -{ - void *silk_enc; - CELTEncoder *celt_enc; - int err; - int ret, silkEncSizeBytes; - - if((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000)||(channels!=1&&channels!=2)|| - (application != OPUS_APPLICATION_VOIP && application != OPUS_APPLICATION_AUDIO - && application != OPUS_APPLICATION_RESTRICTED_LOWDELAY)) - return OPUS_BAD_ARG; - - OPUS_CLEAR((char*)st, opus_encoder_get_size(channels)); - /* Create SILK encoder */ - ret = silk_Get_Encoder_Size( &silkEncSizeBytes ); - if (ret) - return OPUS_BAD_ARG; - silkEncSizeBytes = align(silkEncSizeBytes); - st->silk_enc_offset = align(sizeof(OpusEncoder)); - st->celt_enc_offset = st->silk_enc_offset+silkEncSizeBytes; - silk_enc = (char*)st+st->silk_enc_offset; - celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); - - st->stream_channels = st->channels = channels; - - st->Fs = Fs; - - ret = silk_InitEncoder( silk_enc, &st->silk_mode ); - if(ret)return OPUS_INTERNAL_ERROR; - - /* default SILK parameters */ - st->silk_mode.nChannelsAPI = channels; - st->silk_mode.nChannelsInternal = channels; - st->silk_mode.API_sampleRate = st->Fs; - st->silk_mode.maxInternalSampleRate = 16000; - st->silk_mode.minInternalSampleRate = 8000; - st->silk_mode.desiredInternalSampleRate = 16000; - st->silk_mode.payloadSize_ms = 20; - st->silk_mode.bitRate = 25000; - st->silk_mode.packetLossPercentage = 0; - st->silk_mode.complexity = 10; - st->silk_mode.useInBandFEC = 0; - st->silk_mode.useDTX = 0; - st->silk_mode.useCBR = 0; - - /* Create CELT encoder */ - /* Initialize CELT encoder */ - err = celt_encoder_init(celt_enc, Fs, channels); - if(err!=OPUS_OK)return OPUS_INTERNAL_ERROR; - - celt_encoder_ctl(celt_enc, CELT_SET_SIGNALLING(0)); - celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(10)); - - st->use_vbr = 1; - /* Makes constrained VBR the default (safer for real-time use) */ - st->vbr_constraint = 1; - st->user_bitrate_bps = OPUS_AUTO; - st->bitrate_bps = 3000+Fs*channels; - st->application = application; - st->signal_type = OPUS_AUTO; - st->user_bandwidth = OPUS_AUTO; - st->max_bandwidth = OPUS_BANDWIDTH_FULLBAND; - st->force_channels = OPUS_AUTO; - st->user_forced_mode = OPUS_AUTO; - st->voice_ratio = -1; - st->encoder_buffer = st->Fs/100; - - /* Delay compensation of 4 ms (2.5 ms for SILK's extra look-ahead - + 1.5 ms for SILK resamplers and stereo prediction) */ - st->delay_compensation = st->Fs/250; - - st->hybrid_stereo_width_Q14 = 1 << 14; - st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); - st->first = 1; - st->mode = MODE_HYBRID; - st->bandwidth = OPUS_BANDWIDTH_FULLBAND; - - return OPUS_OK; -} - -static int pad_frame(unsigned char *data, opus_int32 len, opus_int32 new_len) -{ - if (len == new_len) - return 0; - if (len > new_len) - return 1; - - if ((data[0]&0x3)==0) - { - int i; - int padding, nb_255s; - - padding = new_len - len; - if (padding >= 2) - { - nb_255s = (padding-2)/255; - - for (i=len-1;i>=1;i--) - data[i+nb_255s+2] = data[i]; - data[0] |= 0x3; - data[1] = 0x41; - for (i=0;i=1;i--) - data[i+1] = data[i]; - data[0] |= 0x3; - data[1] = 1; - } - return 0; - } else { - return 1; - } -} - -static unsigned char gen_toc(int mode, int framerate, int bandwidth, int channels) -{ - int period; - unsigned char toc; - period = 0; - while (framerate < 400) - { - framerate <<= 1; - period++; - } - if (mode == MODE_SILK_ONLY) - { - toc = (bandwidth-OPUS_BANDWIDTH_NARROWBAND)<<5; - toc |= (period-2)<<3; - } else if (mode == MODE_CELT_ONLY) - { - int tmp = bandwidth-OPUS_BANDWIDTH_MEDIUMBAND; - if (tmp < 0) - tmp = 0; - toc = 0x80; - toc |= tmp << 5; - toc |= period<<3; - } else /* Hybrid */ - { - toc = 0x60; - toc |= (bandwidth-OPUS_BANDWIDTH_SUPERWIDEBAND)<<4; - toc |= (period-2)<<3; - } - toc |= (channels==2)<<2; - return toc; -} - -#ifndef FIXED_POINT -static void silk_biquad_float( - const opus_val16 *in, /* I: Input signal */ - const opus_int32 *B_Q28, /* I: MA coefficients [3] */ - const opus_int32 *A_Q28, /* I: AR coefficients [2] */ - opus_val32 *S, /* I/O: State vector [2] */ - opus_val16 *out, /* O: Output signal */ - const opus_int32 len, /* I: Signal length (must be even) */ - int stride -) -{ - /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ - opus_int k; - opus_val32 vout; - opus_val32 inval; - opus_val32 A[2], B[3]; - - A[0] = (opus_val32)(A_Q28[0] * (1.f/((opus_int32)1<<28))); - A[1] = (opus_val32)(A_Q28[1] * (1.f/((opus_int32)1<<28))); - B[0] = (opus_val32)(B_Q28[0] * (1.f/((opus_int32)1<<28))); - B[1] = (opus_val32)(B_Q28[1] * (1.f/((opus_int32)1<<28))); - B[2] = (opus_val32)(B_Q28[2] * (1.f/((opus_int32)1<<28))); - - /* Negate A_Q28 values and split in two parts */ - - for( k = 0; k < len; k++ ) { - /* S[ 0 ], S[ 1 ]: Q12 */ - inval = in[ k*stride ]; - vout = S[ 0 ] + B[0]*inval; - - S[ 0 ] = S[1] - vout*A[0] + B[1]*inval; - - S[ 1 ] = - vout*A[1] + B[2]*inval; - - /* Scale back to Q0 and saturate */ - out[ k*stride ] = vout; - } -} -#endif - -static void hp_cutoff(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *out, opus_val32 *hp_mem, int len, int channels, opus_int32 Fs) -{ - opus_int32 B_Q28[ 3 ], A_Q28[ 2 ]; - opus_int32 Fc_Q19, r_Q28, r_Q22; - - silk_assert( cutoff_Hz <= silk_int32_MAX / SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ) ); - Fc_Q19 = silk_DIV32_16( silk_SMULBB( SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ), cutoff_Hz ), Fs/1000 ); - silk_assert( Fc_Q19 > 0 && Fc_Q19 < 32768 ); - - r_Q28 = SILK_FIX_CONST( 1.0, 28 ) - silk_MUL( SILK_FIX_CONST( 0.92, 9 ), Fc_Q19 ); - - /* b = r * [ 1; -2; 1 ]; */ - /* a = [ 1; -2 * r * ( 1 - 0.5 * Fc^2 ); r^2 ]; */ - B_Q28[ 0 ] = r_Q28; - B_Q28[ 1 ] = silk_LSHIFT( -r_Q28, 1 ); - B_Q28[ 2 ] = r_Q28; - - /* -r * ( 2 - Fc * Fc ); */ - r_Q22 = silk_RSHIFT( r_Q28, 6 ); - A_Q28[ 0 ] = silk_SMULWW( r_Q22, silk_SMULWW( Fc_Q19, Fc_Q19 ) - SILK_FIX_CONST( 2.0, 22 ) ); - A_Q28[ 1 ] = silk_SMULWW( r_Q22, r_Q22 ); - -#ifdef FIXED_POINT - silk_biquad_alt( in, B_Q28, A_Q28, hp_mem, out, len, channels ); - if( channels == 2 ) { - silk_biquad_alt( in+1, B_Q28, A_Q28, hp_mem+2, out+1, len, channels ); - } -#else - silk_biquad_float( in, B_Q28, A_Q28, hp_mem, out, len, channels ); - if( channels == 2 ) { - silk_biquad_float( in+1, B_Q28, A_Q28, hp_mem+2, out+1, len, channels ); - } -#endif -} - -static void stereo_fade(const opus_val16 *in, opus_val16 *out, opus_val16 g1, opus_val16 g2, - int overlap48, int frame_size, int channels, const opus_val16 *window, opus_int32 Fs) -{ - int i; - int overlap; - int inc; - inc = 48000/Fs; - overlap=overlap48/inc; - g1 = Q15ONE-g1; - g2 = Q15ONE-g2; - for (i=0;iFs/400; - if (st->user_bitrate_bps==OPUS_AUTO) - return 60*st->Fs/frame_size + st->Fs*st->channels; - else if (st->user_bitrate_bps==OPUS_BITRATE_MAX) - return max_data_bytes*8*st->Fs/frame_size; - else - return st->user_bitrate_bps; -} - -#ifdef FIXED_POINT -#define opus_encode_native opus_encode -opus_int32 opus_encode(OpusEncoder *st, const opus_val16 *pcm, int frame_size, - unsigned char *data, opus_int32 out_data_bytes) -#else -#define opus_encode_native opus_encode_float -opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size, - unsigned char *data, opus_int32 out_data_bytes) -#endif -{ - void *silk_enc; - CELTEncoder *celt_enc; - int i; - int ret=0; - opus_int32 nBytes; - ec_enc enc; - int bytes_target; - int prefill=0; - int start_band = 0; - int redundancy = 0; - int redundancy_bytes = 0; /* Number of bytes to use for redundancy frame */ - int celt_to_silk = 0; - VARDECL(opus_val16, pcm_buf); - int nb_compr_bytes; - int to_celt = 0; - opus_uint32 redundant_rng = 0; - int cutoff_Hz, hp_freq_smth1; - int voice_est; /* Probability of voice in Q7 */ - opus_int32 equiv_rate; - int delay_compensation; - int frame_rate; - opus_int32 max_rate; /* Max bitrate we're allowed to use */ - int curr_bandwidth; - opus_int32 max_data_bytes; /* Max number of bytes we're allowed to use */ - VARDECL(opus_val16, tmp_prefill); - - ALLOC_STACK; - - max_data_bytes = IMIN(1276, out_data_bytes); - - st->rangeFinal = 0; - if (400*frame_size != st->Fs && 200*frame_size != st->Fs && 100*frame_size != st->Fs && - 50*frame_size != st->Fs && 25*frame_size != st->Fs && 50*frame_size != 3*st->Fs) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - if (max_data_bytes<=0) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - silk_enc = (char*)st+st->silk_enc_offset; - celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); - - if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) - delay_compensation = 0; - else - delay_compensation = st->delay_compensation; - - st->bitrate_bps = user_bitrate_to_bitrate(st, frame_size, max_data_bytes); - - frame_rate = st->Fs/frame_size; - if (max_data_bytes<3 || st->bitrate_bps < 3*frame_rate*8 - || (frame_rate<50 && (max_data_bytes*frame_rate<300 || st->bitrate_bps < 2400))) - { - /*If the space is too low to do something useful, emit 'PLC' frames.*/ - int tocmode = st->mode; - int bw = st->bandwidth == 0 ? OPUS_BANDWIDTH_NARROWBAND : st->bandwidth; - if (tocmode==0) - tocmode = MODE_SILK_ONLY; - if (frame_rate>100) - tocmode = MODE_CELT_ONLY; - if (frame_rate < 50) - tocmode = MODE_SILK_ONLY; - if(tocmode==MODE_SILK_ONLY&&bw>OPUS_BANDWIDTH_WIDEBAND) - bw=OPUS_BANDWIDTH_WIDEBAND; - else if (tocmode==MODE_CELT_ONLY&&bw==OPUS_BANDWIDTH_MEDIUMBAND) - bw=OPUS_BANDWIDTH_NARROWBAND; - else if (bw<=OPUS_BANDWIDTH_SUPERWIDEBAND) - bw=OPUS_BANDWIDTH_SUPERWIDEBAND; - data[0] = gen_toc(tocmode, frame_rate, bw, st->stream_channels); - RESTORE_STACK; - return 1; - } - if (!st->use_vbr) - { - int cbrBytes; - cbrBytes = IMIN( (st->bitrate_bps + 4*frame_rate)/(8*frame_rate) , max_data_bytes); - st->bitrate_bps = cbrBytes * (8*frame_rate); - max_data_bytes = cbrBytes; - } - max_rate = frame_rate*max_data_bytes*8; - - /* Equivalent 20-ms rate for mode/channel/bandwidth decisions */ - equiv_rate = st->bitrate_bps - 60*(st->Fs/frame_size - 50); - - if (st->signal_type == OPUS_SIGNAL_VOICE) - voice_est = 127; - else if (st->signal_type == OPUS_SIGNAL_MUSIC) - voice_est = 0; - else if (st->voice_ratio >= 0) - voice_est = st->voice_ratio*327>>8; - else if (st->application == OPUS_APPLICATION_VOIP) - voice_est = 115; - else - voice_est = 48; - - if (st->force_channels!=OPUS_AUTO && st->channels == 2) - { - st->stream_channels = st->force_channels; - } else { -#ifdef FUZZING - /* Random mono/stereo decision */ - if (st->channels == 2 && (rand()&0x1F)==0) - st->stream_channels = 3-st->stream_channels; -#else - /* Rate-dependent mono-stereo decision */ - if (st->channels == 2) - { - opus_int32 stereo_threshold; - stereo_threshold = stereo_music_threshold + ((voice_est*voice_est*(stereo_voice_threshold-stereo_music_threshold))>>14); - if (st->stream_channels == 2) - stereo_threshold -= 4000; - else - stereo_threshold += 4000; - st->stream_channels = (equiv_rate > stereo_threshold) ? 2 : 1; - } else { - st->stream_channels = st->channels; - } -#endif - } - - /* Mode selection depending on application and signal type */ - if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) - { - st->mode = MODE_CELT_ONLY; - } else if (st->user_forced_mode == OPUS_AUTO) - { -#ifdef FUZZING - /* Random mode switching */ - if ((rand()&0xF)==0) - { - if ((rand()&0x1)==0) - st->mode = MODE_CELT_ONLY; - else - st->mode = MODE_SILK_ONLY; - } else { - if (st->prev_mode==MODE_CELT_ONLY) - st->mode = MODE_CELT_ONLY; - else - st->mode = MODE_SILK_ONLY; - } -#else - int chan; - opus_int32 mode_voice, mode_music; - opus_int32 threshold; - - chan = (st->channels==2) && st->force_channels!=1; - mode_voice = mode_thresholds[chan][0]; - mode_music = mode_thresholds[chan][1]; - threshold = mode_music + ((voice_est*voice_est*(mode_voice-mode_music))>>14); - - /* Hysteresis */ - if (st->prev_mode == MODE_CELT_ONLY) - threshold -= 4000; - else if (st->prev_mode>0) - threshold += 4000; - - st->mode = (equiv_rate >= threshold) ? MODE_CELT_ONLY: MODE_SILK_ONLY; - - /* When FEC is enabled and there's enough packet loss, use SILK */ - if (st->silk_mode.useInBandFEC && st->silk_mode.packetLossPercentage > (128-voice_est)>>4) - st->mode = MODE_SILK_ONLY; - /* When encoding voice and DTX is enabled, set the encoder to SILK mode (at least for now) */ - if (st->silk_mode.useDTX && voice_est > 100) - st->mode = MODE_SILK_ONLY; -#endif - } else { - st->mode = st->user_forced_mode; - } - - /* Override the chosen mode to make sure we meet the requested frame size */ - if (st->mode != MODE_CELT_ONLY && frame_size < st->Fs/100) - st->mode = MODE_CELT_ONLY; - - if (st->stream_channels == 1 && st->prev_channels ==2 && st->silk_mode.toMono==0 - && st->mode != MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY) - { - /* Delay stereo->mono transition by two frames so that SILK can do a smooth downmix */ - st->silk_mode.toMono = 1; - st->stream_channels = 2; - } else { - st->silk_mode.toMono = 0; - } - - if (st->prev_mode > 0 && - ((st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) || - (st->mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY))) - { - redundancy = 1; - celt_to_silk = (st->mode != MODE_CELT_ONLY); - if (!celt_to_silk) - { - /* Switch to SILK/hybrid if frame size is 10 ms or more*/ - if (frame_size >= st->Fs/100) - { - st->mode = st->prev_mode; - to_celt = 1; - } else { - redundancy=0; - } - } - } - /* For the first frame at a new SILK bandwidth */ - if (st->silk_bw_switch) - { - redundancy = 1; - celt_to_silk = 1; - st->silk_bw_switch = 0; - prefill=1; - } - - if (redundancy) - { - /* Fair share of the max size allowed */ - redundancy_bytes = IMIN(257, max_data_bytes*(opus_int32)(st->Fs/200)/(frame_size+st->Fs/200)); - /* For VBR, target the actual bitrate (subject to the limit above) */ - if (st->use_vbr) - redundancy_bytes = IMIN(redundancy_bytes, st->bitrate_bps/1600); - } - - if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) - { - silk_EncControlStruct dummy; - silk_InitEncoder( silk_enc, &dummy); - prefill=1; - } - - /* Automatic (rate-dependent) bandwidth selection */ - if (st->mode == MODE_CELT_ONLY || st->first || st->silk_mode.allowBandwidthSwitch) - { - const opus_int32 *voice_bandwidth_thresholds, *music_bandwidth_thresholds; - opus_int32 bandwidth_thresholds[8]; - int bandwidth = OPUS_BANDWIDTH_FULLBAND; - opus_int32 equiv_rate2; - - equiv_rate2 = equiv_rate; - if (st->mode != MODE_CELT_ONLY) - { - /* Adjust the threshold +/- 10% depending on complexity */ - equiv_rate2 = equiv_rate2 * (45+st->silk_mode.complexity)/50; - /* CBR is less efficient by ~1 kb/s */ - if (!st->use_vbr) - equiv_rate2 -= 1000; - } - if (st->channels==2 && st->force_channels!=1) - { - voice_bandwidth_thresholds = stereo_voice_bandwidth_thresholds; - music_bandwidth_thresholds = stereo_music_bandwidth_thresholds; - } else { - voice_bandwidth_thresholds = mono_voice_bandwidth_thresholds; - music_bandwidth_thresholds = mono_music_bandwidth_thresholds; - } - /* Interpolate bandwidth thresholds depending on voice estimation */ - for (i=0;i<8;i++) - { - bandwidth_thresholds[i] = music_bandwidth_thresholds[i] - + ((voice_est*voice_est*(voice_bandwidth_thresholds[i]-music_bandwidth_thresholds[i]))>>14); - } - do { - int threshold, hysteresis; - threshold = bandwidth_thresholds[2*(bandwidth-OPUS_BANDWIDTH_MEDIUMBAND)]; - hysteresis = bandwidth_thresholds[2*(bandwidth-OPUS_BANDWIDTH_MEDIUMBAND)+1]; - if (!st->first) - { - if (st->bandwidth >= bandwidth) - threshold -= hysteresis; - else - threshold += hysteresis; - } - if (equiv_rate2 >= threshold) - break; - } while (--bandwidth>OPUS_BANDWIDTH_NARROWBAND); - st->bandwidth = bandwidth; - /* Prevents any transition to SWB/FB until the SILK layer has fully - switched to WB mode and turned the variable LP filter off */ - if (!st->first && st->mode != MODE_CELT_ONLY && !st->silk_mode.inWBmodeWithoutVariableLP && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) - st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; - } - - if (st->bandwidth>st->max_bandwidth) - st->bandwidth = st->max_bandwidth; - - if (st->user_bandwidth != OPUS_AUTO) - st->bandwidth = st->user_bandwidth; - - /* This prevents us from using hybrid at unsafe CBR/max rates */ - if (st->mode != MODE_CELT_ONLY && max_rate < 15000) - { - st->bandwidth = IMIN(st->bandwidth, OPUS_BANDWIDTH_WIDEBAND); - } - - /* Prevents Opus from wasting bits on frequencies that are above - the Nyquist rate of the input signal */ - if (st->Fs <= 24000 && st->bandwidth > OPUS_BANDWIDTH_SUPERWIDEBAND) - st->bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; - if (st->Fs <= 16000 && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) - st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; - if (st->Fs <= 12000 && st->bandwidth > OPUS_BANDWIDTH_MEDIUMBAND) - st->bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; - if (st->Fs <= 8000 && st->bandwidth > OPUS_BANDWIDTH_NARROWBAND) - st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; - - /* If max_data_bytes represents less than 8 kb/s, switch to CELT-only mode */ - if (max_data_bytes < (frame_rate > 50 ? 12000 : 8000)*frame_size / (st->Fs * 8)) - st->mode = MODE_CELT_ONLY; - - /* CELT mode doesn't support mediumband, use wideband instead */ - if (st->mode == MODE_CELT_ONLY && st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) - st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; - - /* Can't support higher than wideband for >20 ms frames */ - if (frame_size > st->Fs/50 && (st->mode == MODE_CELT_ONLY || st->bandwidth > OPUS_BANDWIDTH_WIDEBAND)) - { - VARDECL(unsigned char, tmp_data); - int nb_frames; - int bak_mode, bak_bandwidth, bak_channels, bak_to_mono; - OpusRepacketizer rp; - opus_int32 bytes_per_frame; - - - nb_frames = frame_size > st->Fs/25 ? 3 : 2; - bytes_per_frame = IMIN(1276,(out_data_bytes-3)/nb_frames); - - ALLOC(tmp_data, nb_frames*bytes_per_frame, unsigned char); - - opus_repacketizer_init(&rp); - - bak_mode = st->user_forced_mode; - bak_bandwidth = st->user_bandwidth; - bak_channels = st->force_channels; - - st->user_forced_mode = st->mode; - st->user_bandwidth = st->bandwidth; - st->force_channels = st->stream_channels; - bak_to_mono = st->silk_mode.toMono; - - if (bak_to_mono) - st->force_channels = 1; - else - st->prev_channels = st->stream_channels; - for (i=0;isilk_mode.toMono = 0; - /* When switching from SILK/Hybrid to CELT, only ask for a switch at the last frame */ - if (to_celt && i==nb_frames-1) - st->user_forced_mode = MODE_CELT_ONLY; - tmp_len = opus_encode_native(st, pcm+i*(st->channels*st->Fs/50), st->Fs/50, tmp_data+i*bytes_per_frame, bytes_per_frame); - if (tmp_len<0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - ret = opus_repacketizer_cat(&rp, tmp_data+i*bytes_per_frame, tmp_len); - if (ret<0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - } - ret = opus_repacketizer_out(&rp, data, out_data_bytes); - if (ret<0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - st->user_forced_mode = bak_mode; - st->user_bandwidth = bak_bandwidth; - st->force_channels = bak_channels; - st->silk_mode.toMono = bak_to_mono; - RESTORE_STACK; - return ret; - } - - curr_bandwidth = st->bandwidth; - - /* Chooses the appropriate mode for speech - *NEVER* switch to/from CELT-only mode here as this will invalidate some assumptions */ - if (st->mode == MODE_SILK_ONLY && curr_bandwidth > OPUS_BANDWIDTH_WIDEBAND) - st->mode = MODE_HYBRID; - if (st->mode == MODE_HYBRID && curr_bandwidth <= OPUS_BANDWIDTH_WIDEBAND) - st->mode = MODE_SILK_ONLY; - - /* printf("%d %d %d %d\n", st->bitrate_bps, st->stream_channels, st->mode, curr_bandwidth); */ - bytes_target = IMIN(max_data_bytes-redundancy_bytes, st->bitrate_bps * frame_size / (st->Fs * 8)) - 1; - - data += 1; - - ec_enc_init(&enc, data, max_data_bytes-1); - - ALLOC(pcm_buf, (delay_compensation+frame_size)*st->channels, opus_val16); - for (i=0;ichannels;i++) - pcm_buf[i] = st->delay_buffer[(st->encoder_buffer-delay_compensation)*st->channels+i]; - - if (st->mode == MODE_CELT_ONLY) - hp_freq_smth1 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); - else - hp_freq_smth1 = ((silk_encoder*)silk_enc)->state_Fxx[0].sCmn.variable_HP_smth1_Q15; - - st->variable_HP_smth2_Q15 = silk_SMLAWB( st->variable_HP_smth2_Q15, - hp_freq_smth1 - st->variable_HP_smth2_Q15, SILK_FIX_CONST( VARIABLE_HP_SMTH_COEF2, 16 ) ); - - /* convert from log scale to Hertz */ - cutoff_Hz = silk_log2lin( silk_RSHIFT( st->variable_HP_smth2_Q15, 8 ) ); - - if (st->application == OPUS_APPLICATION_VOIP) - { - hp_cutoff(pcm, cutoff_Hz, &pcm_buf[delay_compensation*st->channels], st->hp_mem, frame_size, st->channels, st->Fs); - } else { - for (i=0;ichannels;i++) - pcm_buf[delay_compensation*st->channels + i] = pcm[i]; - } - - /* SILK processing */ - if (st->mode != MODE_CELT_ONLY) - { -#ifdef FIXED_POINT - const opus_int16 *pcm_silk; -#else - VARDECL(opus_int16, pcm_silk); - ALLOC(pcm_silk, st->channels*frame_size, opus_int16); -#endif - st->silk_mode.bitRate = 8*bytes_target*frame_rate; - if( st->mode == MODE_HYBRID ) { - st->silk_mode.bitRate /= st->stream_channels; - if( curr_bandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND ) { - if( st->Fs == 100 * frame_size ) { - /* 24 kHz, 10 ms */ - st->silk_mode.bitRate = ( ( st->silk_mode.bitRate + 2000 + st->use_vbr * 1000 ) * 2 ) / 3; - } else { - /* 24 kHz, 20 ms */ - st->silk_mode.bitRate = ( ( st->silk_mode.bitRate + 1000 + st->use_vbr * 1000 ) * 2 ) / 3; - } - } else { - if( st->Fs == 100 * frame_size ) { - /* 48 kHz, 10 ms */ - st->silk_mode.bitRate = ( st->silk_mode.bitRate + 8000 + st->use_vbr * 3000 ) / 2; - } else { - /* 48 kHz, 20 ms */ - st->silk_mode.bitRate = ( st->silk_mode.bitRate + 9000 + st->use_vbr * 1000 ) / 2; - } - } - st->silk_mode.bitRate *= st->stream_channels; - /* don't let SILK use more than 80% */ - if( st->silk_mode.bitRate > ( st->bitrate_bps - 8*st->Fs/frame_size ) * 4/5 ) { - st->silk_mode.bitRate = ( st->bitrate_bps - 8*st->Fs/frame_size ) * 4/5; - } - } - - st->silk_mode.payloadSize_ms = 1000 * frame_size / st->Fs; - st->silk_mode.nChannelsAPI = st->channels; - st->silk_mode.nChannelsInternal = st->stream_channels; - if (curr_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { - st->silk_mode.desiredInternalSampleRate = 8000; - } else if (curr_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { - st->silk_mode.desiredInternalSampleRate = 12000; - } else { - silk_assert( st->mode == MODE_HYBRID || curr_bandwidth == OPUS_BANDWIDTH_WIDEBAND ); - st->silk_mode.desiredInternalSampleRate = 16000; - } - if( st->mode == MODE_HYBRID ) { - /* Don't allow bandwidth reduction at lowest bitrates in hybrid mode */ - st->silk_mode.minInternalSampleRate = 16000; - } else { - st->silk_mode.minInternalSampleRate = 8000; - } - - if (st->mode == MODE_SILK_ONLY) - { - opus_int32 effective_max_rate = max_rate; - st->silk_mode.maxInternalSampleRate = 16000; - if (frame_rate > 50) - effective_max_rate = effective_max_rate*2/3; - if (effective_max_rate < 13000) - { - st->silk_mode.maxInternalSampleRate = 12000; - st->silk_mode.desiredInternalSampleRate = IMIN(12000, st->silk_mode.desiredInternalSampleRate); - } - if (effective_max_rate < 9600) - { - st->silk_mode.maxInternalSampleRate = 8000; - st->silk_mode.desiredInternalSampleRate = IMIN(8000, st->silk_mode.desiredInternalSampleRate); - } - } else { - st->silk_mode.maxInternalSampleRate = 16000; - } - - st->silk_mode.useCBR = !st->use_vbr; - - /* Call SILK encoder for the low band */ - nBytes = IMIN(1275, max_data_bytes-1-redundancy_bytes); - - st->silk_mode.maxBits = nBytes*8; - /* Only allow up to 90% of the bits for hybrid mode*/ - if (st->mode == MODE_HYBRID) - st->silk_mode.maxBits = (opus_int32)st->silk_mode.maxBits*9/10; - if (st->silk_mode.useCBR) - { - st->silk_mode.maxBits = (st->silk_mode.bitRate * frame_size / (st->Fs * 8))*8; - /* Reduce the initial target to make it easier to reach the CBR rate */ - st->silk_mode.bitRate = IMAX(1, st->silk_mode.bitRate-2000); - } - - if (prefill) - { - opus_int32 zero=0; -#ifdef FIXED_POINT - pcm_silk = st->delay_buffer; -#else - for (i=0;iencoder_buffer*st->channels;i++) - pcm_silk[i] = FLOAT2INT16(st->delay_buffer[i]); -#endif - silk_Encode( silk_enc, &st->silk_mode, pcm_silk, st->encoder_buffer, NULL, &zero, 1 ); - } - -#ifdef FIXED_POINT - pcm_silk = pcm_buf+delay_compensation*st->channels; -#else - for (i=0;ichannels;i++) - pcm_silk[i] = FLOAT2INT16(pcm_buf[delay_compensation*st->channels + i]); -#endif - ret = silk_Encode( silk_enc, &st->silk_mode, pcm_silk, frame_size, &enc, &nBytes, 0 ); - if( ret ) { - /*fprintf (stderr, "SILK encode error: %d\n", ret);*/ - /* Handle error */ - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - if (nBytes==0) - { - st->rangeFinal = 0; - data[-1] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); - RESTORE_STACK; - return 1; - } - /* Extract SILK internal bandwidth for signaling in first byte */ - if( st->mode == MODE_SILK_ONLY ) { - if( st->silk_mode.internalSampleRate == 8000 ) { - curr_bandwidth = OPUS_BANDWIDTH_NARROWBAND; - } else if( st->silk_mode.internalSampleRate == 12000 ) { - curr_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; - } else if( st->silk_mode.internalSampleRate == 16000 ) { - curr_bandwidth = OPUS_BANDWIDTH_WIDEBAND; - } - } else { - silk_assert( st->silk_mode.internalSampleRate == 16000 ); - } - - st->silk_mode.opusCanSwitch = st->silk_mode.switchReady; - /* FIXME: How do we allocate the redundancy for CBR? */ - if (st->silk_mode.opusCanSwitch) - { - redundancy = 1; - celt_to_silk = 0; - st->silk_bw_switch = 1; - } - } - - /* CELT processing */ - { - int endband=21; - - switch(curr_bandwidth) - { - case OPUS_BANDWIDTH_NARROWBAND: - endband = 13; - break; - case OPUS_BANDWIDTH_MEDIUMBAND: - case OPUS_BANDWIDTH_WIDEBAND: - endband = 17; - break; - case OPUS_BANDWIDTH_SUPERWIDEBAND: - endband = 19; - break; - case OPUS_BANDWIDTH_FULLBAND: - endband = 21; - break; - } - celt_encoder_ctl(celt_enc, CELT_SET_END_BAND(endband)); - celt_encoder_ctl(celt_enc, CELT_SET_CHANNELS(st->stream_channels)); - } - celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); - if (st->mode != MODE_SILK_ONLY) - { - celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); - /* Allow prediction unless we decide to disable it later */ - celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(2)); - - if (st->mode == MODE_HYBRID) - { - int len; - - len = (ec_tell(&enc)+7)>>3; - if (redundancy) - len += st->mode == MODE_HYBRID ? 3 : 1; - if( st->use_vbr ) { - nb_compr_bytes = len + bytes_target - (st->silk_mode.bitRate * frame_size) / (8 * st->Fs); - } else { - /* check if SILK used up too much */ - nb_compr_bytes = len > bytes_target ? len : bytes_target; - } - } else { - if (st->use_vbr) - { - celt_encoder_ctl(celt_enc, OPUS_SET_VBR(1)); - celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(st->vbr_constraint)); - celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps)); - nb_compr_bytes = max_data_bytes-1-redundancy_bytes; - } else { - nb_compr_bytes = bytes_target; - } - } - - } else { - nb_compr_bytes = 0; - } - - ALLOC(tmp_prefill, st->channels*st->Fs/400, opus_val16); - if (st->mode != MODE_SILK_ONLY && st->mode != st->prev_mode && st->prev_mode > 0) - { - for (i=0;ichannels*st->Fs/400;i++) - tmp_prefill[i] = st->delay_buffer[(st->encoder_buffer-st->delay_compensation-st->Fs/400)*st->channels + i]; - } - - for (i=0;ichannels*(st->encoder_buffer-(frame_size+delay_compensation));i++) - st->delay_buffer[i] = st->delay_buffer[i+st->channels*frame_size]; - for (;iencoder_buffer*st->channels;i++) - st->delay_buffer[i] = pcm_buf[(frame_size+delay_compensation-st->encoder_buffer)*st->channels+i]; - - - if (st->mode != MODE_HYBRID || st->stream_channels==1) - st->silk_mode.stereoWidth_Q14 = 1<<14; - if( st->channels == 2 ) { - /* Apply stereo width reduction (at low bitrates) */ - if( st->hybrid_stereo_width_Q14 < (1 << 14) || st->silk_mode.stereoWidth_Q14 < (1 << 14) ) { - opus_val16 g1, g2; - const CELTMode *celt_mode; - - celt_encoder_ctl(celt_enc, CELT_GET_MODE(&celt_mode)); - g1 = st->hybrid_stereo_width_Q14; - g2 = (opus_val16)(st->silk_mode.stereoWidth_Q14); -#ifdef FIXED_POINT - g1 = g1==16384 ? Q15ONE : SHL16(g1,1); - g2 = g2==16384 ? Q15ONE : SHL16(g2,1); -#else - g1 *= (1.f/16384); - g2 *= (1.f/16384); -#endif - stereo_fade(pcm_buf, pcm_buf, g1, g2, celt_mode->overlap, - frame_size, st->channels, celt_mode->window, st->Fs); - st->hybrid_stereo_width_Q14 = st->silk_mode.stereoWidth_Q14; - } - } - - if ( st->mode != MODE_CELT_ONLY && ec_tell(&enc)+17+20*(st->mode == MODE_HYBRID) <= 8*(max_data_bytes-1)) - { - /* For SILK mode, the redundancy is inferred from the length */ - if (st->mode == MODE_HYBRID && (redundancy || ec_tell(&enc)+37 <= 8*nb_compr_bytes)) - ec_enc_bit_logp(&enc, redundancy, 12); - if (redundancy) - { - int max_redundancy; - ec_enc_bit_logp(&enc, celt_to_silk, 1); - if (st->mode == MODE_HYBRID) - max_redundancy = (max_data_bytes-1)-nb_compr_bytes-1; - else - max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+7)>>3); - /* Target the same bit-rate for redundancy as for the rest, - up to a max of 257 bytes */ - redundancy_bytes = IMIN(max_redundancy, st->bitrate_bps/1600); - redundancy_bytes = IMIN(257, IMAX(2, redundancy_bytes)); - if (st->mode == MODE_HYBRID) - ec_enc_uint(&enc, redundancy_bytes-2, 256); - } - } else { - redundancy = 0; - } - - if (!redundancy) - { - st->silk_bw_switch = 0; - redundancy_bytes = 0; - } - if (st->mode != MODE_CELT_ONLY)start_band=17; - - if (st->mode == MODE_SILK_ONLY) - { - ret = (ec_tell(&enc)+7)>>3; - ec_enc_done(&enc); - nb_compr_bytes = ret; - } else { - nb_compr_bytes = IMIN((max_data_bytes-1)-redundancy_bytes, nb_compr_bytes); - ec_enc_shrink(&enc, nb_compr_bytes); - } - - - /* 5 ms redundant frame for CELT->SILK */ - if (redundancy && celt_to_silk) - { - int err; - celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(0)); - celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); - err = celt_encode_with_ec(celt_enc, pcm_buf, st->Fs/200, data+nb_compr_bytes, redundancy_bytes, NULL); - if (err < 0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - celt_encoder_ctl(celt_enc, OPUS_GET_FINAL_RANGE(&redundant_rng)); - celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); - } - - celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(start_band)); - - if (st->mode != MODE_SILK_ONLY) - { - if (st->mode != st->prev_mode && st->prev_mode > 0) - { - unsigned char dummy[2]; - celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); - - /* Prefilling */ - celt_encode_with_ec(celt_enc, tmp_prefill, st->Fs/400, dummy, 2, NULL); - celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(0)); - } - /* If false, we already busted the budget and we'll end up with a "PLC packet" */ - if (ec_tell(&enc) <= 8*nb_compr_bytes) - { - ret = celt_encode_with_ec(celt_enc, pcm_buf, frame_size, NULL, nb_compr_bytes, &enc); - if (ret < 0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - } - } - - /* 5 ms redundant frame for SILK->CELT */ - if (redundancy && !celt_to_silk) - { - int err; - unsigned char dummy[2]; - int N2, N4; - N2 = st->Fs/200; - N4 = st->Fs/400; - - celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); - celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(0)); - celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(0)); - - /* NOTE: We could speed this up slightly (at the expense of code size) by just adding a function that prefills the buffer */ - celt_encode_with_ec(celt_enc, pcm_buf+st->channels*(frame_size-N2-N4), N4, dummy, 2, NULL); - - err = celt_encode_with_ec(celt_enc, pcm_buf+st->channels*(frame_size-N2), N2, data+nb_compr_bytes, redundancy_bytes, NULL); - if (err < 0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - celt_encoder_ctl(celt_enc, OPUS_GET_FINAL_RANGE(&redundant_rng)); - } - - - - /* Signalling the mode in the first byte */ - data--; - data[0] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); - - st->rangeFinal = enc.rng ^ redundant_rng; - - if (to_celt) - st->prev_mode = MODE_CELT_ONLY; - else - st->prev_mode = st->mode; - st->prev_channels = st->stream_channels; - st->prev_framesize = frame_size; - - st->first = 0; - - /* In the unlikely case that the SILK encoder busted its target, tell - the decoder to call the PLC */ - if (ec_tell(&enc) > (max_data_bytes-1)*8) - { - if (max_data_bytes < 2) - { - RESTORE_STACK; - return OPUS_BUFFER_TOO_SMALL; - } - data[1] = 0; - ret = 1; - st->rangeFinal = 0; - } else if (st->mode==MODE_SILK_ONLY&&!redundancy) - { - /*When in LPC only mode it's perfectly - reasonable to strip off trailing zero bytes as - the required range decoder behavior is to - fill these in. This can't be done when the MDCT - modes are used because the decoder needs to know - the actual length for allocation purposes.*/ - while(ret>2&&data[ret]==0)ret--; - } - /* Count ToC and redundancy */ - ret += 1+redundancy_bytes; - if (!st->use_vbr && ret >= 3) - { - if (pad_frame(data, ret, max_data_bytes)) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - ret = max_data_bytes; - } - RESTORE_STACK; - return ret; -} - -#ifdef FIXED_POINT - -#ifndef DISABLE_FLOAT_API -opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int frame_size, - unsigned char *data, opus_int32 max_data_bytes) -{ - int i, ret; - VARDECL(opus_int16, in); - ALLOC_STACK; - - if(frame_size<0) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - - ALLOC(in, frame_size*st->channels, opus_int16); - - for (i=0;ichannels;i++) - in[i] = FLOAT2INT16(pcm[i]); - ret = opus_encode(st, in, frame_size, data, max_data_bytes); - RESTORE_STACK; - return ret; -} -#endif - -#else -opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int frame_size, - unsigned char *data, opus_int32 max_data_bytes) -{ - int i, ret; - VARDECL(float, in); - ALLOC_STACK; - - ALLOC(in, frame_size*st->channels, float); - - for (i=0;ichannels;i++) - in[i] = (1.0f/32768)*pcm[i]; - ret = opus_encode_float(st, in, frame_size, data, max_data_bytes); - RESTORE_STACK; - return ret; -} -#endif - - -int opus_encoder_ctl(OpusEncoder *st, int request, ...) -{ - int ret; - CELTEncoder *celt_enc; - va_list ap; - - ret = OPUS_OK; - va_start(ap, request); - - celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); - - switch (request) - { - case OPUS_SET_APPLICATION_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if ( (value != OPUS_APPLICATION_VOIP && value != OPUS_APPLICATION_AUDIO - && value != OPUS_APPLICATION_RESTRICTED_LOWDELAY) - || (!st->first && st->application != value)) - { - ret = OPUS_BAD_ARG; - break; - } - st->application = value; - } - break; - case OPUS_GET_APPLICATION_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->application; - } - break; - case OPUS_SET_BITRATE_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value != OPUS_AUTO && value != OPUS_BITRATE_MAX) - { - if (value <= 0) - goto bad_arg; - else if (value <= 500) - value = 500; - else if (value > (opus_int32)300000*st->channels) - value = (opus_int32)300000*st->channels; - } - st->user_bitrate_bps = value; - } - break; - case OPUS_GET_BITRATE_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = user_bitrate_to_bitrate(st, st->prev_framesize, 1276); - } - break; - case OPUS_SET_FORCE_CHANNELS_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if((value<1 || value>st->channels) && value != OPUS_AUTO) - return OPUS_BAD_ARG; - st->force_channels = value; - } - break; - case OPUS_GET_FORCE_CHANNELS_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->force_channels; - } - break; - case OPUS_SET_MAX_BANDWIDTH_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) - return OPUS_BAD_ARG; - st->max_bandwidth = value; - if (st->max_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { - st->silk_mode.maxInternalSampleRate = 8000; - } else if (st->max_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { - st->silk_mode.maxInternalSampleRate = 12000; - } else { - st->silk_mode.maxInternalSampleRate = 16000; - } - } - break; - case OPUS_GET_MAX_BANDWIDTH_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->max_bandwidth; - } - break; - case OPUS_SET_BANDWIDTH_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if ((value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) && value != OPUS_AUTO) - return OPUS_BAD_ARG; - st->user_bandwidth = value; - if (st->user_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { - st->silk_mode.maxInternalSampleRate = 8000; - } else if (st->user_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { - st->silk_mode.maxInternalSampleRate = 12000; - } else { - st->silk_mode.maxInternalSampleRate = 16000; - } - } - break; - case OPUS_GET_BANDWIDTH_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->bandwidth; - } - break; - case OPUS_SET_DTX_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>1) - return OPUS_BAD_ARG; - st->silk_mode.useDTX = value; - } - break; - case OPUS_GET_DTX_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->silk_mode.useDTX; - } - break; - case OPUS_SET_COMPLEXITY_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>10) - return OPUS_BAD_ARG; - st->silk_mode.complexity = value; - celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(value)); - } - break; - case OPUS_GET_COMPLEXITY_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->silk_mode.complexity; - } - break; - case OPUS_SET_INBAND_FEC_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>1) - return OPUS_BAD_ARG; - st->silk_mode.useInBandFEC = value; - } - break; - case OPUS_GET_INBAND_FEC_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->silk_mode.useInBandFEC; - } - break; - case OPUS_SET_PACKET_LOSS_PERC_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value < 0 || value > 100) - return OPUS_BAD_ARG; - st->silk_mode.packetLossPercentage = value; - celt_encoder_ctl(celt_enc, OPUS_SET_PACKET_LOSS_PERC(value)); - } - break; - case OPUS_GET_PACKET_LOSS_PERC_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->silk_mode.packetLossPercentage; - } - break; - case OPUS_SET_VBR_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>1) - return OPUS_BAD_ARG; - st->use_vbr = value; - st->silk_mode.useCBR = 1-value; - } - break; - case OPUS_GET_VBR_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->use_vbr; - } - break; - case OPUS_SET_VOICE_RATIO_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value>100 || value<-1) - goto bad_arg; - st->voice_ratio = value; - } - break; - case OPUS_GET_VOICE_RATIO_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->voice_ratio; - } - break; - case OPUS_SET_VBR_CONSTRAINT_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>1) - return OPUS_BAD_ARG; - st->vbr_constraint = value; - } - break; - case OPUS_GET_VBR_CONSTRAINT_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->vbr_constraint; - } - break; - case OPUS_SET_SIGNAL_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value!=OPUS_AUTO && value!=OPUS_SIGNAL_VOICE && value!=OPUS_SIGNAL_MUSIC) - return OPUS_BAD_ARG; - st->signal_type = value; - } - break; - case OPUS_GET_SIGNAL_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->signal_type; - } - break; - case OPUS_GET_LOOKAHEAD_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - *value = st->Fs/400; - if (st->application != OPUS_APPLICATION_RESTRICTED_LOWDELAY) - *value += st->delay_compensation; - } - break; - case OPUS_GET_SAMPLE_RATE_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (value==NULL) - { - ret = OPUS_BAD_ARG; - break; - } - *value = st->Fs; - } - break; - case OPUS_GET_FINAL_RANGE_REQUEST: - { - opus_uint32 *value = va_arg(ap, opus_uint32*); - *value = st->rangeFinal; - } - break; - case OPUS_SET_LSB_DEPTH_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - ret = celt_encoder_ctl(celt_enc, OPUS_SET_LSB_DEPTH(value)); - } - break; - case OPUS_GET_LSB_DEPTH_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - celt_encoder_ctl(celt_enc, OPUS_GET_LSB_DEPTH(value)); - } - break; - case OPUS_RESET_STATE: - { - void *silk_enc; - silk_EncControlStruct dummy; - silk_enc = (char*)st+st->silk_enc_offset; - - OPUS_CLEAR((char*)&st->OPUS_ENCODER_RESET_START, - sizeof(OpusEncoder)- - ((char*)&st->OPUS_ENCODER_RESET_START - (char*)st)); - - celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); - silk_InitEncoder( silk_enc, &dummy ); - st->stream_channels = st->channels; - st->hybrid_stereo_width_Q14 = 1 << 14; - st->first = 1; - st->mode = MODE_HYBRID; - st->bandwidth = OPUS_BANDWIDTH_FULLBAND; - st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); - } - break; - case OPUS_SET_FORCE_MODE_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if ((value < MODE_SILK_ONLY || value > MODE_CELT_ONLY) && value != OPUS_AUTO) - goto bad_arg; - st->user_forced_mode = value; - } - break; - default: - /* fprintf(stderr, "unknown opus_encoder_ctl() request: %d", request);*/ - ret = OPUS_UNIMPLEMENTED; - break; - } - va_end(ap); - return ret; -bad_arg: - va_end(ap); - return OPUS_BAD_ARG; -} - -void opus_encoder_destroy(OpusEncoder *st) -{ - opus_free(st); -} diff --git a/external/opus-1.0.3/src/opus_multistream.c b/external/opus-1.0.3/src/opus_multistream.c deleted file mode 100644 index d8e7b958..00000000 --- a/external/opus-1.0.3/src/opus_multistream.c +++ /dev/null @@ -1,1278 +0,0 @@ -/* Copyright (c) 2011 Xiph.Org Foundation - Written by Jean-Marc Valin */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "opus_multistream.h" -#include "opus.h" -#include "opus_private.h" -#include "stack_alloc.h" -#include -#include "float_cast.h" -#include "os_support.h" - -typedef struct ChannelLayout { - int nb_channels; - int nb_streams; - int nb_coupled_streams; - unsigned char mapping[256]; -} ChannelLayout; - -typedef struct { - int nb_streams; - int nb_coupled_streams; - unsigned char mapping[8]; -} VorbisLayout; - -#ifdef OPUS_ENABLE_ENCODER -/* Index is nb_channel-1*/ -static const VorbisLayout vorbis_mappings[8] = { - {1, 0, {0}}, /* 1: mono */ - {1, 1, {0, 1}}, /* 2: stereo */ - {2, 1, {0, 2, 1}}, /* 3: 1-d surround */ - {2, 2, {0, 1, 2, 3}}, /* 4: quadraphonic surround */ - {3, 2, {0, 4, 1, 2, 3}}, /* 5: 5-channel surround */ - {4, 2, {0, 4, 1, 2, 3, 5}}, /* 6: 5.1 surround */ - {4, 3, {0, 4, 1, 2, 3, 5, 6}}, /* 7: 6.1 surround */ - {5, 3, {0, 6, 1, 2, 3, 4, 5, 7}}, /* 8: 7.1 surround */ -}; - -struct OpusMSEncoder { - ChannelLayout layout; - opus_int32 bitrate_bps; - int surround; - int lfe_stream; - /* Encoder states go here */ -}; -#endif /* OPUS_ENABLE_ENCODER */ - -struct OpusMSDecoder { - ChannelLayout layout; - /* Decoder states go here */ -}; - -#ifdef FIXED_POINT -#define opus_encode_native opus_encode -#else -#define opus_encode_native opus_encode_float -#endif - -static int validate_layout(const ChannelLayout *layout) -{ - int i, max_channel; - - max_channel = layout->nb_streams+layout->nb_coupled_streams; - if (max_channel>255) - return 0; - for (i=0;inb_channels;i++) - { - if (layout->mapping[i] >= max_channel && layout->mapping[i] != 255) - return 0; - } - return 1; -} - - -static int get_left_channel(const ChannelLayout *layout, int stream_id, int prev) -{ - int i; - i = (prev<0) ? 0 : prev+1; - for (;inb_channels;i++) - { - if (layout->mapping[i]==stream_id*2) - return i; - } - return -1; -} - -static int get_right_channel(const ChannelLayout *layout, int stream_id, int prev) -{ - int i; - i = (prev<0) ? 0 : prev+1; - for (;inb_channels;i++) - { - if (layout->mapping[i]==stream_id*2+1) - return i; - } - return -1; -} - -static int get_mono_channel(const ChannelLayout *layout, int stream_id, int prev) -{ - int i; - i = (prev<0) ? 0 : prev+1; - for (;inb_channels;i++) - { - if (layout->mapping[i]==stream_id+layout->nb_coupled_streams) - return i; - } - return -1; -} - -#ifdef OPUS_ENABLE_ENCODER -static int validate_encoder_layout(const ChannelLayout *layout) -{ - int s; - for (s=0;snb_streams;s++) - { - if (s < layout->nb_coupled_streams) - { - if (get_left_channel(layout, s, -1)==-1) - return 0; - if (get_right_channel(layout, s, -1)==-1) - return 0; - } else { - if (get_mono_channel(layout, s, -1)==-1) - return 0; - } - } - return 1; -} - -opus_int32 opus_multistream_encoder_get_size(int nb_streams, int nb_coupled_streams) -{ - int coupled_size; - int mono_size; - - if(nb_streams<1||nb_coupled_streams>nb_streams||nb_coupled_streams<0)return 0; - coupled_size = opus_encoder_get_size(2); - mono_size = opus_encoder_get_size(1); - return align(sizeof(OpusMSEncoder)) - + nb_coupled_streams * align(coupled_size) - + (nb_streams-nb_coupled_streams) * align(mono_size); -} - -opus_int32 opus_multistream_surround_encoder_get_size(int channels, int mapping_family) -{ - int nb_streams; - int nb_coupled_streams; - opus_int32 size; - - if (mapping_family==0) - { - if (channels==1) - { - nb_streams=1; - nb_coupled_streams=0; - } else if (channels==2) - { - nb_streams=1; - nb_coupled_streams=1; - } else - return 0; - } else if (mapping_family==1 && channels<=8 && channels>=1) - { - nb_streams=vorbis_mappings[channels-1].nb_streams; - nb_coupled_streams=vorbis_mappings[channels-1].nb_coupled_streams; - } else if (mapping_family==255) - { - nb_streams=channels; - nb_coupled_streams=0; - } else - return 0; - size = opus_multistream_encoder_get_size(nb_streams, nb_coupled_streams); - return size; -} - - -static int opus_multistream_encoder_init_impl( - OpusMSEncoder *st, - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping, - int application, - int surround -) -{ - int coupled_size; - int mono_size; - int i, ret; - char *ptr; - - if ((channels>255) || (channels<1) || (coupled_streams>streams) || - (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) - return OPUS_BAD_ARG; - - st->layout.nb_channels = channels; - st->layout.nb_streams = streams; - st->layout.nb_coupled_streams = coupled_streams; - if (!surround) - st->lfe_stream = -1; - st->bitrate_bps = OPUS_AUTO; - for (i=0;ilayout.nb_channels;i++) - st->layout.mapping[i] = mapping[i]; - if (!validate_layout(&st->layout) || !validate_encoder_layout(&st->layout)) - return OPUS_BAD_ARG; - ptr = (char*)st + align(sizeof(OpusMSEncoder)); - coupled_size = opus_encoder_get_size(2); - mono_size = opus_encoder_get_size(1); - - for (i=0;ilayout.nb_coupled_streams;i++) - { - ret = opus_encoder_init((OpusEncoder*)ptr, Fs, 2, application); - if(ret!=OPUS_OK)return ret; - ptr += align(coupled_size); - } - for (;ilayout.nb_streams;i++) - { - ret = opus_encoder_init((OpusEncoder*)ptr, Fs, 1, application); - if(ret!=OPUS_OK)return ret; - ptr += align(mono_size); - } - st->surround = surround; - return OPUS_OK; -} - -int opus_multistream_encoder_init( - OpusMSEncoder *st, - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping, - int application -) -{ - return opus_multistream_encoder_init_impl(st, Fs, channels, streams, coupled_streams, mapping, application, 0); -} - -int opus_multistream_surround_encoder_init( - OpusMSEncoder *st, - opus_int32 Fs, - int channels, - int mapping_family, - int *streams, - int *coupled_streams, - unsigned char *mapping, - int application -) -{ - if ((channels>255) || (channels<1)) - return OPUS_BAD_ARG; - st->lfe_stream = -1; - if (mapping_family==0) - { - if (channels==1) - { - *streams=1; - *coupled_streams=0; - mapping[0]=0; - } else if (channels==2) - { - *streams=1; - *coupled_streams=1; - mapping[0]=0; - mapping[1]=1; - } else - return OPUS_UNIMPLEMENTED; - } else if (mapping_family==1 && channels<=8 && channels>=1) - { - int i; - *streams=vorbis_mappings[channels-1].nb_streams; - *coupled_streams=vorbis_mappings[channels-1].nb_coupled_streams; - for (i=0;i=6) - st->lfe_stream = *streams-1; - } else if (mapping_family==255) - { - int i; - *streams=channels; - *coupled_streams=0; - for(i=0;i2&&mapping_family==1); -} - -OpusMSEncoder *opus_multistream_encoder_create( - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping, - int application, - int *error -) -{ - int ret; - OpusMSEncoder *st; - if ((channels>255) || (channels<1) || (coupled_streams>streams) || - (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - st = (OpusMSEncoder *)opus_alloc(opus_multistream_encoder_get_size(streams, coupled_streams)); - if (st==NULL) - { - if (error) - *error = OPUS_ALLOC_FAIL; - return NULL; - } - ret = opus_multistream_encoder_init(st, Fs, channels, streams, coupled_streams, mapping, application); - if (ret != OPUS_OK) - { - opus_free(st); - st = NULL; - } - if (error) - *error = ret; - return st; -} - -OpusMSEncoder *opus_multistream_surround_encoder_create( - opus_int32 Fs, - int channels, - int mapping_family, - int *streams, - int *coupled_streams, - unsigned char *mapping, - int application, - int *error -) -{ - int ret; - opus_int32 size; - OpusMSEncoder *st; - if ((channels>255) || (channels<1)) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - size = opus_multistream_surround_encoder_get_size(channels, mapping_family); - if (!size) - { - if (error) - *error = OPUS_UNIMPLEMENTED; - return NULL; - } - st = (OpusMSEncoder *)opus_alloc(size); - if (st==NULL) - { - if (error) - *error = OPUS_ALLOC_FAIL; - return NULL; - } - ret = opus_multistream_surround_encoder_init(st, Fs, channels, mapping_family, streams, coupled_streams, mapping, application); - if (ret != OPUS_OK) - { - opus_free(st); - st = NULL; - } - if (error) - *error = ret; - return st; -} - -typedef void (*opus_copy_channel_in_func)( - opus_val16 *dst, - int dst_stride, - const void *src, - int src_stride, - int src_channel, - int frame_size -); - -static void surround_rate_allocation( - OpusMSEncoder *st, - opus_int32 *rate, - int frame_size - ) -{ - int i; - opus_int32 channel_rate; - opus_int32 Fs; - char *ptr; - int stream_offset; - int lfe_offset; - int coupled_ratio; /* Q8 */ - int lfe_ratio; /* Q8 */ - - ptr = (char*)st + align(sizeof(OpusMSEncoder)); - opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_SAMPLE_RATE(&Fs)); - - /* We start by giving each stream (coupled or uncoupled) the same bitrate. - This models the main saving of coupled channels over uncoupled. */ - stream_offset = 20000; - /* The LFE stream is an exception to the above and gets fewer bits. */ - lfe_offset = 7000; - /* Coupled streams get twice the mono rate after the first 20 kb/s. */ - coupled_ratio = 512; - /* Should depend on the bitrate, for now we assume LFE gets 3/8 the bits of mono */ - lfe_ratio = 96; - - /* Compute bitrate allocation between streams */ - if (st->bitrate_bps==OPUS_AUTO) - { - channel_rate = Fs+60*Fs/frame_size; - } else if (st->bitrate_bps==OPUS_BITRATE_MAX) - { - channel_rate = 300000; - } else { - int nb_lfe; - int nb_uncoupled; - int nb_coupled; - int total; - nb_lfe = (st->lfe_stream!=-1); - nb_coupled = st->layout.nb_coupled_streams; - nb_uncoupled = st->layout.nb_streams-nb_coupled-nb_lfe; - total = (nb_uncoupled<<8) /* mono */ - + coupled_ratio*nb_coupled /* stereo */ - + nb_lfe*lfe_ratio; - channel_rate = 256*(st->bitrate_bps-lfe_offset*nb_lfe-stream_offset*(nb_coupled+nb_uncoupled))/total; - } - - for (i=0;ilayout.nb_streams;i++) - { - if (ilayout.nb_coupled_streams) - rate[i] = stream_offset+(channel_rate*coupled_ratio>>8); - else if (i!=st->lfe_stream) - rate[i] = stream_offset+channel_rate; - else - rate[i] = lfe_offset+(channel_rate*lfe_ratio>>8); - } -} - -/* Max size in case the encoder decides to return three frames */ -#define MS_FRAME_TMP (3*1275+7) -static int opus_multistream_encode_native -( - OpusMSEncoder *st, - opus_copy_channel_in_func copy_channel_in, - const void *pcm, - int frame_size, - unsigned char *data, - opus_int32 max_data_bytes -) -{ - opus_int32 Fs; - int coupled_size; - int mono_size; - int s; - char *ptr; - int tot_size; - VARDECL(opus_val16, buf); - unsigned char tmp_data[MS_FRAME_TMP]; - OpusRepacketizer rp; - opus_int32 bitrates[256]; - ALLOC_STACK; - - ptr = (char*)st + align(sizeof(OpusMSEncoder)); - opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_SAMPLE_RATE(&Fs)); - - if (400*frame_size < Fs) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - /* Validate frame_size before using it to allocate stack space. - This mirrors the checks in opus_encode[_float](). */ - if (400*frame_size != Fs && 200*frame_size != Fs && - 100*frame_size != Fs && 50*frame_size != Fs && - 25*frame_size != Fs && 50*frame_size != 3*Fs) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - ALLOC(buf, 2*frame_size, opus_val16); - coupled_size = opus_encoder_get_size(2); - mono_size = opus_encoder_get_size(1); - - if (max_data_bytes < 4*st->layout.nb_streams-1) - { - RESTORE_STACK; - return OPUS_BUFFER_TOO_SMALL; - } - /* Compute bitrate allocation between streams (this could be a lot better) */ - surround_rate_allocation(st, bitrates, frame_size); - - ptr = (char*)st + align(sizeof(OpusMSEncoder)); - for (s=0;slayout.nb_streams;s++) - { - OpusEncoder *enc; - enc = (OpusEncoder*)ptr; - if (s < st->layout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrates[s])); - if (st->surround) - { - opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_CELT_ONLY)); - opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); - if (s < st->layout.nb_coupled_streams) - opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(2)); - } - } - - ptr = (char*)st + align(sizeof(OpusMSEncoder)); - /* Counting ToC */ - tot_size = 0; - for (s=0;slayout.nb_streams;s++) - { - OpusEncoder *enc; - int len; - int curr_max; - - opus_repacketizer_init(&rp); - enc = (OpusEncoder*)ptr; - if (s < st->layout.nb_coupled_streams) - { - int left, right; - left = get_left_channel(&st->layout, s, -1); - right = get_right_channel(&st->layout, s, -1); - (*copy_channel_in)(buf, 2, - pcm, st->layout.nb_channels, left, frame_size); - (*copy_channel_in)(buf+1, 2, - pcm, st->layout.nb_channels, right, frame_size); - ptr += align(coupled_size); - } else { - int chan = get_mono_channel(&st->layout, s, -1); - (*copy_channel_in)(buf, 1, - pcm, st->layout.nb_channels, chan, frame_size); - ptr += align(mono_size); - } - /* number of bytes left (+Toc) */ - curr_max = max_data_bytes - tot_size; - /* Reserve three bytes for the last stream and four for the others */ - curr_max -= IMAX(0,4*(st->layout.nb_streams-s-1)-1); - curr_max = IMIN(curr_max,MS_FRAME_TMP); - len = opus_encode_native(enc, buf, frame_size, tmp_data, curr_max); - if (len<0) - { - RESTORE_STACK; - return len; - } - /* We need to use the repacketizer to add the self-delimiting lengths - while taking into account the fact that the encoder can now return - more than one frame at a time (e.g. 60 ms CELT-only) */ - opus_repacketizer_cat(&rp, tmp_data, len); - len = opus_repacketizer_out_range_impl(&rp, 0, opus_repacketizer_get_nb_frames(&rp), data, max_data_bytes-tot_size, s != st->layout.nb_streams-1); - data += len; - tot_size += len; - } - RESTORE_STACK; - return tot_size; - -} - -#if !defined(DISABLE_FLOAT_API) -static void opus_copy_channel_in_float( - opus_val16 *dst, - int dst_stride, - const void *src, - int src_stride, - int src_channel, - int frame_size -) -{ - const float *float_src; - int i; - float_src = (const float *)src; - for (i=0;ibitrate_bps = value; - } - break; - case OPUS_GET_BITRATE_REQUEST: - { - int s; - opus_int32 *value = va_arg(ap, opus_int32*); - *value = 0; - for (s=0;slayout.nb_streams;s++) - { - opus_int32 rate; - OpusEncoder *enc; - enc = (OpusEncoder*)ptr; - if (s < st->layout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - opus_encoder_ctl(enc, request, &rate); - *value += rate; - } - } - break; - case OPUS_GET_LSB_DEPTH_REQUEST: - case OPUS_GET_VBR_REQUEST: - case OPUS_GET_APPLICATION_REQUEST: - case OPUS_GET_BANDWIDTH_REQUEST: - case OPUS_GET_COMPLEXITY_REQUEST: - case OPUS_GET_PACKET_LOSS_PERC_REQUEST: - case OPUS_GET_DTX_REQUEST: - case OPUS_GET_VOICE_RATIO_REQUEST: - case OPUS_GET_VBR_CONSTRAINT_REQUEST: - case OPUS_GET_SIGNAL_REQUEST: - case OPUS_GET_LOOKAHEAD_REQUEST: - case OPUS_GET_SAMPLE_RATE_REQUEST: - case OPUS_GET_INBAND_FEC_REQUEST: - case OPUS_GET_FORCE_CHANNELS_REQUEST: - { - OpusEncoder *enc; - /* For int32* GET params, just query the first stream */ - opus_int32 *value = va_arg(ap, opus_int32*); - enc = (OpusEncoder*)ptr; - ret = opus_encoder_ctl(enc, request, value); - } - break; - case OPUS_GET_FINAL_RANGE_REQUEST: - { - int s; - opus_uint32 *value = va_arg(ap, opus_uint32*); - opus_uint32 tmp; - *value=0; - for (s=0;slayout.nb_streams;s++) - { - OpusEncoder *enc; - enc = (OpusEncoder*)ptr; - if (s < st->layout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - ret = opus_encoder_ctl(enc, request, &tmp); - if (ret != OPUS_OK) break; - *value ^= tmp; - } - } - break; - case OPUS_SET_LSB_DEPTH_REQUEST: - case OPUS_SET_COMPLEXITY_REQUEST: - case OPUS_SET_VBR_REQUEST: - case OPUS_SET_VBR_CONSTRAINT_REQUEST: - case OPUS_SET_BANDWIDTH_REQUEST: - case OPUS_SET_SIGNAL_REQUEST: - case OPUS_SET_APPLICATION_REQUEST: - case OPUS_SET_INBAND_FEC_REQUEST: - case OPUS_SET_PACKET_LOSS_PERC_REQUEST: - case OPUS_SET_DTX_REQUEST: - case OPUS_SET_FORCE_MODE_REQUEST: - case OPUS_SET_FORCE_CHANNELS_REQUEST: - { - int s; - /* This works for int32 params */ - opus_int32 value = va_arg(ap, opus_int32); - for (s=0;slayout.nb_streams;s++) - { - OpusEncoder *enc; - - enc = (OpusEncoder*)ptr; - if (s < st->layout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - ret = opus_encoder_ctl(enc, request, value); - if (ret != OPUS_OK) - break; - } - } - break; - case OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST: - { - int s; - opus_int32 stream_id; - OpusEncoder **value; - stream_id = va_arg(ap, opus_int32); - if (stream_id<0 || stream_id >= st->layout.nb_streams) - ret = OPUS_BAD_ARG; - value = va_arg(ap, OpusEncoder**); - for (s=0;slayout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - } - *value = (OpusEncoder*)ptr; - } - break; - default: - ret = OPUS_UNIMPLEMENTED; - break; - } - - va_end(ap); - return ret; -bad_arg: - va_end(ap); - return OPUS_BAD_ARG; -} - -void opus_multistream_encoder_destroy(OpusMSEncoder *st) -{ - opus_free(st); -} -#endif /* OPUS_ENABLE_ENCODER */ - - -/* DECODER */ - -opus_int32 opus_multistream_decoder_get_size(int nb_streams, int nb_coupled_streams) -{ - int coupled_size; - int mono_size; - - if(nb_streams<1||nb_coupled_streams>nb_streams||nb_coupled_streams<0)return 0; - coupled_size = opus_decoder_get_size(2); - mono_size = opus_decoder_get_size(1); - return align(sizeof(OpusMSDecoder)) - + nb_coupled_streams * align(coupled_size) - + (nb_streams-nb_coupled_streams) * align(mono_size); -} - -int opus_multistream_decoder_init( - OpusMSDecoder *st, - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping -) -{ - int coupled_size; - int mono_size; - int i, ret; - char *ptr; - - if ((channels>255) || (channels<1) || (coupled_streams>streams) || - (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) - return OPUS_BAD_ARG; - - st->layout.nb_channels = channels; - st->layout.nb_streams = streams; - st->layout.nb_coupled_streams = coupled_streams; - - for (i=0;ilayout.nb_channels;i++) - st->layout.mapping[i] = mapping[i]; - if (!validate_layout(&st->layout)) - return OPUS_BAD_ARG; - - ptr = (char*)st + align(sizeof(OpusMSDecoder)); - coupled_size = opus_decoder_get_size(2); - mono_size = opus_decoder_get_size(1); - - for (i=0;ilayout.nb_coupled_streams;i++) - { - ret=opus_decoder_init((OpusDecoder*)ptr, Fs, 2); - if(ret!=OPUS_OK)return ret; - ptr += align(coupled_size); - } - for (;ilayout.nb_streams;i++) - { - ret=opus_decoder_init((OpusDecoder*)ptr, Fs, 1); - if(ret!=OPUS_OK)return ret; - ptr += align(mono_size); - } - return OPUS_OK; -} - - -OpusMSDecoder *opus_multistream_decoder_create( - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping, - int *error -) -{ - int ret; - OpusMSDecoder *st; - if ((channels>255) || (channels<1) || (coupled_streams>streams) || - (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - st = (OpusMSDecoder *)opus_alloc(opus_multistream_decoder_get_size(streams, coupled_streams)); - if (st==NULL) - { - if (error) - *error = OPUS_ALLOC_FAIL; - return NULL; - } - ret = opus_multistream_decoder_init(st, Fs, channels, streams, coupled_streams, mapping); - if (error) - *error = ret; - if (ret != OPUS_OK) - { - opus_free(st); - st = NULL; - } - return st; -} - -typedef void (*opus_copy_channel_out_func)( - void *dst, - int dst_stride, - int dst_channel, - const opus_val16 *src, - int src_stride, - int frame_size -); - -static int opus_multistream_decode_native( - OpusMSDecoder *st, - const unsigned char *data, - opus_int32 len, - void *pcm, - opus_copy_channel_out_func copy_channel_out, - int frame_size, - int decode_fec -) -{ - opus_int32 Fs; - int coupled_size; - int mono_size; - int s, c; - char *ptr; - int do_plc=0; - VARDECL(opus_val16, buf); - ALLOC_STACK; - - /* Limit frame_size to avoid excessive stack allocations. */ - opus_multistream_decoder_ctl(st, OPUS_GET_SAMPLE_RATE(&Fs)); - frame_size = IMIN(frame_size, Fs/25*3); - ALLOC(buf, 2*frame_size, opus_val16); - ptr = (char*)st + align(sizeof(OpusMSDecoder)); - coupled_size = opus_decoder_get_size(2); - mono_size = opus_decoder_get_size(1); - - if (len==0) - do_plc = 1; - if (len < 0) - return OPUS_BAD_ARG; - if (!do_plc && len < 2*st->layout.nb_streams-1) - return OPUS_INVALID_PACKET; - for (s=0;slayout.nb_streams;s++) - { - OpusDecoder *dec; - int packet_offset, ret; - - dec = (OpusDecoder*)ptr; - ptr += (s < st->layout.nb_coupled_streams) ? align(coupled_size) : align(mono_size); - - if (!do_plc && len<=0) - { - RESTORE_STACK; - return OPUS_INVALID_PACKET; - } - packet_offset = 0; - ret = opus_decode_native(dec, data, len, buf, frame_size, decode_fec, s!=st->layout.nb_streams-1, &packet_offset); - data += packet_offset; - len -= packet_offset; - if (ret > frame_size) - { - RESTORE_STACK; - return OPUS_BUFFER_TOO_SMALL; - } - if (s>0 && ret != frame_size) - { - RESTORE_STACK; - return OPUS_INVALID_PACKET; - } - if (ret <= 0) - { - RESTORE_STACK; - return ret; - } - frame_size = ret; - if (s < st->layout.nb_coupled_streams) - { - int chan, prev; - prev = -1; - /* Copy "left" audio to the channel(s) where it belongs */ - while ( (chan = get_left_channel(&st->layout, s, prev)) != -1) - { - (*copy_channel_out)(pcm, st->layout.nb_channels, chan, - buf, 2, frame_size); - prev = chan; - } - prev = -1; - /* Copy "right" audio to the channel(s) where it belongs */ - while ( (chan = get_right_channel(&st->layout, s, prev)) != -1) - { - (*copy_channel_out)(pcm, st->layout.nb_channels, chan, - buf+1, 2, frame_size); - prev = chan; - } - } else { - int chan, prev; - prev = -1; - /* Copy audio to the channel(s) where it belongs */ - while ( (chan = get_mono_channel(&st->layout, s, prev)) != -1) - { - (*copy_channel_out)(pcm, st->layout.nb_channels, chan, - buf, 1, frame_size); - prev = chan; - } - } - } - /* Handle muted channels */ - for (c=0;clayout.nb_channels;c++) - { - if (st->layout.mapping[c] == 255) - { - (*copy_channel_out)(pcm, st->layout.nb_channels, c, - NULL, 0, frame_size); - } - } - RESTORE_STACK; - return frame_size; -} - -#if !defined(DISABLE_FLOAT_API) -static void opus_copy_channel_out_float( - void *dst, - int dst_stride, - int dst_channel, - const opus_val16 *src, - int src_stride, - int frame_size -) -{ - float *float_dst; - int i; - float_dst = (float*)dst; - if (src != NULL) - { - for (i=0;ilayout.nb_streams;s++) - { - OpusDecoder *dec; - dec = (OpusDecoder*)ptr; - if (s < st->layout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - ret = opus_decoder_ctl(dec, request, &tmp); - if (ret != OPUS_OK) break; - *value ^= tmp; - } - } - break; - case OPUS_RESET_STATE: - { - int s; - for (s=0;slayout.nb_streams;s++) - { - OpusDecoder *dec; - - dec = (OpusDecoder*)ptr; - if (s < st->layout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - ret = opus_decoder_ctl(dec, OPUS_RESET_STATE); - if (ret != OPUS_OK) - break; - } - } - break; - case OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST: - { - int s; - opus_int32 stream_id; - OpusDecoder **value; - stream_id = va_arg(ap, opus_int32); - if (stream_id<0 || stream_id >= st->layout.nb_streams) - ret = OPUS_BAD_ARG; - value = va_arg(ap, OpusDecoder**); - for (s=0;slayout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - } - *value = (OpusDecoder*)ptr; - } - break; - case OPUS_SET_GAIN_REQUEST: - { - int s; - /* This works for int32 params */ - opus_int32 value = va_arg(ap, opus_int32); - for (s=0;slayout.nb_streams;s++) - { - OpusDecoder *dec; - - dec = (OpusDecoder*)ptr; - if (s < st->layout.nb_coupled_streams) - ptr += align(coupled_size); - else - ptr += align(mono_size); - ret = opus_decoder_ctl(dec, request, value); - if (ret != OPUS_OK) - break; - } - } - break; - default: - ret = OPUS_UNIMPLEMENTED; - break; - } - - va_end(ap); - return ret; -} - - -void opus_multistream_decoder_destroy(OpusMSDecoder *st) -{ - opus_free(st); -} diff --git a/external/opus-1.0.3/src/opus_private.h b/external/opus-1.0.3/src/opus_private.h deleted file mode 100644 index c948f771..00000000 --- a/external/opus-1.0.3/src/opus_private.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2012 Xiph.Org Foundation - Written by Jean-Marc Valin */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - - -#ifndef OPUS_PRIVATE_H -#define OPUS_PRIVATE_H - -#include "arch.h" -#include "opus.h" - -struct OpusRepacketizer { - unsigned char toc; - int nb_frames; - const unsigned char *frames[48]; - opus_int16 len[48]; - int framesize; -}; - - -#define MODE_SILK_ONLY 1000 -#define MODE_HYBRID 1001 -#define MODE_CELT_ONLY 1002 - -#define OPUS_SET_VOICE_RATIO_REQUEST 11018 -#define OPUS_GET_VOICE_RATIO_REQUEST 11019 - -/** Configures the encoder's expected percentage of voice - * opposed to music or other signals. - * - * @note This interface is currently more aspiration than actuality. It's - * ultimately expected to bias an automatic signal classifier, but it currently - * just shifts the static bitrate to mode mapping around a little bit. - * - * @param[in] x int: Voice percentage in the range 0-100, inclusive. - * @hideinitializer */ -#define OPUS_SET_VOICE_RATIO(x) OPUS_SET_VOICE_RATIO_REQUEST, __opus_check_int(x) -/** Gets the encoder's configured voice ratio value, @see OPUS_SET_VOICE_RATIO - * - * @param[out] x int*: Voice percentage in the range 0-100, inclusive. - * @hideinitializer */ -#define OPUS_GET_VOICE_RATIO(x) OPUS_GET_VOICE_RATIO_REQUEST, __opus_check_int_ptr(x) - - -#define OPUS_SET_FORCE_MODE_REQUEST 11002 -#define OPUS_SET_FORCE_MODE(x) OPUS_SET_FORCE_MODE_REQUEST, __opus_check_int(x) - - -int encode_size(int size, unsigned char *data); - -int opus_decode_native(OpusDecoder *st, const unsigned char *data, opus_int32 len, - opus_val16 *pcm, int frame_size, int decode_fec, int self_delimited, int *packet_offset); - -/* Make sure everything's aligned to sizeof(void *) bytes */ -static inline int align(int i) -{ - return (i+sizeof(void *)-1)&-((int)sizeof(void *)); -} - -opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen, int self_delimited); - -#endif /* OPUS_PRIVATE_H */ diff --git a/external/opus-1.0.3/src/repacketizer.c b/external/opus-1.0.3/src/repacketizer.c deleted file mode 100644 index 0c5d840c..00000000 --- a/external/opus-1.0.3/src/repacketizer.c +++ /dev/null @@ -1,208 +0,0 @@ -/* Copyright (c) 2011 Xiph.Org Foundation - Written by Jean-Marc Valin */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "opus.h" -#include "opus_private.h" -#include "os_support.h" - - -int opus_repacketizer_get_size(void) -{ - return sizeof(OpusRepacketizer); -} - -OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) -{ - rp->nb_frames = 0; - return rp; -} - -OpusRepacketizer *opus_repacketizer_create(void) -{ - OpusRepacketizer *rp; - rp=(OpusRepacketizer *)opus_alloc(opus_repacketizer_get_size()); - if(rp==NULL)return NULL; - return opus_repacketizer_init(rp); -} - -void opus_repacketizer_destroy(OpusRepacketizer *rp) -{ - opus_free(rp); -} - -int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) -{ - unsigned char tmp_toc; - int curr_nb_frames,ret; - /* Set of check ToC */ - if (len<1) return OPUS_INVALID_PACKET; - if (rp->nb_frames == 0) - { - rp->toc = data[0]; - rp->framesize = opus_packet_get_samples_per_frame(data, 8000); - } else if ((rp->toc&0xFC) != (data[0]&0xFC)) - { - /*fprintf(stderr, "toc mismatch: 0x%x vs 0x%x\n", rp->toc, data[0]);*/ - return OPUS_INVALID_PACKET; - } - curr_nb_frames = opus_packet_get_nb_frames(data, len); - if(curr_nb_frames<1) return OPUS_INVALID_PACKET; - - /* Check the 120 ms maximum packet size */ - if ((curr_nb_frames+rp->nb_frames)*rp->framesize > 960) - { - return OPUS_INVALID_PACKET; - } - - ret=opus_packet_parse(data, len, &tmp_toc, &rp->frames[rp->nb_frames], &rp->len[rp->nb_frames], NULL); - if(ret<1)return ret; - - rp->nb_frames += curr_nb_frames; - return OPUS_OK; -} - -int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) -{ - return rp->nb_frames; -} - -opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen, int self_delimited) -{ - int i, count; - opus_int32 tot_size; - opus_int16 *len; - const unsigned char **frames; - - if (begin<0 || begin>=end || end>rp->nb_frames) - { - /*fprintf(stderr, "%d %d %d\n", begin, end, rp->nb_frames);*/ - return OPUS_BAD_ARG; - } - count = end-begin; - - len = rp->len+begin; - frames = rp->frames+begin; - if (self_delimited) - tot_size = 1 + (len[count-1]>=252); - else - tot_size = 0; - - switch (count) - { - case 1: - { - /* Code 0 */ - tot_size += len[0]+1; - if (tot_size > maxlen) - return OPUS_BUFFER_TOO_SMALL; - *data++ = rp->toc&0xFC; - } - break; - case 2: - { - if (len[1] == len[0]) - { - /* Code 1 */ - tot_size += 2*len[0]+1; - if (tot_size > maxlen) - return OPUS_BUFFER_TOO_SMALL; - *data++ = (rp->toc&0xFC) | 0x1; - } else { - /* Code 2 */ - tot_size += len[0]+len[1]+2+(len[0]>=252); - if (tot_size > maxlen) - return OPUS_BUFFER_TOO_SMALL; - *data++ = (rp->toc&0xFC) | 0x2; - data += encode_size(len[0], data); - } - } - break; - default: - { - /* Code 3 */ - int vbr; - - vbr = 0; - for (i=1;i=252) + len[i]; - tot_size += len[count-1]; - - if (tot_size > maxlen) - return OPUS_BUFFER_TOO_SMALL; - *data++ = (rp->toc&0xFC) | 0x3; - *data++ = count | 0x80; - for (i=0;i maxlen) - return OPUS_BUFFER_TOO_SMALL; - *data++ = (rp->toc&0xFC) | 0x3; - *data++ = count; - } - } - break; - } - if (self_delimited) { - int sdlen = encode_size(len[count-1], data); - data += sdlen; - } - /* Copy the actual data */ - for (i=0;inb_frames, data, maxlen, 0); -} - - diff --git a/external/opus-1.0.3/tests/run_vectors.sh b/external/opus-1.0.3/tests/run_vectors.sh deleted file mode 100755 index 1cc445de..00000000 --- a/external/opus-1.0.3/tests/run_vectors.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/sh - -# Copyright (c) 2011-2012 Jean-Marc Valin -# -# This file is extracted from RFC6716. Please see that RFC for additional -# information. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# - Neither the name of Internet Society, IETF or IETF Trust, nor the -# names of specific contributors, may be used to endorse or promote -# products derived from this software without specific prior written -# permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -rm logs_mono.txt -rm logs_stereo.txt - -if [ "$#" -ne "3" ]; then - echo "usage: run_vectors.sh " - exit 1 -fi - -CMD_PATH=$1 -VECTOR_PATH=$2 -RATE=$3 - -OPUS_DEMO=$CMD_PATH/opus_demo -OPUS_COMPARE=$CMD_PATH/opus_compare - -if [ -d $VECTOR_PATH ]; then - echo Test vectors found in $VECTOR_PATH -else - echo No test vectors found - #Don't make the test fail here because the test vectors - #will be distributed separately - exit 0 -fi - -if [ -x $OPUS_DEMO ]; then - echo Decoding with $OPUS_DEMO -else - echo ERROR: Decoder not found: $OPUS_DEMO - exit 1 -fi - -echo "==============" -echo Testing mono -echo "==============" -echo - -for file in 01 02 03 04 05 06 07 08 09 10 11 12 -do - if [ -e $VECTOR_PATH/testvector$file.bit ]; then - echo Testing testvector$file - else - echo Bitstream file not found: testvector$file.bit - fi - if $OPUS_DEMO -d $RATE 1 $VECTOR_PATH/testvector$file.bit tmp.out >> logs_mono.txt 2>&1; then - echo successfully decoded - else - echo ERROR: decoding failed - exit 1 - fi - $OPUS_COMPARE -r $RATE $VECTOR_PATH/testvector$file.dec tmp.out >> logs_mono.txt 2>&1 - float_ret=$? - if [ "$float_ret" -eq "0" ]; then - echo output matches reference - else - echo ERROR: output does not match reference - exit 1 - fi - echo -done - -echo "==============" -echo Testing stereo -echo "==============" -echo - -for file in 01 02 03 04 05 06 07 08 09 10 11 12 -do - if [ -e $VECTOR_PATH/testvector$file.bit ]; then - echo Testing testvector$file - else - echo Bitstream file not found: testvector$file - fi - if $OPUS_DEMO -d $RATE 2 $VECTOR_PATH/testvector$file.bit tmp.out >> logs_stereo.txt 2>&1; then - echo successfully decoded - else - echo ERROR: decoding failed - exit 1 - fi - $OPUS_COMPARE -s -r $RATE $VECTOR_PATH/testvector$file.dec tmp.out >> logs_stereo.txt 2>&1 - float_ret=$? - if [ "$float_ret" -eq "0" ]; then - echo output matches reference - else - echo ERROR: output does not match reference - exit 1 - fi - echo -done - - - -echo All tests have passed successfully -grep quality logs_mono.txt | awk '{sum+=$4}END{print "Average mono quality is", sum/NR, "%"}' -grep quality logs_stereo.txt | awk '{sum+=$4}END{print "Average stereo quality is", sum/NR, "%"}' diff --git a/external/opus-1.0.3/tests/test_opus_api.vcxproj b/external/opus-1.0.3/tests/test_opus_api.vcxproj deleted file mode 100644 index acecdde0..00000000 --- a/external/opus-1.0.3/tests/test_opus_api.vcxproj +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - - - - {1D257A17-D254-42E5-82D6-1C87A6EC775A} - Win32Proj - test_opus_api - - - - Application - true - Unicode - - - Application - false - true - Unicode - - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - ../silk;../celt;../win32;../include; - MultiThreadedDebug - - - Console - true - $(SolutionDir)$(Configuration)\opus.lib;$(SolutionDir)$(Configuration)\celt.lib;$(SolutionDir)$(Configuration)\silk_common.lib;$(SolutionDir)$(Configuration)\silk_float.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - ../silk;../celt;../win32;../include; - - - Console - true - true - $(SolutionDir)$(Configuration)\opus.lib;$(SolutionDir)$(Configuration)\celt.lib;$(SolutionDir)$(Configuration)\silk_common.lib;$(SolutionDir)$(Configuration)\silk_float.lib;%(AdditionalDependencies) - - - - - - diff --git a/external/opus-1.0.3/tests/test_opus_decode.vcxproj b/external/opus-1.0.3/tests/test_opus_decode.vcxproj deleted file mode 100644 index 17d30435..00000000 --- a/external/opus-1.0.3/tests/test_opus_decode.vcxproj +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - - - - {8578322A-1883-486B-B6FA-E0094B65C9F2} - Win32Proj - test_opus_api - - - - Application - true - Unicode - - - Application - false - true - Unicode - - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - ../silk;../celt;../win32;../include; - MultiThreadedDebug - - - Console - true - $(SolutionDir)$(Configuration)\opus.lib;$(SolutionDir)$(Configuration)\celt.lib;$(SolutionDir)$(Configuration)\silk_common.lib;$(SolutionDir)$(Configuration)\silk_float.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - ../silk;../celt;../win32;../include; - - - Console - true - true - $(SolutionDir)$(Configuration)\opus.lib;$(SolutionDir)$(Configuration)\celt.lib;$(SolutionDir)$(Configuration)\silk_common.lib;$(SolutionDir)$(Configuration)\silk_float.lib;%(AdditionalDependencies) - - - - - - diff --git a/external/opus-1.0.3/tests/test_opus_encode.vcxproj b/external/opus-1.0.3/tests/test_opus_encode.vcxproj deleted file mode 100644 index 7e2471eb..00000000 --- a/external/opus-1.0.3/tests/test_opus_encode.vcxproj +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - - - - {84DAA768-1A38-4312-BB61-4C78BB59E5B8} - Win32Proj - test_opus_api - - - - Application - true - Unicode - - - Application - false - true - Unicode - - - - - - - - - - - - - - - - Level3 - Disabled - HAVE_CONFIG_H;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - ../silk;../celt;../win32;../include; - MultiThreadedDebug - - - Console - true - $(SolutionDir)$(Configuration)\opus.lib;$(SolutionDir)$(Configuration)\celt.lib;$(SolutionDir)$(Configuration)\silk_common.lib;$(SolutionDir)$(Configuration)\silk_float.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - HAVE_CONFIG_H;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - ../silk;../celt;../win32;../include; - - - Console - true - true - $(SolutionDir)$(Configuration)\opus.lib;$(SolutionDir)$(Configuration)\celt.lib;$(SolutionDir)$(Configuration)\silk_common.lib;$(SolutionDir)$(Configuration)\silk_float.lib;%(AdditionalDependencies) - - - - - - diff --git a/external/opus-1.0.3/version.mk b/external/opus-1.0.3/version.mk deleted file mode 100644 index c59a3308..00000000 --- a/external/opus-1.0.3/version.mk +++ /dev/null @@ -1,2 +0,0 @@ -# static version string; update manually every release. -OPUS_VERSION = "1.0.3" diff --git a/external/opus-1.0.3/win32/genversion.bat b/external/opus-1.0.3/win32/genversion.bat deleted file mode 100644 index 7934ebfa..00000000 --- a/external/opus-1.0.3/win32/genversion.bat +++ /dev/null @@ -1,46 +0,0 @@ -@echo off - -setlocal enableextensions enabledelayedexpansion - -for /f %%v in ('git describe --tags --match "v*"') do set version=%%v - -if not "%version%"=="" goto :gotversion - -if exist "%~dp0..\version.mk" goto :getversion - -echo Git cannot be found, nor can version.mk. Generating unknown version. - -set version=unknown - -goto :gotversion - -:getversion - -for /f "delims== tokens=2" %%v in (%~dp0..\version.mk) do set version=%%v - -set version=!version:^"=! -set version=!version: =! - -:gotversion - -set version_out=#define %2 "%version%" -set version_mk=%2 = "%version%" - -echo %version_out%> %1_temp - -if %version%==unknown goto :skipgenerate - -echo # static version string; update manually every release.> "%~dp0..\version.mk" -echo %version_mk%>> "%~dp0..\version.mk" - -:skipgenerate - -echo n | comp %1_temp %1 > NUL 2> NUL - -if not errorlevel 1 goto exit - -copy /y %1_temp %1 - -:exit - -del %1_temp diff --git a/external/opus-1.3.1/0000-opus.git-86e5f5ea.patch b/external/opus-1.3.1/0000-opus.git-86e5f5ea.patch new file mode 100644 index 00000000..aeb3fd49 --- /dev/null +++ b/external/opus-1.3.1/0000-opus.git-86e5f5ea.patch @@ -0,0 +1,63 @@ +From 86e5f5ea56529d688568929d036574a93311e82a Mon Sep 17 00:00:00 2001 +From: Jean-Marc Valin +Date: Fri, 26 Apr 2019 11:16:52 -0400 +Subject: [PATCH] Add mising cmake file from make dist + +Thanks to theislander on HA for reporting this. +--- + Makefile.am | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 4e3f183..7f905b0 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -212,6 +212,7 @@ EXTRA_DIST = opus.pc.in \ + Makefile.unix \ + CMakeLists.txt \ + config.h.cmake.in \ ++ opus_buildtype.cmake \ + opus_config.cmake \ + opus_functions.cmake \ + opus_sources.cmake \ +-- +1.7.1 + +diff -u opus-1.3.1/Makefile.in~ opus-1.3.1/Makefile.in +--- opus-1.3.1/Makefile.in~ 2019-04-13 01:03:37.000000000 +0300 ++++ opus-1.3.1/Makefile.in 2019-04-28 08:02:04.000000000 +0300 +@@ -1569,6 +1569,7 @@ + Makefile.unix \ + CMakeLists.txt \ + config.h.cmake.in \ ++ opus_buildtype.cmake \ + opus_config.cmake \ + opus_functions.cmake \ + opus_sources.cmake \ +diff -u /dev/null opus-1.3.1/opus_buildtype.cmake +--- /dev/null ++++ opus-1.3.1/opus_buildtype.cmake 2019-04-28 08:02:04.000000000 +0300 +@@ -0,0 +1,23 @@ ++# Set a default build type if none was specified ++ ++if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) ++ if(CMAKE_C_FLAGS) ++ message(STATUS "CMAKE_C_FLAGS: " ${CMAKE_C_FLAGS}) ++ else() ++ set(default_build_type "Release") ++ message( ++ STATUS ++ "Setting build type to '${default_build_type}' as none was specified and no CFLAGS was exported." ++ ) ++ set(CMAKE_BUILD_TYPE "${default_build_type}" ++ CACHE STRING "Choose the type of build." ++ FORCE) ++ # Set the possible values of build type for cmake-gui ++ set_property(CACHE CMAKE_BUILD_TYPE ++ PROPERTY STRINGS ++ "Debug" ++ "Release" ++ "MinSizeRel" ++ "RelWithDebInfo") ++ endif() ++endif() diff --git a/external/opus-1.3.1/0001-opus.git-ad8fe90d.patch b/external/opus-1.3.1/0001-opus.git-ad8fe90d.patch new file mode 100644 index 00000000..dd8b6b47 --- /dev/null +++ b/external/opus-1.3.1/0001-opus.git-ad8fe90d.patch @@ -0,0 +1,26 @@ +From ad8fe90db79b7d2a135e3dfd2ed6631b0c5662ab Mon Sep 17 00:00:00 2001 +From: Marcus Asteborg +Date: Tue, 23 Apr 2019 13:41:14 -0700 +Subject: [PATCH] Fix typo in _FORTIFY_SOURCE define. + +Signed-off-by: Ralph Giles +--- + CMakeLists.txt | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 17ee3fc..c01ec57 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -186,7 +186,7 @@ target_link_libraries(opus PRIVATE ${OPUS_REQUIRED_LIBRARIES}) + target_compile_definitions(opus PRIVATE OPUS_BUILD ENABLE_HARDENING) + + if(NOT MSVC) +- target_compile_definitions(opus PRIVATE FORTIFY_SOURCE=2) ++ target_compile_definitions(opus PRIVATE _FORTIFY_SOURCE=2) + endif() + + # It is strongly recommended to uncomment one of these VAR_ARRAYS: Use C99 +-- +1.7.1 + diff --git a/external/opus-1.3.1/0002-opus.git-812ae3fb.patch b/external/opus-1.3.1/0002-opus.git-812ae3fb.patch new file mode 100644 index 00000000..4419e045 --- /dev/null +++ b/external/opus-1.3.1/0002-opus.git-812ae3fb.patch @@ -0,0 +1,86 @@ +From 812ae3fb5c589aaafe761b8ebf86bcbbb8f0ed76 Mon Sep 17 00:00:00 2001 +From: Felicia Lim +Date: Mon, 8 Jul 2019 09:44:35 -0700 +Subject: [PATCH] Avoid processing LPC coeffs beyond the given order in NEON optimizations + +--- + silk/arm/LPC_inv_pred_gain_neon_intr.c | 22 +++++++++++++++------- + 1 files changed, 15 insertions(+), 7 deletions(-) + +diff --git a/silk/arm/LPC_inv_pred_gain_neon_intr.c b/silk/arm/LPC_inv_pred_gain_neon_intr.c +index ab426bc..726e666 100644 +--- a/silk/arm/LPC_inv_pred_gain_neon_intr.c ++++ b/silk/arm/LPC_inv_pred_gain_neon_intr.c +@@ -210,19 +210,23 @@ opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse predi + /* Increase Q domain of the AR coefficients */ + t0_s16x8 = vld1q_s16( A_Q12 + 0 ); + t1_s16x8 = vld1q_s16( A_Q12 + 8 ); +- t2_s16x8 = vld1q_s16( A_Q12 + 16 ); ++ if ( order > 16 ) { ++ t2_s16x8 = vld1q_s16( A_Q12 + 16 ); ++ } + t0_s32x4 = vpaddlq_s16( t0_s16x8 ); + + switch( order - leftover ) + { + case 24: + t0_s32x4 = vpadalq_s16( t0_s32x4, t2_s16x8 ); ++ vst1q_s32( Atmp_QA + 16, vshll_n_s16( vget_low_s16 ( t2_s16x8 ), QA - 12 ) ); ++ vst1q_s32( Atmp_QA + 20, vshll_n_s16( vget_high_s16( t2_s16x8 ), QA - 12 ) ); + /* FALLTHROUGH */ + + case 16: + t0_s32x4 = vpadalq_s16( t0_s32x4, t1_s16x8 ); +- vst1q_s32( Atmp_QA + 16, vshll_n_s16( vget_low_s16 ( t2_s16x8 ), QA - 12 ) ); +- vst1q_s32( Atmp_QA + 20, vshll_n_s16( vget_high_s16( t2_s16x8 ), QA - 12 ) ); ++ vst1q_s32( Atmp_QA + 8, vshll_n_s16( vget_low_s16 ( t1_s16x8 ), QA - 12 ) ); ++ vst1q_s32( Atmp_QA + 12, vshll_n_s16( vget_high_s16( t1_s16x8 ), QA - 12 ) ); + /* FALLTHROUGH */ + + case 8: +@@ -230,8 +234,8 @@ opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse predi + const int32x2_t t_s32x2 = vpadd_s32( vget_low_s32( t0_s32x4 ), vget_high_s32( t0_s32x4 ) ); + const int64x1_t t_s64x1 = vpaddl_s32( t_s32x2 ); + DC_resp = vget_lane_s32( vreinterpret_s32_s64( t_s64x1 ), 0 ); +- vst1q_s32( Atmp_QA + 8, vshll_n_s16( vget_low_s16 ( t1_s16x8 ), QA - 12 ) ); +- vst1q_s32( Atmp_QA + 12, vshll_n_s16( vget_high_s16( t1_s16x8 ), QA - 12 ) ); ++ vst1q_s32( Atmp_QA + 0, vshll_n_s16( vget_low_s16 ( t0_s16x8 ), QA - 12 ) ); ++ vst1q_s32( Atmp_QA + 4, vshll_n_s16( vget_high_s16( t0_s16x8 ), QA - 12 ) ); + } + break; + +@@ -246,16 +250,22 @@ opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse predi + case 6: + DC_resp += (opus_int32)A_Q12[ 5 ]; + DC_resp += (opus_int32)A_Q12[ 4 ]; ++ Atmp_QA[ order - leftover + 5 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 5 ], QA - 12 ); ++ Atmp_QA[ order - leftover + 4 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 4 ], QA - 12 ); + /* FALLTHROUGH */ + + case 4: + DC_resp += (opus_int32)A_Q12[ 3 ]; + DC_resp += (opus_int32)A_Q12[ 2 ]; ++ Atmp_QA[ order - leftover + 3 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 3 ], QA - 12 ); ++ Atmp_QA[ order - leftover + 2 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 2 ], QA - 12 ); + /* FALLTHROUGH */ + + case 2: + DC_resp += (opus_int32)A_Q12[ 1 ]; + DC_resp += (opus_int32)A_Q12[ 0 ]; ++ Atmp_QA[ order - leftover + 1 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 1 ], QA - 12 ); ++ Atmp_QA[ order - leftover + 0 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 0 ], QA - 12 ); + /* FALLTHROUGH */ + + default: +@@ -266,8 +276,6 @@ opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse predi + if( DC_resp >= 4096 ) { + invGain_Q30 = 0; + } else { +- vst1q_s32( Atmp_QA + 0, vshll_n_s16( vget_low_s16 ( t0_s16x8 ), QA - 12 ) ); +- vst1q_s32( Atmp_QA + 4, vshll_n_s16( vget_high_s16( t0_s16x8 ), QA - 12 ) ); + invGain_Q30 = LPC_inverse_pred_gain_QA_neon( Atmp_QA, order ); + } + } +-- +1.7.1 + diff --git a/external/opus-1.3.1/0003-opus.git-cd529edb.patch b/external/opus-1.3.1/0003-opus.git-cd529edb.patch new file mode 100644 index 00000000..a3ff96bd --- /dev/null +++ b/external/opus-1.3.1/0003-opus.git-cd529edb.patch @@ -0,0 +1,47 @@ +From cd529edb3363b0be6aebdefa09c4188629f45e2c Mon Sep 17 00:00:00 2001 +From: Felicia Lim +Date: Tue, 3 Sep 2019 09:56:25 -0700 +Subject: [PATCH] Fix NEON optimizations buffer read overrun + +Thanks to Ray Essick +--- + .../arm/warped_autocorrelation_FIX_neon_intr.c | 9 +++++++-- + 1 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c b/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c +index 00a70cb..6f3be02 100644 +--- a/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c ++++ b/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c +@@ -84,7 +84,9 @@ void silk_warped_autocorrelation_FIX_neon( + silk_assert( ( order & 1 ) == 0 ); + silk_assert( 2 * QS - QC >= 0 ); + +- ALLOC( input_QST, length + 2 * MAX_SHAPE_LPC_ORDER, opus_int32 ); ++ /* The additional +4 is to ensure a later vld1q_s32 call does not overflow. */ ++ /* Strictly, only +3 is needed but +4 simplifies initialization using the 4x32 neon load. */ ++ ALLOC( input_QST, length + 2 * MAX_SHAPE_LPC_ORDER + 4, opus_int32 ); + + input_QS = input_QST; + /* input_QS has zero paddings in the beginning and end. */ +@@ -121,6 +123,8 @@ void silk_warped_autocorrelation_FIX_neon( + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); ++ input_QS += 4; ++ vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS = input_QST + MAX_SHAPE_LPC_ORDER - orderT; + + /* The following loop runs ( length + order ) times, with ( order ) extra epilogues. */ +@@ -153,7 +157,8 @@ void silk_warped_autocorrelation_FIX_neon( + opus_int o = orderT; + int32x4_t state_QS_s32x4[ 3 ][ 2 ]; + +- ALLOC( state, length + orderT, opus_int32 ); ++ /* The additional +4 is to ensure a later vld1q_s32 call does not overflow. */ ++ ALLOC( state, length + order + 4, opus_int32 ); + state_QS_s32x4[ 2 ][ 1 ] = vdupq_n_s32( 0 ); + + /* Calculate 8 taps of all inputs in each loop. */ +-- +1.7.1 + diff --git a/external/opus-1.3.1/0010-misc-win32.diff b/external/opus-1.3.1/0010-misc-win32.diff new file mode 100644 index 00000000..03114001 --- /dev/null +++ b/external/opus-1.3.1/0010-misc-win32.diff @@ -0,0 +1,73 @@ +https://github.com/xiph/opus/pull/104 + +diff --git a/celt/stack_alloc.h b/celt/stack_alloc.h +index 2b51c8d..ae40e2a 100644 +--- a/celt/stack_alloc.h ++++ b/celt/stack_alloc.h +@@ -40,7 +40,7 @@ + #endif + + #ifdef USE_ALLOCA +-# ifdef WIN32 ++# ifdef _WIN32 + # include + # else + # ifdef HAVE_ALLOCA_H +@@ -102,7 +102,7 @@ + + #define VARDECL(type, var) type *var + +-# ifdef WIN32 ++# ifdef _WIN32 + # define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) + # else + # define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) +diff --git a/include/opus_defines.h b/include/opus_defines.h +index d141418..ceee5b8 100644 +--- a/include/opus_defines.h ++++ b/include/opus_defines.h +@@ -64,7 +64,7 @@ extern "C" { + /**Export control for opus functions */ + + #ifndef OPUS_EXPORT +-# if defined(WIN32) ++# if defined(_WIN32) + # if defined(OPUS_BUILD) && defined(DLL_EXPORT) + # define OPUS_EXPORT __declspec(dllexport) + # else +diff --git a/silk/debug.c b/silk/debug.c +index 9253faf..52f1bb6 100644 +--- a/silk/debug.c ++++ b/silk/debug.c +@@ -35,13 +35,6 @@ POSSIBILITY OF SUCH DAMAGE. + #if SILK_TIC_TOC + + #ifdef _WIN32 +- +-#if (defined(_WIN32) || defined(_WINCE)) +-#include /* timer */ +-#else /* Linux or Mac*/ +-#include +-#endif +- + unsigned long silk_GetHighResolutionTime(void) /* O time in usec*/ + { + /* Returns a time counter in microsec */ +@@ -65,7 +58,7 @@ unsigned long GetHighResolutionTime(void) /* O time in usec*/ + int silk_Timer_nTimers = 0; + int silk_Timer_depth_ctr = 0; + char silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN]; +-#ifdef WIN32 ++#ifdef _WIN32 + LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; + #else + unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; +@@ -76,7 +69,7 @@ opus_int64 silk_Timer_sum[silk_NUM_TIMERS_MAX]; + opus_int64 silk_Timer_max[silk_NUM_TIMERS_MAX]; + opus_int64 silk_Timer_depth[silk_NUM_TIMERS_MAX]; + +-#ifdef WIN32 ++#ifdef _WIN32 + void silk_TimerSave(char *file_name) + { + if( silk_Timer_nTimers > 0 ) diff --git a/external/opus-1.0.3/AUTHORS b/external/opus-1.3.1/AUTHORS similarity index 100% rename from external/opus-1.0.3/AUTHORS rename to external/opus-1.3.1/AUTHORS diff --git a/external/opus-1.3.1/CMakeLists.txt b/external/opus-1.3.1/CMakeLists.txt new file mode 100644 index 00000000..c01ec57c --- /dev/null +++ b/external/opus-1.3.1/CMakeLists.txt @@ -0,0 +1,411 @@ +cmake_minimum_required(VERSION 3.1) + +include(opus_functions.cmake) + +get_library_version(OPUS_LIBRARY_VERSION OPUS_LIBRARY_VERSION_MAJOR) +message(STATUS "Opus library version: ${OPUS_LIBRARY_VERSION}") + +get_package_version(PACKAGE_VERSION) +message(STATUS "Opus package version: ${PACKAGE_VERSION}") + +string(REGEX + REPLACE "^([0-9]+.[0-9]+\\.?([0-9]+)?).*" + "\\1" + PROJECT_VERSION + ${PACKAGE_VERSION}) +message(STATUS "Opus project version: ${PROJECT_VERSION}") + +project(Opus LANGUAGES C VERSION ${PROJECT_VERSION}) +include(opus_buildtype.cmake) + +option(OPUS_STACK_PROTECTOR "Use stack protection" ON) +option(OPUS_USE_ALLOCA "Use alloca for stack arrays (on non-C99 compilers)" OFF) +option(OPUS_CUSTOM_MODES "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames" + OFF) +option(OPUS_BUILD_PROGRAMS "Build programs" OFF) +option(OPUS_FIXED_POINT + "Compile as fixed-point (for machines without a fast enough FPU)" OFF) +option(OPUS_ENABLE_FLOAT_API + "Compile with the floating point API (for machines with float library" + ON) +option(OPUS_INSTALL_PKG_CONFIG_MODULE "Install PkgConfig module" ON) +option(OPUS_INSTALL_CMAKE_CONFIG_MODULE "Install CMake package config module" + ON) + +include(opus_config.cmake) +include(opus_sources.cmake) +include(GNUInstallDirs) +include(CMakeDependentOption) +include(FeatureSummary) + +if(OPUS_STACK_PROTECTOR) + if(NOT MSVC) # GC on by default on MSVC + check_and_set_flag(STACK_PROTECTION_STRONG -fstack-protector-strong) + endif() +else() + if(MSVC) + check_and_set_flag(BUFFER_SECURITY_CHECK /GS-) + endif() +endif() + +if(OPUS_CPU_X86 OR OPUS_CPU_X64) + cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE + "Does runtime check for SSE1 support" + ON + "SSE1_SUPPORTED" + OFF) + cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE2 + "Does runtime check for SSE2 support" + ON + "SSE2_SUPPORTED" + OFF) + cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE4_1 + "Does runtime check for SSE4.1 support" + ON + "SSE4_1_SUPPORTED" + OFF) + cmake_dependent_option(OPUS_X86_MAY_HAVE_AVX + "Does runtime check for AVX support" + ON + "AVX_SUPPORTED" + OFF) + + if(OPUS_CPU_X64) # Assume 64 bit has SSE2 support + cmake_dependent_option(OPUS_X86_PRESUME_SSE + "Assume target CPU has SSE1 support" + ON + "OPUS_X86_MAY_HAVE_SSE" + OFF) + cmake_dependent_option(OPUS_X86_PRESUME_SSE2 + "Assume target CPU has SSE2 support" + ON + "OPUS_X86_MAY_HAVE_SSE2" + OFF) + else() + cmake_dependent_option(OPUS_X86_PRESUME_SSE + "Assume target CPU has SSE1 support" + OFF + "OPUS_X86_MAY_HAVE_SSE" + OFF) + cmake_dependent_option(OPUS_X86_PRESUME_SSE2 + "Assume target CPU has SSE2 support" + OFF + "OPUS_X86_MAY_HAVE_SSE2" + OFF) + endif() + cmake_dependent_option(OPUS_X86_PRESUME_SSE4_1 + "Assume target CPU has SSE4.1 support" + OFF + "OPUS_X86_MAY_HAVE_SSE4_1" + OFF) + cmake_dependent_option(OPUS_X86_PRESUME_AVX + "Assume target CPU has AVX support" + OFF + "OPUS_X86_MAY_HAVE_AVX" + OFF) +endif() + +set_package_properties(Git + PROPERTIES + TYPE + REQUIRED + DESCRIPTION + "fast, scalable, distributed revision control system" + URL + "https://git-scm.com/" + PURPOSE + "required to set up package version") + +add_feature_info(STACK_PROTECTOR OPUS_STACK_PROTECTOR "Use stack protection") +add_feature_info(USE_ALLOCA OPUS_USE_ALLOCA + "Use alloca for stack arrays (on non-C99 compilers)") +add_feature_info(CUSTOM_MODES OPUS_CUSTOM_MODES + "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames") +add_feature_info(BUILD_PROGRAMS OPUS_BUILD_PROGRAMS "Build programs") +add_feature_info( + FIXED_POINT OPUS_FIXED_POINT + "compile as fixed-point (for machines without a fast enough FPU)") +add_feature_info( + FLOAT_API OPUS_ENABLE_FLOAT_API + "compile with the floating point API (for machines with float library)") + +add_feature_info(INSTALL_PKG_CONFIG_MODULE OPUS_INSTALL_PKG_CONFIG_MODULE + "install PkgConfig module") +add_feature_info(INSTALL_CMAKE_CONFIG_MODULE OPUS_INSTALL_CMAKE_CONFIG_MODULE + "install CMake package config module") + +if(OPUS_CPU_X86 OR OPUS_CPU_X64) + add_feature_info(X86_MAY_HAVE_SSE OPUS_X86_MAY_HAVE_SSE + "does runtime check for SSE1 support") + add_feature_info(X86_MAY_HAVE_SSE2 OPUS_X86_MAY_HAVE_SSE2 + "does runtime check for SSE2 support") + add_feature_info(X86_MAY_HAVE_SSE4_1 OPUS_X86_MAY_HAVE_SSE4_1 + "does runtime check for SSE4_1 support") + add_feature_info(X86_MAY_HAVE_AVX OPUS_X86_MAY_HAVE_AVX + "does runtime check for AVX support") + add_feature_info(X86_PRESUME_SSE OPUS_X86_PRESUME_SSE + "assume target CPU has SSE1 support") + add_feature_info(X86_PRESUME_SSE2 OPUS_X86_PRESUME_SSE2 + "assume target CPU has SSE2 support") + add_feature_info(X86_PRESUME_SSE4_1 OPUS_X86_PRESUME_SSE4_1 + "assume target CPU has SSE4_1 support") + add_feature_info(X86_PRESUME_AVX OPUS_X86_PRESUME_AVX + "assume target CPU has AVX support") +endif() + +feature_summary(WHAT ALL) + +add_library(opus ${opus_sources} ${opus_sources_float}) + +set(Opus_PUBLIC_HEADER + ${CMAKE_CURRENT_SOURCE_DIR}/include/opus.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_custom.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_defines.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_multistream.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_projection.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_types.h) + +set_target_properties(opus + PROPERTIES SOVERSION + ${OPUS_LIBRARY_VERSION_MAJOR} + VERSION + ${OPUS_LIBRARY_VERSION} + PUBLIC_HEADER + "${Opus_PUBLIC_HEADER}") + +target_include_directories( + opus + PUBLIC $ + $ + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + celt + silk) + +target_link_libraries(opus PRIVATE ${OPUS_REQUIRED_LIBRARIES}) +target_compile_definitions(opus PRIVATE OPUS_BUILD ENABLE_HARDENING) + +if(NOT MSVC) + target_compile_definitions(opus PRIVATE _FORTIFY_SOURCE=2) +endif() + +# It is strongly recommended to uncomment one of these VAR_ARRAYS: Use C99 +# variable-length arrays for stack allocation USE_ALLOCA: Use alloca() for stack +# allocation If none is defined, then the fallback is a non-threadsafe global +# array +if(OPUS_USE_ALLOCA OR MSVC) + target_compile_definitions(opus PRIVATE USE_ALLOCA) +else() + target_compile_definitions(opus PRIVATE VAR_ARRAYS) +endif() + +if(OPUS_CUSTOM_MODES) + target_compile_definitions(opus PRIVATE CUSTOM_MODES) +endif() + +if(BUILD_SHARED_LIBS) + if(WIN32) + target_compile_definitions(opus PRIVATE DLL_EXPORT) + else() + include(CheckCCompilerFlag) + check_c_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY) + if(COMPILER_HAS_HIDDEN_VISIBILITY) + set_target_properties(opus PROPERTIES C_VISIBILITY_PRESET hidden) + endif() + endif() +endif() + +add_sources_group(opus silk ${silk_sources}) +add_sources_group(opus celt ${celt_sources}) + +if(OPUS_FIXED_POINT) + add_sources_group(opus silk ${silk_sources_fixed}) + target_include_directories(opus PRIVATE silk/fixed) + target_compile_definitions(opus PRIVATE FIXED_POINT=1) +else() + add_sources_group(opus silk ${silk_sources_float}) + target_include_directories(opus PRIVATE silk/float) +endif() + +if(NOT OPUS_ENABLE_FLOAT_API) + target_compile_definitions(opus PRIVATE DISABLE_FLOAT_API) +endif() + +if(OPUS_X86_MAY_HAVE_SSE + OR OPUS_X86_MAY_HAVE_SSE2 + OR OPUS_X86_MAY_HAVE_SSE4_1 + OR OPUS_X86_MAY_HAVE_AVX) + target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD) +endif() + +if(OPUS_X86_MAY_HAVE_SSE) + add_sources_group(opus celt ${celt_sources_sse}) + target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE) +endif() +if(OPUS_X86_PRESUME_SSE) + target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE) +endif() + +if(OPUS_X86_MAY_HAVE_SSE2) + add_sources_group(opus celt ${celt_sources_sse2}) + target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE2) +endif() +if(OPUS_X86_PRESUME_SSE2) + target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE2) +endif() + +if(OPUS_X86_MAY_HAVE_SSE) + add_sources_group(opus celt ${celt_sources_sse4_1}) + add_sources_group(opus silk ${silk_sources_sse4_1}) + if(OPUS_FIXED_POINT) + add_sources_group(opus silk ${silk_sources_fixed_sse4_1}) + endif() + target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE4_1) +endif() +if(OPUS_X86_PRESUME_SSE4_1) + target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE4_1) +endif() + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "(armv7-a)") + add_sources_group(opus celt ${celt_sources_arm}) +endif() + +if(COMPILER_SUPPORT_NEON AND OPUS_USE_NEON) + + if(OPUS_MAY_HAVE_NEON) + if(RUNTIME_CPU_CAPABILITY_DETECTION) + message(STATUS "OPUS_MAY_HAVE_NEON enabling runtime detection") + target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD) + else() + message(ERROR "Runtime cpu capability detection needed for MAY_HAVE_NEON") + endif() + # Do runtime check for NEON + target_compile_definitions(opus + PRIVATE + OPUS_ARM_MAY_HAVE_NEON + OPUS_ARM_MAY_HAVE_NEON_INTR) + endif() + + add_sources_group(opus celt ${celt_sources_arm_neon_intr}) + add_sources_group(opus silk ${silk_sources_arm_neon_intr}) + + # silk arm neon depends on main_Fix.h + target_include_directories(opus PRIVATE silk/fixed) + + if(OPUS_FIXED_POINT) + add_sources_group(opus silk ${silk_sources_fixed_arm_neon_intr}) + endif() + + if(OPUS_PRESUME_NEON) + target_compile_definitions(opus + PRIVATE + OPUS_ARM_PRESUME_NEON + OPUS_ARM_PRESUME_NEON_INTR) + endif() +endif() + +install(TARGETS opus + EXPORT OpusTargets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus) + +if(OPUS_INSTALL_PKG_CONFIG_MODULE) + set(prefix ${CMAKE_INSTALL_PREFIX}) + set(exec_prefix ${CMAKE_INSTALL_PREFIX}) + set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) + set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) + set(VERSION ${OPUS_LIBRARY_VERSION}) + set(VERSION ${OPUS_LIBRARY_VERSION}) + if(HAVE_LIBM) + set(LIBM "-lm") + endif() + configure_file(opus.pc.in opus.pc) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +endif() + +if(OPUS_INSTALL_CMAKE_CONFIG_MODULE) + set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) + install(EXPORT OpusTargets + NAMESPACE Opus:: + DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) + + include(CMakePackageConfigHelpers) + + set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) + configure_package_config_file(OpusConfig.cmake.in + OpusConfig.cmake + INSTALL_DESTINATION + ${CMAKE_INSTALL_PACKAGEDIR} + PATH_VARS + INCLUDE_INSTALL_DIR + INSTALL_PREFIX + ${CMAKE_INSTALL_PREFIX}) + write_basic_package_version_file(OpusConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) +endif() + +if(OPUS_BUILD_PROGRAMS) + # demo + if(OPUS_CUSTOM_MODES) + add_executable(opus_custom_demo ${opus_custom_demo_sources}) + target_include_directories(opus_custom_demo + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(opus_custom_demo PRIVATE opus) + endif() + + add_executable(opus_demo ${opus_demo_sources}) + target_include_directories(opus_demo PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_include_directories(opus_demo PRIVATE silk) # debug.h + target_include_directories(opus_demo PRIVATE celt) # arch.h + target_link_libraries(opus_demo PRIVATE opus) + + # compare + add_executable(opus_compare ${opus_compare_sources}) + target_include_directories(opus_compare PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(opus_compare PRIVATE opus) +endif() + +if(BUILD_TESTING) + enable_testing() + + # tests + add_executable(test_opus_decode ${test_opus_decode_sources}) + target_include_directories(test_opus_decode + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(test_opus_decode PRIVATE opus) + if(OPUS_FIXED_POINT) + target_compile_definitions(test_opus_decode PRIVATE DISABLE_FLOAT_API) + endif() + add_test(test_opus_decode test_opus_decode) + + add_executable(test_opus_padding ${test_opus_padding_sources}) + target_include_directories(test_opus_padding + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(test_opus_padding PRIVATE opus) + add_test(test_opus_padding test_opus_padding) + + if(NOT BUILD_SHARED_LIBS) + # disable tests that depends on private API when building shared lib + add_executable(test_opus_api ${test_opus_api_sources}) + target_include_directories(test_opus_api + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) + target_link_libraries(test_opus_api PRIVATE opus) + if(OPUS_FIXED_POINT) + target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API) + endif() + add_test(test_opus_api test_opus_api) + + add_executable(test_opus_encode ${test_opus_encode_sources}) + target_include_directories(test_opus_encode + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) + target_link_libraries(test_opus_encode PRIVATE opus) + add_test(test_opus_encode test_opus_encode) + endif() +endif() diff --git a/external/opus-1.0.3/COPYING b/external/opus-1.3.1/COPYING similarity index 99% rename from external/opus-1.0.3/COPYING rename to external/opus-1.3.1/COPYING index f4159e67..9c739c34 100644 --- a/external/opus-1.0.3/COPYING +++ b/external/opus-1.3.1/COPYING @@ -14,7 +14,7 @@ notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/external/opus-1.0.3/ChangeLog b/external/opus-1.3.1/ChangeLog similarity index 100% rename from external/opus-1.0.3/ChangeLog rename to external/opus-1.3.1/ChangeLog diff --git a/external/opus-1.3.1/INSTALL b/external/opus-1.3.1/INSTALL new file mode 100644 index 00000000..8865734f --- /dev/null +++ b/external/opus-1.3.1/INSTALL @@ -0,0 +1,368 @@ +Installation Instructions +************************* + + Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software +Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command './configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the 'README' file for +instructions specific to this package. Some packages provide this +'INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The 'configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a 'Makefile' in each directory of the package. +It may also create one or more '.h' files containing system-dependent +definitions. Finally, it creates a shell script 'config.status' that +you can run in the future to recreate the current configuration, and a +file 'config.log' containing compiler output (useful mainly for +debugging 'configure'). + + It can also use an optional file (typically called 'config.cache' and +enabled with '--cache-file=config.cache' or simply '-C') that saves the +results of its tests to speed up reconfiguring. Caching is disabled by +default to prevent problems with accidental use of stale cache files. + + If you need to do unusual things to compile the package, please try +to figure out how 'configure' could check whether to do them, and mail +diffs or instructions to the address given in the 'README' so they can +be considered for the next release. If you are using the cache, and at +some point 'config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file 'configure.ac' (or 'configure.in') is used to create +'configure' by a program called 'autoconf'. You need 'configure.ac' if +you want to change it or regenerate 'configure' using a newer version of +'autoconf'. + + The simplest way to compile this package is: + + 1. 'cd' to the directory containing the package's source code and type + './configure' to configure the package for your system. + + Running 'configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type 'make' to compile the package. + + 3. Optionally, type 'make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type 'make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the 'make install' phase executed with root + privileges. + + 5. Optionally, type 'make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior 'make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing 'make clean'. To also remove the + files that 'configure' created (so you can compile the package for + a different kind of computer), type 'make distclean'. There is + also a 'make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type 'make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide 'make + distcheck', which can by used by developers to test that all other + targets like 'make install' and 'make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the 'configure' script does not know about. Run './configure --help' +for details on some of the pertinent environment variables. + + You can give 'configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here is +an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU 'make'. 'cd' to the +directory where you want the object files and executables to go and run +the 'configure' script. 'configure' automatically checks for the source +code in the directory that 'configure' is in and in '..'. This is known +as a "VPATH" build. + + With a non-GNU 'make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use 'make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple '-arch' options to the +compiler but only a single '-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the 'lipo' tool if you have problems. + +Installation Names +================== + + By default, 'make install' installs the package's commands under +'/usr/local/bin', include files under '/usr/local/include', etc. You +can specify an installation prefix other than '/usr/local' by giving +'configure' the option '--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option '--exec-prefix=PREFIX' to 'configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like '--bindir=DIR' to specify different values for particular +kinds of files. Run 'configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the default +for these options is expressed in terms of '${prefix}', so that +specifying just '--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to 'configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +'make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, 'make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +'${prefix}'. Any directories that were specified during 'configure', +but not in terms of '${prefix}', must each be overridden at install time +for the entire installation to be relocated. The approach of makefile +variable overrides for each directory variable is required by the GNU +Coding Standards, and ideally causes no recompilation. However, some +platforms have known limitations with the semantics of shared libraries +that end up requiring recompilation when using this method, particularly +noticeable in packages that use GNU Libtool. + + The second method involves providing the 'DESTDIR' variable. For +example, 'make install DESTDIR=/alternate/directory' will prepend +'/alternate/directory' before all installation names. The approach of +'DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of '${prefix}' +at 'configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving 'configure' the +option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. + + Some packages pay attention to '--enable-FEATURE' options to +'configure', where FEATURE indicates an optional part of the package. +They may also pay attention to '--with-PACKAGE' options, where PACKAGE +is something like 'gnu-as' or 'x' (for the X Window System). The +'README' should mention any '--enable-' and '--with-' options that the +package recognizes. + + For packages that use the X Window System, 'configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the 'configure' options '--x-includes=DIR' and +'--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of 'make' will be. For these packages, running './configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with 'make V=1'; while running './configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with 'make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC +is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX 'make' updates targets which have the same time stamps as their +prerequisites, which makes it generally unusable when shipped generated +files such as 'configure' are involved. Use GNU 'make' instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its '' header file. The option '-nodtk' can be used as a +workaround. If GNU CC is not installed, it is therefore recommended to +try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put '/usr/ucb' early in your 'PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in '/usr/bin'. So, if you need '/usr/ucb' +in your 'PATH', put it _after_ '/usr/bin'. + + On Haiku, software installed for all users goes in '/boot/common', +not '/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features 'configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, 'configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +'--build=TYPE' option. TYPE can either be a short name for the system +type, such as 'sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file 'config.sub' for the possible values of each field. If +'config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option '--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with '--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for 'configure' scripts to share, +you can create a site shell script called 'config.site' that gives +default values for variables like 'CC', 'cache_file', and 'prefix'. +'configure' looks for 'PREFIX/share/config.site' if it exists, then +'PREFIX/etc/config.site' if it exists. Or, you can set the +'CONFIG_SITE' environment variable to the location of the site script. +A warning: not all 'configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to 'configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the 'configure' command line, using 'VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified 'gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an +Autoconf limitation. Until the limitation is lifted, you can use this +workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +'configure' Invocation +====================== + + 'configure' recognizes the following options to control how it +operates. + +'--help' +'-h' + Print a summary of all of the options to 'configure', and exit. + +'--help=short' +'--help=recursive' + Print a summary of the options unique to this package's + 'configure', and exit. The 'short' variant lists options used only + in the top level, while the 'recursive' variant lists options also + present in any nested packages. + +'--version' +'-V' + Print the version of Autoconf used to generate the 'configure' + script, and exit. + +'--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally 'config.cache'. FILE defaults to '/dev/null' to + disable caching. + +'--config-cache' +'-C' + Alias for '--cache-file=config.cache'. + +'--quiet' +'--silent' +'-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to '/dev/null' (any error + messages will still be shown). + +'--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + 'configure' can determine that directory automatically. + +'--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: for + more details, including other options available for fine-tuning the + installation locations. + +'--no-create' +'-n' + Run the configure checks, but stop before creating any output + files. + +'configure' also accepts some other, not widely useful, options. Run +'configure --help' for more details. diff --git a/external/opus-1.3.1/Makefile.am b/external/opus-1.3.1/Makefile.am new file mode 100644 index 00000000..7f905b09 --- /dev/null +++ b/external/opus-1.3.1/Makefile.am @@ -0,0 +1,352 @@ +# Provide the full test output for failed tests when using the parallel +# test suite (which is enabled by default with automake 1.13+). +export VERBOSE = yes + +AUTOMAKE_OPTIONS = subdir-objects +ACLOCAL_AMFLAGS = -I m4 + +lib_LTLIBRARIES = libopus.la + +DIST_SUBDIRS = doc + +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/celt -I$(top_srcdir)/silk \ + -I$(top_srcdir)/silk/float -I$(top_srcdir)/silk/fixed $(NE10_CFLAGS) + +include celt_sources.mk +include silk_sources.mk +include opus_sources.mk + +if FIXED_POINT +SILK_SOURCES += $(SILK_SOURCES_FIXED) +if HAVE_SSE4_1 +SILK_SOURCES += $(SILK_SOURCES_SSE4_1) $(SILK_SOURCES_FIXED_SSE4_1) +endif +if HAVE_ARM_NEON_INTR +SILK_SOURCES += $(SILK_SOURCES_FIXED_ARM_NEON_INTR) +endif +else +SILK_SOURCES += $(SILK_SOURCES_FLOAT) +if HAVE_SSE4_1 +SILK_SOURCES += $(SILK_SOURCES_SSE4_1) +endif +endif + +if DISABLE_FLOAT_API +else +OPUS_SOURCES += $(OPUS_SOURCES_FLOAT) +endif + +if HAVE_SSE +CELT_SOURCES += $(CELT_SOURCES_SSE) +endif +if HAVE_SSE2 +CELT_SOURCES += $(CELT_SOURCES_SSE2) +endif +if HAVE_SSE4_1 +CELT_SOURCES += $(CELT_SOURCES_SSE4_1) +endif + +if CPU_ARM +CELT_SOURCES += $(CELT_SOURCES_ARM) +SILK_SOURCES += $(SILK_SOURCES_ARM) + +if HAVE_ARM_NEON_INTR +CELT_SOURCES += $(CELT_SOURCES_ARM_NEON_INTR) +SILK_SOURCES += $(SILK_SOURCES_ARM_NEON_INTR) +endif + +if HAVE_ARM_NE10 +CELT_SOURCES += $(CELT_SOURCES_ARM_NE10) +endif + +if OPUS_ARM_EXTERNAL_ASM +noinst_LTLIBRARIES = libarmasm.la +libarmasm_la_SOURCES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) +BUILT_SOURCES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) \ + $(CELT_AM_SOURCES_ARM_ASM:.s.in=.s) \ + $(CELT_AM_SOURCES_ARM_ASM:.s.in=-gnu.S) +endif +endif + +CLEANFILES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) \ + $(CELT_AM_SOURCES_ARM_ASM:.s.in=-gnu.S) + +include celt_headers.mk +include silk_headers.mk +include opus_headers.mk + +libopus_la_SOURCES = $(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES) +libopus_la_LDFLAGS = -no-undefined -version-info @OPUS_LT_CURRENT@:@OPUS_LT_REVISION@:@OPUS_LT_AGE@ +libopus_la_LIBADD = $(NE10_LIBS) $(LIBM) +if OPUS_ARM_EXTERNAL_ASM +libopus_la_LIBADD += libarmasm.la +endif + +pkginclude_HEADERS = include/opus.h include/opus_multistream.h include/opus_types.h include/opus_defines.h include/opus_projection.h + +noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD) + +if EXTRA_PROGRAMS +noinst_PROGRAMS = celt/tests/test_unit_cwrs32 \ + celt/tests/test_unit_dft \ + celt/tests/test_unit_entropy \ + celt/tests/test_unit_laplace \ + celt/tests/test_unit_mathops \ + celt/tests/test_unit_mdct \ + celt/tests/test_unit_rotation \ + celt/tests/test_unit_types \ + opus_compare \ + opus_demo \ + repacketizer_demo \ + silk/tests/test_unit_LPC_inv_pred_gain \ + tests/test_opus_api \ + tests/test_opus_decode \ + tests/test_opus_encode \ + tests/test_opus_padding \ + tests/test_opus_projection + +TESTS = celt/tests/test_unit_cwrs32 \ + celt/tests/test_unit_dft \ + celt/tests/test_unit_entropy \ + celt/tests/test_unit_laplace \ + celt/tests/test_unit_mathops \ + celt/tests/test_unit_mdct \ + celt/tests/test_unit_rotation \ + celt/tests/test_unit_types \ + silk/tests/test_unit_LPC_inv_pred_gain \ + tests/test_opus_api \ + tests/test_opus_decode \ + tests/test_opus_encode \ + tests/test_opus_padding \ + tests/test_opus_projection + +opus_demo_SOURCES = src/opus_demo.c + +opus_demo_LDADD = libopus.la $(NE10_LIBS) $(LIBM) + +repacketizer_demo_SOURCES = src/repacketizer_demo.c + +repacketizer_demo_LDADD = libopus.la $(NE10_LIBS) $(LIBM) + +opus_compare_SOURCES = src/opus_compare.c +opus_compare_LDADD = $(LIBM) + +tests_test_opus_api_SOURCES = tests/test_opus_api.c tests/test_opus_common.h +tests_test_opus_api_LDADD = libopus.la $(NE10_LIBS) $(LIBM) + +tests_test_opus_encode_SOURCES = tests/test_opus_encode.c tests/opus_encode_regressions.c tests/test_opus_common.h +tests_test_opus_encode_LDADD = libopus.la $(NE10_LIBS) $(LIBM) + +tests_test_opus_decode_SOURCES = tests/test_opus_decode.c tests/test_opus_common.h +tests_test_opus_decode_LDADD = libopus.la $(NE10_LIBS) $(LIBM) + +tests_test_opus_padding_SOURCES = tests/test_opus_padding.c tests/test_opus_common.h +tests_test_opus_padding_LDADD = libopus.la $(NE10_LIBS) $(LIBM) + +CELT_OBJ = $(CELT_SOURCES:.c=.lo) +SILK_OBJ = $(SILK_SOURCES:.c=.lo) +OPUS_OBJ = $(OPUS_SOURCES:.c=.lo) + +tests_test_opus_projection_SOURCES = tests/test_opus_projection.c tests/test_opus_common.h +tests_test_opus_projection_LDADD = $(OPUS_OBJ) $(SILK_OBJ) $(CELT_OBJ) $(NE10_LIBS) $(LIBM) +if OPUS_ARM_EXTERNAL_ASM +tests_test_opus_projection_LDADD += libarmasm.la +endif + +silk_tests_test_unit_LPC_inv_pred_gain_SOURCES = silk/tests/test_unit_LPC_inv_pred_gain.c +silk_tests_test_unit_LPC_inv_pred_gain_LDADD = $(SILK_OBJ) $(CELT_OBJ) $(NE10_LIBS) $(LIBM) +if OPUS_ARM_EXTERNAL_ASM +silk_tests_test_unit_LPC_inv_pred_gain_LDADD += libarmasm.la +endif + +celt_tests_test_unit_cwrs32_SOURCES = celt/tests/test_unit_cwrs32.c +celt_tests_test_unit_cwrs32_LDADD = $(LIBM) + +celt_tests_test_unit_dft_SOURCES = celt/tests/test_unit_dft.c +celt_tests_test_unit_dft_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM) +if OPUS_ARM_EXTERNAL_ASM +celt_tests_test_unit_dft_LDADD += libarmasm.la +endif + +celt_tests_test_unit_entropy_SOURCES = celt/tests/test_unit_entropy.c +celt_tests_test_unit_entropy_LDADD = $(LIBM) + +celt_tests_test_unit_laplace_SOURCES = celt/tests/test_unit_laplace.c +celt_tests_test_unit_laplace_LDADD = $(LIBM) + +celt_tests_test_unit_mathops_SOURCES = celt/tests/test_unit_mathops.c +celt_tests_test_unit_mathops_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM) +if OPUS_ARM_EXTERNAL_ASM +celt_tests_test_unit_mathops_LDADD += libarmasm.la +endif + +celt_tests_test_unit_mdct_SOURCES = celt/tests/test_unit_mdct.c +celt_tests_test_unit_mdct_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM) +if OPUS_ARM_EXTERNAL_ASM +celt_tests_test_unit_mdct_LDADD += libarmasm.la +endif + +celt_tests_test_unit_rotation_SOURCES = celt/tests/test_unit_rotation.c +celt_tests_test_unit_rotation_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM) +if OPUS_ARM_EXTERNAL_ASM +celt_tests_test_unit_rotation_LDADD += libarmasm.la +endif + +celt_tests_test_unit_types_SOURCES = celt/tests/test_unit_types.c +celt_tests_test_unit_types_LDADD = $(LIBM) +endif + +if CUSTOM_MODES +pkginclude_HEADERS += include/opus_custom.h +if EXTRA_PROGRAMS +noinst_PROGRAMS += opus_custom_demo +opus_custom_demo_SOURCES = celt/opus_custom_demo.c +opus_custom_demo_LDADD = libopus.la $(LIBM) +endif +endif + +EXTRA_DIST = opus.pc.in \ + opus-uninstalled.pc.in \ + opus.m4 \ + Makefile.mips \ + Makefile.unix \ + CMakeLists.txt \ + config.h.cmake.in \ + opus_buildtype.cmake \ + opus_config.cmake \ + opus_functions.cmake \ + opus_sources.cmake \ + OpusConfig.cmake.in \ + tests/run_vectors.sh \ + celt/arm/arm2gnu.pl \ + celt/arm/celt_pitch_xcorr_arm.s \ + win32/VS2015/opus.vcxproj \ + win32/VS2015/test_opus_encode.vcxproj.filters \ + win32/VS2015/test_opus_encode.vcxproj \ + win32/VS2015/opus_demo.vcxproj \ + win32/VS2015/test_opus_api.vcxproj.filters \ + win32/VS2015/test_opus_api.vcxproj \ + win32/VS2015/test_opus_decode.vcxproj.filters \ + win32/VS2015/opus_demo.vcxproj.filters \ + win32/VS2015/opus.vcxproj.filters \ + win32/VS2015/test_opus_decode.vcxproj \ + win32/VS2015/opus.sln \ + win32/VS2015/common.props \ + win32/genversion.bat \ + win32/config.h + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = opus.pc + +m4datadir = $(datadir)/aclocal +m4data_DATA = opus.m4 + +# Targets to build and install just the library without the docs +opus check-opus install-opus: export NO_DOXYGEN = 1 + +opus: all +check-opus: check +install-opus: install + + +# Or just the docs +docs: + ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) + +install-docs: + ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) + + +# Or everything (by default) +all-local: + @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) + +install-data-local: + @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) + +clean-local: + -( cd doc && $(MAKE) $(AM_MAKEFLAGS) clean ) + +uninstall-local: + ( cd doc && $(MAKE) $(AM_MAKEFLAGS) uninstall ) + + +# We check this every time make is run, with configure.ac being touched to +# trigger an update of the build system files if update_version changes the +# current PACKAGE_VERSION (or if package_version was modified manually by a +# user with either AUTO_UPDATE=no or no update_version script present - the +# latter being the normal case for tarball releases). +# +# We can't just add the package_version file to CONFIGURE_DEPENDENCIES since +# simply running autoconf will not actually regenerate configure for us when +# the content of that file changes (due to autoconf dependency checking not +# knowing about that without us creating yet another file for it to include). +# +# The MAKECMDGOALS check is a gnu-make'ism, but will degrade 'gracefully' for +# makes that don't support it. The only loss of functionality is not forcing +# an update of package_version for `make dist` if AUTO_UPDATE=no, but that is +# unlikely to be a real problem for any real user. +$(top_srcdir)/configure.ac: force + @case "$(MAKECMDGOALS)" in \ + dist-hook) exit 0 ;; \ + dist-* | dist | distcheck | distclean) _arg=release ;; \ + esac; \ + if ! $(top_srcdir)/update_version $$_arg 2> /dev/null; then \ + if [ ! -e $(top_srcdir)/package_version ]; then \ + echo 'PACKAGE_VERSION="unknown"' > $(top_srcdir)/package_version; \ + fi; \ + . $(top_srcdir)/package_version || exit 1; \ + [ "$(PACKAGE_VERSION)" != "$$PACKAGE_VERSION" ] || exit 0; \ + fi; \ + touch $@ + +force: + +# Create a minimal package_version file when make dist is run. +dist-hook: + echo 'PACKAGE_VERSION="$(PACKAGE_VERSION)"' > $(top_distdir)/package_version + + +.PHONY: opus check-opus install-opus docs install-docs + +# automake doesn't do dependency tracking for asm files, that I can tell +$(CELT_SOURCES_ARM_ASM:%.s=%-gnu.S): celt/arm/armopts-gnu.S +$(CELT_SOURCES_ARM_ASM:%.s=%-gnu.S): $(top_srcdir)/celt/arm/arm2gnu.pl + +# convert ARM asm to GNU as format +%-gnu.S: $(top_srcdir)/%.s + $(top_srcdir)/celt/arm/arm2gnu.pl @ARM2GNU_PARAMS@ < $< > $@ +# For autoconf-modified sources (e.g., armopts.s) +%-gnu.S: %.s + $(top_srcdir)/celt/arm/arm2gnu.pl @ARM2GNU_PARAMS@ < $< > $@ + +OPT_UNIT_TEST_OBJ = $(celt_tests_test_unit_mathops_SOURCES:.c=.o) \ + $(celt_tests_test_unit_rotation_SOURCES:.c=.o) \ + $(celt_tests_test_unit_mdct_SOURCES:.c=.o) \ + $(celt_tests_test_unit_dft_SOURCES:.c=.o) \ + $(silk_tests_test_unit_LPC_inv_pred_gain_SOURCES:.c=.o) + +if HAVE_SSE +SSE_OBJ = $(CELT_SOURCES_SSE:.c=.lo) +$(SSE_OBJ): CFLAGS += $(OPUS_X86_SSE_CFLAGS) +endif + +if HAVE_SSE2 +SSE2_OBJ = $(CELT_SOURCES_SSE2:.c=.lo) +$(SSE2_OBJ): CFLAGS += $(OPUS_X86_SSE2_CFLAGS) +endif + +if HAVE_SSE4_1 +SSE4_1_OBJ = $(CELT_SOURCES_SSE4_1:.c=.lo) \ + $(SILK_SOURCES_SSE4_1:.c=.lo) \ + $(SILK_SOURCES_FIXED_SSE4_1:.c=.lo) +$(SSE4_1_OBJ): CFLAGS += $(OPUS_X86_SSE4_1_CFLAGS) +endif + +if HAVE_ARM_NEON_INTR +ARM_NEON_INTR_OBJ = $(CELT_SOURCES_ARM_NEON_INTR:.c=.lo) \ + $(SILK_SOURCES_ARM_NEON_INTR:.c=.lo) \ + $(SILK_SOURCES_FIXED_ARM_NEON_INTR:.c=.lo) +$(ARM_NEON_INTR_OBJ): CFLAGS += \ + $(OPUS_ARM_NEON_INTR_CFLAGS) $(NE10_CFLAGS) +endif diff --git a/external/opus-1.3.1/Makefile.in b/external/opus-1.3.1/Makefile.in new file mode 100644 index 00000000..81d387b0 --- /dev/null +++ b/external/opus-1.3.1/Makefile.in @@ -0,0 +1,3459 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@FIXED_POINT_TRUE@am__append_1 = $(SILK_SOURCES_FIXED) +@FIXED_POINT_TRUE@@HAVE_SSE4_1_TRUE@am__append_2 = $(SILK_SOURCES_SSE4_1) $(SILK_SOURCES_FIXED_SSE4_1) +@FIXED_POINT_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__append_3 = $(SILK_SOURCES_FIXED_ARM_NEON_INTR) +@FIXED_POINT_FALSE@am__append_4 = $(SILK_SOURCES_FLOAT) +@FIXED_POINT_FALSE@@HAVE_SSE4_1_TRUE@am__append_5 = $(SILK_SOURCES_SSE4_1) +@DISABLE_FLOAT_API_FALSE@am__append_6 = $(OPUS_SOURCES_FLOAT) +@HAVE_SSE_TRUE@am__append_7 = $(CELT_SOURCES_SSE) +@HAVE_SSE2_TRUE@am__append_8 = $(CELT_SOURCES_SSE2) +@HAVE_SSE4_1_TRUE@am__append_9 = $(CELT_SOURCES_SSE4_1) +@CPU_ARM_TRUE@am__append_10 = $(CELT_SOURCES_ARM) +@CPU_ARM_TRUE@am__append_11 = $(SILK_SOURCES_ARM) +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__append_12 = $(CELT_SOURCES_ARM_NEON_INTR) +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__append_13 = $(SILK_SOURCES_ARM_NEON_INTR) +@CPU_ARM_TRUE@@HAVE_ARM_NE10_TRUE@am__append_14 = $(CELT_SOURCES_ARM_NE10) +@OPUS_ARM_EXTERNAL_ASM_TRUE@am__append_15 = libarmasm.la +@EXTRA_PROGRAMS_TRUE@noinst_PROGRAMS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_cwrs32$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_dft$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_entropy$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_laplace$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_mathops$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_mdct$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_rotation$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_types$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ opus_compare$(EXEEXT) opus_demo$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ repacketizer_demo$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ silk/tests/test_unit_LPC_inv_pred_gain$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_api$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_decode$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_encode$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_padding$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_projection$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ $(am__EXEEXT_1) +@EXTRA_PROGRAMS_TRUE@TESTS = celt/tests/test_unit_cwrs32$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_dft$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_entropy$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_laplace$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_mathops$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_mdct$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_rotation$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_types$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ silk/tests/test_unit_LPC_inv_pred_gain$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_api$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_decode$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_encode$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_padding$(EXEEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_projection$(EXEEXT) +@EXTRA_PROGRAMS_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@am__append_16 = libarmasm.la +@EXTRA_PROGRAMS_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@am__append_17 = libarmasm.la +@EXTRA_PROGRAMS_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@am__append_18 = libarmasm.la +@EXTRA_PROGRAMS_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@am__append_19 = libarmasm.la +@EXTRA_PROGRAMS_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@am__append_20 = libarmasm.la +@EXTRA_PROGRAMS_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@am__append_21 = libarmasm.la +@CUSTOM_MODES_TRUE@am__append_22 = include/opus_custom.h +@CUSTOM_MODES_TRUE@@EXTRA_PROGRAMS_TRUE@am__append_23 = opus_custom_demo +subdir = . +SUBDIRS = +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/m4/ax_add_fortify_source.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/opus-intrinsics.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(noinst_HEADERS) \ + $(am__pkginclude_HEADERS_DIST) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = opus.pc opus-uninstalled.pc celt/arm/armopts.s +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(m4datadir)" \ + "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libarmasm_la_LIBADD = +am__libarmasm_la_SOURCES_DIST = celt/arm/celt_pitch_xcorr_arm-gnu.S +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_1 = celt/arm/celt_pitch_xcorr_arm-gnu.lo +@CPU_ARM_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@am_libarmasm_la_OBJECTS = \ +@CPU_ARM_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@ $(am__objects_1) +libarmasm_la_OBJECTS = $(am_libarmasm_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@CPU_ARM_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@am_libarmasm_la_rpath = +am__DEPENDENCIES_1 = +libopus_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__append_15) +am__libopus_la_SOURCES_DIST = celt/bands.c celt/celt.c \ + celt/celt_encoder.c celt/celt_decoder.c celt/cwrs.c \ + celt/entcode.c celt/entdec.c celt/entenc.c celt/kiss_fft.c \ + celt/laplace.c celt/mathops.c celt/mdct.c celt/modes.c \ + celt/pitch.c celt/celt_lpc.c celt/quant_bands.c celt/rate.c \ + celt/vq.c celt/x86/x86cpu.c celt/x86/x86_celt_map.c \ + celt/x86/pitch_sse.c celt/x86/pitch_sse2.c celt/x86/vq_sse2.c \ + celt/x86/celt_lpc_sse4_1.c celt/x86/pitch_sse4_1.c \ + celt/arm/armcpu.c celt/arm/arm_celt_map.c \ + celt/arm/celt_neon_intr.c celt/arm/pitch_neon_intr.c \ + celt/arm/celt_fft_ne10.c celt/arm/celt_mdct_ne10.c silk/CNG.c \ + silk/code_signs.c silk/init_decoder.c silk/decode_core.c \ + silk/decode_frame.c silk/decode_parameters.c \ + silk/decode_indices.c silk/decode_pulses.c \ + silk/decoder_set_fs.c silk/dec_API.c silk/enc_API.c \ + silk/encode_indices.c silk/encode_pulses.c silk/gain_quant.c \ + silk/interpolate.c silk/LP_variable_cutoff.c \ + silk/NLSF_decode.c silk/NSQ.c silk/NSQ_del_dec.c silk/PLC.c \ + silk/shell_coder.c silk/tables_gain.c silk/tables_LTP.c \ + silk/tables_NLSF_CB_NB_MB.c silk/tables_NLSF_CB_WB.c \ + silk/tables_other.c silk/tables_pitch_lag.c \ + silk/tables_pulses_per_block.c silk/VAD.c \ + silk/control_audio_bandwidth.c silk/quant_LTP_gains.c \ + silk/VQ_WMat_EC.c silk/HP_variable_cutoff.c silk/NLSF_encode.c \ + silk/NLSF_VQ.c silk/NLSF_unpack.c silk/NLSF_del_dec_quant.c \ + silk/process_NLSFs.c silk/stereo_LR_to_MS.c \ + silk/stereo_MS_to_LR.c silk/check_control_input.c \ + silk/control_SNR.c silk/init_encoder.c silk/control_codec.c \ + silk/A2NLSF.c silk/ana_filt_bank_1.c silk/biquad_alt.c \ + silk/bwexpander_32.c silk/bwexpander.c silk/debug.c \ + silk/decode_pitch.c silk/inner_prod_aligned.c silk/lin2log.c \ + silk/log2lin.c silk/LPC_analysis_filter.c \ + silk/LPC_inv_pred_gain.c silk/table_LSF_cos.c silk/NLSF2A.c \ + silk/NLSF_stabilize.c silk/NLSF_VQ_weights_laroia.c \ + silk/pitch_est_tables.c silk/resampler.c \ + silk/resampler_down2_3.c silk/resampler_down2.c \ + silk/resampler_private_AR2.c silk/resampler_private_down_FIR.c \ + silk/resampler_private_IIR_FIR.c \ + silk/resampler_private_up2_HQ.c silk/resampler_rom.c \ + silk/sigm_Q15.c silk/sort.c silk/sum_sqr_shift.c \ + silk/stereo_decode_pred.c silk/stereo_encode_pred.c \ + silk/stereo_find_predictor.c silk/stereo_quant_pred.c \ + silk/LPC_fit.c silk/fixed/LTP_analysis_filter_FIX.c \ + silk/fixed/LTP_scale_ctrl_FIX.c silk/fixed/corrMatrix_FIX.c \ + silk/fixed/encode_frame_FIX.c silk/fixed/find_LPC_FIX.c \ + silk/fixed/find_LTP_FIX.c silk/fixed/find_pitch_lags_FIX.c \ + silk/fixed/find_pred_coefs_FIX.c \ + silk/fixed/noise_shape_analysis_FIX.c \ + silk/fixed/process_gains_FIX.c \ + silk/fixed/regularize_correlations_FIX.c \ + silk/fixed/residual_energy16_FIX.c \ + silk/fixed/residual_energy_FIX.c \ + silk/fixed/warped_autocorrelation_FIX.c \ + silk/fixed/apply_sine_window_FIX.c silk/fixed/autocorr_FIX.c \ + silk/fixed/burg_modified_FIX.c silk/fixed/k2a_FIX.c \ + silk/fixed/k2a_Q16_FIX.c silk/fixed/pitch_analysis_core_FIX.c \ + silk/fixed/vector_ops_FIX.c silk/fixed/schur64_FIX.c \ + silk/fixed/schur_FIX.c silk/x86/NSQ_sse4_1.c \ + silk/x86/NSQ_del_dec_sse4_1.c silk/x86/x86_silk_map.c \ + silk/x86/VAD_sse4_1.c silk/x86/VQ_WMat_EC_sse4_1.c \ + silk/fixed/x86/vector_ops_FIX_sse4_1.c \ + silk/fixed/x86/burg_modified_FIX_sse4_1.c \ + silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c \ + silk/float/apply_sine_window_FLP.c silk/float/corrMatrix_FLP.c \ + silk/float/encode_frame_FLP.c silk/float/find_LPC_FLP.c \ + silk/float/find_LTP_FLP.c silk/float/find_pitch_lags_FLP.c \ + silk/float/find_pred_coefs_FLP.c \ + silk/float/LPC_analysis_filter_FLP.c \ + silk/float/LTP_analysis_filter_FLP.c \ + silk/float/LTP_scale_ctrl_FLP.c \ + silk/float/noise_shape_analysis_FLP.c \ + silk/float/process_gains_FLP.c \ + silk/float/regularize_correlations_FLP.c \ + silk/float/residual_energy_FLP.c \ + silk/float/warped_autocorrelation_FLP.c \ + silk/float/wrappers_FLP.c silk/float/autocorrelation_FLP.c \ + silk/float/burg_modified_FLP.c silk/float/bwexpander_FLP.c \ + silk/float/energy_FLP.c silk/float/inner_product_FLP.c \ + silk/float/k2a_FLP.c silk/float/LPC_inv_pred_gain_FLP.c \ + silk/float/pitch_analysis_core_FLP.c \ + silk/float/scale_copy_vector_FLP.c \ + silk/float/scale_vector_FLP.c silk/float/schur_FLP.c \ + silk/float/sort_FLP.c silk/arm/arm_silk_map.c \ + silk/arm/biquad_alt_neon_intr.c \ + silk/arm/LPC_inv_pred_gain_neon_intr.c \ + silk/arm/NSQ_del_dec_neon_intr.c silk/arm/NSQ_neon.c \ + src/opus.c src/opus_decoder.c src/opus_encoder.c \ + src/opus_multistream.c src/opus_multistream_encoder.c \ + src/opus_multistream_decoder.c src/repacketizer.c \ + src/opus_projection_encoder.c src/opus_projection_decoder.c \ + src/mapping_matrix.c src/analysis.c src/mlp.c src/mlp_data.c +am__objects_2 = celt/x86/x86cpu.lo celt/x86/x86_celt_map.lo \ + celt/x86/pitch_sse.lo +@HAVE_SSE_TRUE@am__objects_3 = $(am__objects_2) +am__objects_4 = celt/x86/pitch_sse2.lo celt/x86/vq_sse2.lo +@HAVE_SSE2_TRUE@am__objects_5 = $(am__objects_4) +am__objects_6 = celt/x86/celt_lpc_sse4_1.lo celt/x86/pitch_sse4_1.lo +@HAVE_SSE4_1_TRUE@am__objects_7 = $(am__objects_6) +am__objects_8 = celt/arm/armcpu.lo celt/arm/arm_celt_map.lo +@CPU_ARM_TRUE@am__objects_9 = $(am__objects_8) +am__objects_10 = celt/arm/celt_neon_intr.lo \ + celt/arm/pitch_neon_intr.lo +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__objects_11 = \ +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@ $(am__objects_10) +am__objects_12 = celt/arm/celt_fft_ne10.lo celt/arm/celt_mdct_ne10.lo +@CPU_ARM_TRUE@@HAVE_ARM_NE10_TRUE@am__objects_13 = $(am__objects_12) +am__objects_14 = celt/bands.lo celt/celt.lo celt/celt_encoder.lo \ + celt/celt_decoder.lo celt/cwrs.lo celt/entcode.lo \ + celt/entdec.lo celt/entenc.lo celt/kiss_fft.lo celt/laplace.lo \ + celt/mathops.lo celt/mdct.lo celt/modes.lo celt/pitch.lo \ + celt/celt_lpc.lo celt/quant_bands.lo celt/rate.lo celt/vq.lo \ + $(am__objects_3) $(am__objects_5) $(am__objects_7) \ + $(am__objects_9) $(am__objects_11) $(am__objects_13) +am__objects_15 = silk/fixed/LTP_analysis_filter_FIX.lo \ + silk/fixed/LTP_scale_ctrl_FIX.lo silk/fixed/corrMatrix_FIX.lo \ + silk/fixed/encode_frame_FIX.lo silk/fixed/find_LPC_FIX.lo \ + silk/fixed/find_LTP_FIX.lo silk/fixed/find_pitch_lags_FIX.lo \ + silk/fixed/find_pred_coefs_FIX.lo \ + silk/fixed/noise_shape_analysis_FIX.lo \ + silk/fixed/process_gains_FIX.lo \ + silk/fixed/regularize_correlations_FIX.lo \ + silk/fixed/residual_energy16_FIX.lo \ + silk/fixed/residual_energy_FIX.lo \ + silk/fixed/warped_autocorrelation_FIX.lo \ + silk/fixed/apply_sine_window_FIX.lo silk/fixed/autocorr_FIX.lo \ + silk/fixed/burg_modified_FIX.lo silk/fixed/k2a_FIX.lo \ + silk/fixed/k2a_Q16_FIX.lo \ + silk/fixed/pitch_analysis_core_FIX.lo \ + silk/fixed/vector_ops_FIX.lo silk/fixed/schur64_FIX.lo \ + silk/fixed/schur_FIX.lo +@FIXED_POINT_TRUE@am__objects_16 = $(am__objects_15) +am__objects_17 = silk/x86/NSQ_sse4_1.lo silk/x86/NSQ_del_dec_sse4_1.lo \ + silk/x86/x86_silk_map.lo silk/x86/VAD_sse4_1.lo \ + silk/x86/VQ_WMat_EC_sse4_1.lo +am__objects_18 = silk/fixed/x86/vector_ops_FIX_sse4_1.lo \ + silk/fixed/x86/burg_modified_FIX_sse4_1.lo +@FIXED_POINT_TRUE@@HAVE_SSE4_1_TRUE@am__objects_19 = \ +@FIXED_POINT_TRUE@@HAVE_SSE4_1_TRUE@ $(am__objects_17) \ +@FIXED_POINT_TRUE@@HAVE_SSE4_1_TRUE@ $(am__objects_18) +am__objects_20 = \ + silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.lo +@FIXED_POINT_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__objects_21 = \ +@FIXED_POINT_TRUE@@HAVE_ARM_NEON_INTR_TRUE@ $(am__objects_20) +am__objects_22 = silk/float/apply_sine_window_FLP.lo \ + silk/float/corrMatrix_FLP.lo silk/float/encode_frame_FLP.lo \ + silk/float/find_LPC_FLP.lo silk/float/find_LTP_FLP.lo \ + silk/float/find_pitch_lags_FLP.lo \ + silk/float/find_pred_coefs_FLP.lo \ + silk/float/LPC_analysis_filter_FLP.lo \ + silk/float/LTP_analysis_filter_FLP.lo \ + silk/float/LTP_scale_ctrl_FLP.lo \ + silk/float/noise_shape_analysis_FLP.lo \ + silk/float/process_gains_FLP.lo \ + silk/float/regularize_correlations_FLP.lo \ + silk/float/residual_energy_FLP.lo \ + silk/float/warped_autocorrelation_FLP.lo \ + silk/float/wrappers_FLP.lo silk/float/autocorrelation_FLP.lo \ + silk/float/burg_modified_FLP.lo silk/float/bwexpander_FLP.lo \ + silk/float/energy_FLP.lo silk/float/inner_product_FLP.lo \ + silk/float/k2a_FLP.lo silk/float/LPC_inv_pred_gain_FLP.lo \ + silk/float/pitch_analysis_core_FLP.lo \ + silk/float/scale_copy_vector_FLP.lo \ + silk/float/scale_vector_FLP.lo silk/float/schur_FLP.lo \ + silk/float/sort_FLP.lo +@FIXED_POINT_FALSE@am__objects_23 = $(am__objects_22) +@FIXED_POINT_FALSE@@HAVE_SSE4_1_TRUE@am__objects_24 = \ +@FIXED_POINT_FALSE@@HAVE_SSE4_1_TRUE@ $(am__objects_17) +am__objects_25 = +am__objects_26 = silk/arm/arm_silk_map.lo \ + silk/arm/biquad_alt_neon_intr.lo \ + silk/arm/LPC_inv_pred_gain_neon_intr.lo \ + silk/arm/NSQ_del_dec_neon_intr.lo silk/arm/NSQ_neon.lo +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__objects_27 = \ +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@ $(am__objects_26) +am__objects_28 = silk/CNG.lo silk/code_signs.lo silk/init_decoder.lo \ + silk/decode_core.lo silk/decode_frame.lo \ + silk/decode_parameters.lo silk/decode_indices.lo \ + silk/decode_pulses.lo silk/decoder_set_fs.lo silk/dec_API.lo \ + silk/enc_API.lo silk/encode_indices.lo silk/encode_pulses.lo \ + silk/gain_quant.lo silk/interpolate.lo \ + silk/LP_variable_cutoff.lo silk/NLSF_decode.lo silk/NSQ.lo \ + silk/NSQ_del_dec.lo silk/PLC.lo silk/shell_coder.lo \ + silk/tables_gain.lo silk/tables_LTP.lo \ + silk/tables_NLSF_CB_NB_MB.lo silk/tables_NLSF_CB_WB.lo \ + silk/tables_other.lo silk/tables_pitch_lag.lo \ + silk/tables_pulses_per_block.lo silk/VAD.lo \ + silk/control_audio_bandwidth.lo silk/quant_LTP_gains.lo \ + silk/VQ_WMat_EC.lo silk/HP_variable_cutoff.lo \ + silk/NLSF_encode.lo silk/NLSF_VQ.lo silk/NLSF_unpack.lo \ + silk/NLSF_del_dec_quant.lo silk/process_NLSFs.lo \ + silk/stereo_LR_to_MS.lo silk/stereo_MS_to_LR.lo \ + silk/check_control_input.lo silk/control_SNR.lo \ + silk/init_encoder.lo silk/control_codec.lo silk/A2NLSF.lo \ + silk/ana_filt_bank_1.lo silk/biquad_alt.lo \ + silk/bwexpander_32.lo silk/bwexpander.lo silk/debug.lo \ + silk/decode_pitch.lo silk/inner_prod_aligned.lo \ + silk/lin2log.lo silk/log2lin.lo silk/LPC_analysis_filter.lo \ + silk/LPC_inv_pred_gain.lo silk/table_LSF_cos.lo silk/NLSF2A.lo \ + silk/NLSF_stabilize.lo silk/NLSF_VQ_weights_laroia.lo \ + silk/pitch_est_tables.lo silk/resampler.lo \ + silk/resampler_down2_3.lo silk/resampler_down2.lo \ + silk/resampler_private_AR2.lo \ + silk/resampler_private_down_FIR.lo \ + silk/resampler_private_IIR_FIR.lo \ + silk/resampler_private_up2_HQ.lo silk/resampler_rom.lo \ + silk/sigm_Q15.lo silk/sort.lo silk/sum_sqr_shift.lo \ + silk/stereo_decode_pred.lo silk/stereo_encode_pred.lo \ + silk/stereo_find_predictor.lo silk/stereo_quant_pred.lo \ + silk/LPC_fit.lo $(am__objects_16) $(am__objects_19) \ + $(am__objects_21) $(am__objects_23) $(am__objects_24) \ + $(am__objects_25) $(am__objects_27) +am__objects_29 = src/analysis.lo src/mlp.lo src/mlp_data.lo +@DISABLE_FLOAT_API_FALSE@am__objects_30 = $(am__objects_29) +am__objects_31 = src/opus.lo src/opus_decoder.lo src/opus_encoder.lo \ + src/opus_multistream.lo src/opus_multistream_encoder.lo \ + src/opus_multistream_decoder.lo src/repacketizer.lo \ + src/opus_projection_encoder.lo src/opus_projection_decoder.lo \ + src/mapping_matrix.lo $(am__objects_30) +am_libopus_la_OBJECTS = $(am__objects_14) $(am__objects_28) \ + $(am__objects_31) +libopus_la_OBJECTS = $(am_libopus_la_OBJECTS) +libopus_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libopus_la_LDFLAGS) $(LDFLAGS) -o $@ +@CUSTOM_MODES_TRUE@@EXTRA_PROGRAMS_TRUE@am__EXEEXT_1 = opus_custom_demo$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +am__celt_tests_test_unit_cwrs32_SOURCES_DIST = \ + celt/tests/test_unit_cwrs32.c +@EXTRA_PROGRAMS_TRUE@am_celt_tests_test_unit_cwrs32_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_cwrs32.$(OBJEXT) +celt_tests_test_unit_cwrs32_OBJECTS = \ + $(am_celt_tests_test_unit_cwrs32_OBJECTS) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_cwrs32_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__celt_tests_test_unit_dft_SOURCES_DIST = \ + celt/tests/test_unit_dft.c +@EXTRA_PROGRAMS_TRUE@am_celt_tests_test_unit_dft_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_dft.$(OBJEXT) +celt_tests_test_unit_dft_OBJECTS = \ + $(am_celt_tests_test_unit_dft_OBJECTS) +am__DEPENDENCIES_2 = celt/x86/x86cpu.lo celt/x86/x86_celt_map.lo \ + celt/x86/pitch_sse.lo +@HAVE_SSE_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) +am__DEPENDENCIES_4 = celt/x86/pitch_sse2.lo celt/x86/vq_sse2.lo +@HAVE_SSE2_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_4) +am__DEPENDENCIES_6 = celt/x86/celt_lpc_sse4_1.lo \ + celt/x86/pitch_sse4_1.lo +@HAVE_SSE4_1_TRUE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_6) +am__DEPENDENCIES_8 = celt/arm/armcpu.lo celt/arm/arm_celt_map.lo +@CPU_ARM_TRUE@am__DEPENDENCIES_9 = $(am__DEPENDENCIES_8) +am__DEPENDENCIES_10 = celt/arm/celt_neon_intr.lo \ + celt/arm/pitch_neon_intr.lo +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__DEPENDENCIES_11 = \ +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@ $(am__DEPENDENCIES_10) +am__DEPENDENCIES_12 = celt/arm/celt_fft_ne10.lo \ + celt/arm/celt_mdct_ne10.lo +@CPU_ARM_TRUE@@HAVE_ARM_NE10_TRUE@am__DEPENDENCIES_13 = \ +@CPU_ARM_TRUE@@HAVE_ARM_NE10_TRUE@ $(am__DEPENDENCIES_12) +am__DEPENDENCIES_14 = celt/bands.lo celt/celt.lo celt/celt_encoder.lo \ + celt/celt_decoder.lo celt/cwrs.lo celt/entcode.lo \ + celt/entdec.lo celt/entenc.lo celt/kiss_fft.lo celt/laplace.lo \ + celt/mathops.lo celt/mdct.lo celt/modes.lo celt/pitch.lo \ + celt/celt_lpc.lo celt/quant_bands.lo celt/rate.lo celt/vq.lo \ + $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_5) \ + $(am__DEPENDENCIES_7) $(am__DEPENDENCIES_9) \ + $(am__DEPENDENCIES_11) $(am__DEPENDENCIES_13) +@EXTRA_PROGRAMS_TRUE@am__DEPENDENCIES_15 = $(am__DEPENDENCIES_14) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_dft_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_15) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) $(am__append_18) +am__celt_tests_test_unit_entropy_SOURCES_DIST = \ + celt/tests/test_unit_entropy.c +@EXTRA_PROGRAMS_TRUE@am_celt_tests_test_unit_entropy_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_entropy.$(OBJEXT) +celt_tests_test_unit_entropy_OBJECTS = \ + $(am_celt_tests_test_unit_entropy_OBJECTS) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_entropy_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__celt_tests_test_unit_laplace_SOURCES_DIST = \ + celt/tests/test_unit_laplace.c +@EXTRA_PROGRAMS_TRUE@am_celt_tests_test_unit_laplace_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_laplace.$(OBJEXT) +celt_tests_test_unit_laplace_OBJECTS = \ + $(am_celt_tests_test_unit_laplace_OBJECTS) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_laplace_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__celt_tests_test_unit_mathops_SOURCES_DIST = \ + celt/tests/test_unit_mathops.c +@EXTRA_PROGRAMS_TRUE@am_celt_tests_test_unit_mathops_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_mathops.$(OBJEXT) +celt_tests_test_unit_mathops_OBJECTS = \ + $(am_celt_tests_test_unit_mathops_OBJECTS) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_mathops_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_15) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) $(am__append_19) +am__celt_tests_test_unit_mdct_SOURCES_DIST = \ + celt/tests/test_unit_mdct.c +@EXTRA_PROGRAMS_TRUE@am_celt_tests_test_unit_mdct_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_mdct.$(OBJEXT) +celt_tests_test_unit_mdct_OBJECTS = \ + $(am_celt_tests_test_unit_mdct_OBJECTS) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_mdct_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_15) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) $(am__append_20) +am__celt_tests_test_unit_rotation_SOURCES_DIST = \ + celt/tests/test_unit_rotation.c +@EXTRA_PROGRAMS_TRUE@am_celt_tests_test_unit_rotation_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_rotation.$(OBJEXT) +celt_tests_test_unit_rotation_OBJECTS = \ + $(am_celt_tests_test_unit_rotation_OBJECTS) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_rotation_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_15) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) $(am__append_21) +am__celt_tests_test_unit_types_SOURCES_DIST = \ + celt/tests/test_unit_types.c +@EXTRA_PROGRAMS_TRUE@am_celt_tests_test_unit_types_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ celt/tests/test_unit_types.$(OBJEXT) +celt_tests_test_unit_types_OBJECTS = \ + $(am_celt_tests_test_unit_types_OBJECTS) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_types_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__opus_compare_SOURCES_DIST = src/opus_compare.c +@EXTRA_PROGRAMS_TRUE@am_opus_compare_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ src/opus_compare.$(OBJEXT) +opus_compare_OBJECTS = $(am_opus_compare_OBJECTS) +@EXTRA_PROGRAMS_TRUE@opus_compare_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__opus_custom_demo_SOURCES_DIST = celt/opus_custom_demo.c +@CUSTOM_MODES_TRUE@@EXTRA_PROGRAMS_TRUE@am_opus_custom_demo_OBJECTS = celt/opus_custom_demo.$(OBJEXT) +opus_custom_demo_OBJECTS = $(am_opus_custom_demo_OBJECTS) +@CUSTOM_MODES_TRUE@@EXTRA_PROGRAMS_TRUE@opus_custom_demo_DEPENDENCIES = \ +@CUSTOM_MODES_TRUE@@EXTRA_PROGRAMS_TRUE@ libopus.la \ +@CUSTOM_MODES_TRUE@@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__opus_demo_SOURCES_DIST = src/opus_demo.c +@EXTRA_PROGRAMS_TRUE@am_opus_demo_OBJECTS = src/opus_demo.$(OBJEXT) +opus_demo_OBJECTS = $(am_opus_demo_OBJECTS) +@EXTRA_PROGRAMS_TRUE@opus_demo_DEPENDENCIES = libopus.la \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__repacketizer_demo_SOURCES_DIST = src/repacketizer_demo.c +@EXTRA_PROGRAMS_TRUE@am_repacketizer_demo_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ src/repacketizer_demo.$(OBJEXT) +repacketizer_demo_OBJECTS = $(am_repacketizer_demo_OBJECTS) +@EXTRA_PROGRAMS_TRUE@repacketizer_demo_DEPENDENCIES = libopus.la \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__silk_tests_test_unit_LPC_inv_pred_gain_SOURCES_DIST = \ + silk/tests/test_unit_LPC_inv_pred_gain.c +@EXTRA_PROGRAMS_TRUE@am_silk_tests_test_unit_LPC_inv_pred_gain_OBJECTS = silk/tests/test_unit_LPC_inv_pred_gain.$(OBJEXT) +silk_tests_test_unit_LPC_inv_pred_gain_OBJECTS = \ + $(am_silk_tests_test_unit_LPC_inv_pred_gain_OBJECTS) +am__DEPENDENCIES_16 = silk/fixed/LTP_analysis_filter_FIX.lo \ + silk/fixed/LTP_scale_ctrl_FIX.lo silk/fixed/corrMatrix_FIX.lo \ + silk/fixed/encode_frame_FIX.lo silk/fixed/find_LPC_FIX.lo \ + silk/fixed/find_LTP_FIX.lo silk/fixed/find_pitch_lags_FIX.lo \ + silk/fixed/find_pred_coefs_FIX.lo \ + silk/fixed/noise_shape_analysis_FIX.lo \ + silk/fixed/process_gains_FIX.lo \ + silk/fixed/regularize_correlations_FIX.lo \ + silk/fixed/residual_energy16_FIX.lo \ + silk/fixed/residual_energy_FIX.lo \ + silk/fixed/warped_autocorrelation_FIX.lo \ + silk/fixed/apply_sine_window_FIX.lo silk/fixed/autocorr_FIX.lo \ + silk/fixed/burg_modified_FIX.lo silk/fixed/k2a_FIX.lo \ + silk/fixed/k2a_Q16_FIX.lo \ + silk/fixed/pitch_analysis_core_FIX.lo \ + silk/fixed/vector_ops_FIX.lo silk/fixed/schur64_FIX.lo \ + silk/fixed/schur_FIX.lo +@FIXED_POINT_TRUE@am__DEPENDENCIES_17 = $(am__DEPENDENCIES_16) +am__DEPENDENCIES_18 = silk/x86/NSQ_sse4_1.lo \ + silk/x86/NSQ_del_dec_sse4_1.lo silk/x86/x86_silk_map.lo \ + silk/x86/VAD_sse4_1.lo silk/x86/VQ_WMat_EC_sse4_1.lo +am__DEPENDENCIES_19 = silk/fixed/x86/vector_ops_FIX_sse4_1.lo \ + silk/fixed/x86/burg_modified_FIX_sse4_1.lo +@FIXED_POINT_TRUE@@HAVE_SSE4_1_TRUE@am__DEPENDENCIES_20 = \ +@FIXED_POINT_TRUE@@HAVE_SSE4_1_TRUE@ $(am__DEPENDENCIES_18) \ +@FIXED_POINT_TRUE@@HAVE_SSE4_1_TRUE@ $(am__DEPENDENCIES_19) +am__DEPENDENCIES_21 = \ + silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.lo +@FIXED_POINT_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__DEPENDENCIES_22 = $(am__DEPENDENCIES_21) +am__DEPENDENCIES_23 = silk/float/apply_sine_window_FLP.lo \ + silk/float/corrMatrix_FLP.lo silk/float/encode_frame_FLP.lo \ + silk/float/find_LPC_FLP.lo silk/float/find_LTP_FLP.lo \ + silk/float/find_pitch_lags_FLP.lo \ + silk/float/find_pred_coefs_FLP.lo \ + silk/float/LPC_analysis_filter_FLP.lo \ + silk/float/LTP_analysis_filter_FLP.lo \ + silk/float/LTP_scale_ctrl_FLP.lo \ + silk/float/noise_shape_analysis_FLP.lo \ + silk/float/process_gains_FLP.lo \ + silk/float/regularize_correlations_FLP.lo \ + silk/float/residual_energy_FLP.lo \ + silk/float/warped_autocorrelation_FLP.lo \ + silk/float/wrappers_FLP.lo silk/float/autocorrelation_FLP.lo \ + silk/float/burg_modified_FLP.lo silk/float/bwexpander_FLP.lo \ + silk/float/energy_FLP.lo silk/float/inner_product_FLP.lo \ + silk/float/k2a_FLP.lo silk/float/LPC_inv_pred_gain_FLP.lo \ + silk/float/pitch_analysis_core_FLP.lo \ + silk/float/scale_copy_vector_FLP.lo \ + silk/float/scale_vector_FLP.lo silk/float/schur_FLP.lo \ + silk/float/sort_FLP.lo +@FIXED_POINT_FALSE@am__DEPENDENCIES_24 = $(am__DEPENDENCIES_23) +@FIXED_POINT_FALSE@@HAVE_SSE4_1_TRUE@am__DEPENDENCIES_25 = \ +@FIXED_POINT_FALSE@@HAVE_SSE4_1_TRUE@ $(am__DEPENDENCIES_18) +am__DEPENDENCIES_26 = silk/arm/arm_silk_map.lo \ + silk/arm/biquad_alt_neon_intr.lo \ + silk/arm/LPC_inv_pred_gain_neon_intr.lo \ + silk/arm/NSQ_del_dec_neon_intr.lo silk/arm/NSQ_neon.lo +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@am__DEPENDENCIES_27 = \ +@CPU_ARM_TRUE@@HAVE_ARM_NEON_INTR_TRUE@ $(am__DEPENDENCIES_26) +am__DEPENDENCIES_28 = silk/CNG.lo silk/code_signs.lo \ + silk/init_decoder.lo silk/decode_core.lo silk/decode_frame.lo \ + silk/decode_parameters.lo silk/decode_indices.lo \ + silk/decode_pulses.lo silk/decoder_set_fs.lo silk/dec_API.lo \ + silk/enc_API.lo silk/encode_indices.lo silk/encode_pulses.lo \ + silk/gain_quant.lo silk/interpolate.lo \ + silk/LP_variable_cutoff.lo silk/NLSF_decode.lo silk/NSQ.lo \ + silk/NSQ_del_dec.lo silk/PLC.lo silk/shell_coder.lo \ + silk/tables_gain.lo silk/tables_LTP.lo \ + silk/tables_NLSF_CB_NB_MB.lo silk/tables_NLSF_CB_WB.lo \ + silk/tables_other.lo silk/tables_pitch_lag.lo \ + silk/tables_pulses_per_block.lo silk/VAD.lo \ + silk/control_audio_bandwidth.lo silk/quant_LTP_gains.lo \ + silk/VQ_WMat_EC.lo silk/HP_variable_cutoff.lo \ + silk/NLSF_encode.lo silk/NLSF_VQ.lo silk/NLSF_unpack.lo \ + silk/NLSF_del_dec_quant.lo silk/process_NLSFs.lo \ + silk/stereo_LR_to_MS.lo silk/stereo_MS_to_LR.lo \ + silk/check_control_input.lo silk/control_SNR.lo \ + silk/init_encoder.lo silk/control_codec.lo silk/A2NLSF.lo \ + silk/ana_filt_bank_1.lo silk/biquad_alt.lo \ + silk/bwexpander_32.lo silk/bwexpander.lo silk/debug.lo \ + silk/decode_pitch.lo silk/inner_prod_aligned.lo \ + silk/lin2log.lo silk/log2lin.lo silk/LPC_analysis_filter.lo \ + silk/LPC_inv_pred_gain.lo silk/table_LSF_cos.lo silk/NLSF2A.lo \ + silk/NLSF_stabilize.lo silk/NLSF_VQ_weights_laroia.lo \ + silk/pitch_est_tables.lo silk/resampler.lo \ + silk/resampler_down2_3.lo silk/resampler_down2.lo \ + silk/resampler_private_AR2.lo \ + silk/resampler_private_down_FIR.lo \ + silk/resampler_private_IIR_FIR.lo \ + silk/resampler_private_up2_HQ.lo silk/resampler_rom.lo \ + silk/sigm_Q15.lo silk/sort.lo silk/sum_sqr_shift.lo \ + silk/stereo_decode_pred.lo silk/stereo_encode_pred.lo \ + silk/stereo_find_predictor.lo silk/stereo_quant_pred.lo \ + silk/LPC_fit.lo $(am__DEPENDENCIES_17) $(am__DEPENDENCIES_20) \ + $(am__DEPENDENCIES_22) $(am__DEPENDENCIES_24) \ + $(am__DEPENDENCIES_25) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_27) +@EXTRA_PROGRAMS_TRUE@am__DEPENDENCIES_29 = $(am__DEPENDENCIES_28) +@EXTRA_PROGRAMS_TRUE@silk_tests_test_unit_LPC_inv_pred_gain_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_29) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_15) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) $(am__append_17) +am__tests_test_opus_api_SOURCES_DIST = tests/test_opus_api.c \ + tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@am_tests_test_opus_api_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_api.$(OBJEXT) +tests_test_opus_api_OBJECTS = $(am_tests_test_opus_api_OBJECTS) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_api_DEPENDENCIES = libopus.la \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__tests_test_opus_decode_SOURCES_DIST = tests/test_opus_decode.c \ + tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@am_tests_test_opus_decode_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_decode.$(OBJEXT) +tests_test_opus_decode_OBJECTS = $(am_tests_test_opus_decode_OBJECTS) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_decode_DEPENDENCIES = libopus.la \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__tests_test_opus_encode_SOURCES_DIST = tests/test_opus_encode.c \ + tests/opus_encode_regressions.c tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@am_tests_test_opus_encode_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_encode.$(OBJEXT) \ +@EXTRA_PROGRAMS_TRUE@ tests/opus_encode_regressions.$(OBJEXT) +tests_test_opus_encode_OBJECTS = $(am_tests_test_opus_encode_OBJECTS) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_encode_DEPENDENCIES = libopus.la \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__tests_test_opus_padding_SOURCES_DIST = tests/test_opus_padding.c \ + tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@am_tests_test_opus_padding_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_padding.$(OBJEXT) +tests_test_opus_padding_OBJECTS = \ + $(am_tests_test_opus_padding_OBJECTS) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_padding_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ libopus.la $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) +am__tests_test_opus_projection_SOURCES_DIST = \ + tests/test_opus_projection.c tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@am_tests_test_opus_projection_OBJECTS = \ +@EXTRA_PROGRAMS_TRUE@ tests/test_opus_projection.$(OBJEXT) +tests_test_opus_projection_OBJECTS = \ + $(am_tests_test_opus_projection_OBJECTS) +am__DEPENDENCIES_30 = src/analysis.lo src/mlp.lo src/mlp_data.lo +@DISABLE_FLOAT_API_FALSE@am__DEPENDENCIES_31 = $(am__DEPENDENCIES_30) +am__DEPENDENCIES_32 = src/opus.lo src/opus_decoder.lo \ + src/opus_encoder.lo src/opus_multistream.lo \ + src/opus_multistream_encoder.lo \ + src/opus_multistream_decoder.lo src/repacketizer.lo \ + src/opus_projection_encoder.lo src/opus_projection_decoder.lo \ + src/mapping_matrix.lo $(am__DEPENDENCIES_31) +@EXTRA_PROGRAMS_TRUE@am__DEPENDENCIES_33 = $(am__DEPENDENCIES_32) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_projection_DEPENDENCIES = \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_33) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_29) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_15) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) \ +@EXTRA_PROGRAMS_TRUE@ $(am__DEPENDENCIES_1) $(am__append_16) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CCASFLAGS) $(CCASFLAGS) +AM_V_CPPAS = $(am__v_CPPAS_@AM_V@) +am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@) +am__v_CPPAS_0 = @echo " CPPAS " $@; +am__v_CPPAS_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libarmasm_la_SOURCES) $(libopus_la_SOURCES) \ + $(celt_tests_test_unit_cwrs32_SOURCES) \ + $(celt_tests_test_unit_dft_SOURCES) \ + $(celt_tests_test_unit_entropy_SOURCES) \ + $(celt_tests_test_unit_laplace_SOURCES) \ + $(celt_tests_test_unit_mathops_SOURCES) \ + $(celt_tests_test_unit_mdct_SOURCES) \ + $(celt_tests_test_unit_rotation_SOURCES) \ + $(celt_tests_test_unit_types_SOURCES) $(opus_compare_SOURCES) \ + $(opus_custom_demo_SOURCES) $(opus_demo_SOURCES) \ + $(repacketizer_demo_SOURCES) \ + $(silk_tests_test_unit_LPC_inv_pred_gain_SOURCES) \ + $(tests_test_opus_api_SOURCES) \ + $(tests_test_opus_decode_SOURCES) \ + $(tests_test_opus_encode_SOURCES) \ + $(tests_test_opus_padding_SOURCES) \ + $(tests_test_opus_projection_SOURCES) +DIST_SOURCES = $(am__libarmasm_la_SOURCES_DIST) \ + $(am__libopus_la_SOURCES_DIST) \ + $(am__celt_tests_test_unit_cwrs32_SOURCES_DIST) \ + $(am__celt_tests_test_unit_dft_SOURCES_DIST) \ + $(am__celt_tests_test_unit_entropy_SOURCES_DIST) \ + $(am__celt_tests_test_unit_laplace_SOURCES_DIST) \ + $(am__celt_tests_test_unit_mathops_SOURCES_DIST) \ + $(am__celt_tests_test_unit_mdct_SOURCES_DIST) \ + $(am__celt_tests_test_unit_rotation_SOURCES_DIST) \ + $(am__celt_tests_test_unit_types_SOURCES_DIST) \ + $(am__opus_compare_SOURCES_DIST) \ + $(am__opus_custom_demo_SOURCES_DIST) \ + $(am__opus_demo_SOURCES_DIST) \ + $(am__repacketizer_demo_SOURCES_DIST) \ + $(am__silk_tests_test_unit_LPC_inv_pred_gain_SOURCES_DIST) \ + $(am__tests_test_opus_api_SOURCES_DIST) \ + $(am__tests_test_opus_decode_SOURCES_DIST) \ + $(am__tests_test_opus_encode_SOURCES_DIST) \ + $(am__tests_test_opus_padding_SOURCES_DIST) \ + $(am__tests_test_opus_projection_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(m4data_DATA) $(pkgconfig_DATA) +am__pkginclude_HEADERS_DIST = include/opus.h \ + include/opus_multistream.h include/opus_types.h \ + include/opus_defines.h include/opus_projection.h \ + include/opus_custom.h +HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope check recheck distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/celt_headers.mk \ + $(srcdir)/celt_sources.mk $(srcdir)/config.h.in \ + $(srcdir)/opus-uninstalled.pc.in $(srcdir)/opus.pc.in \ + $(srcdir)/opus_headers.mk $(srcdir)/opus_sources.mk \ + $(srcdir)/silk_headers.mk $(srcdir)/silk_sources.mk \ + $(top_srcdir)/celt/arm/armopts.s.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README compile config.guess config.sub depcomp \ + install-sh ltmain.sh missing test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +ARM2GNU_PARAMS = @ARM2GNU_PARAMS@ +ARM_NEON_INTR_CFLAGS = @ARM_NEON_INTR_CFLAGS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_ARM_NE10 = @HAVE_ARM_NE10@ +HAVE_DOT = @HAVE_DOT@ +HAVE_DOXYGEN = @HAVE_DOXYGEN@ +HAVE_PERL = @HAVE_PERL@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NE10_CFLAGS = @NE10_CFLAGS@ +NE10_LIBS = @NE10_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPUS_ARM_MAY_HAVE_EDSP = @OPUS_ARM_MAY_HAVE_EDSP@ +OPUS_ARM_MAY_HAVE_MEDIA = @OPUS_ARM_MAY_HAVE_MEDIA@ +OPUS_ARM_MAY_HAVE_NEON = @OPUS_ARM_MAY_HAVE_NEON@ +OPUS_ARM_NEON_INTR_CFLAGS = @OPUS_ARM_NEON_INTR_CFLAGS@ +OPUS_HAVE_RTCD = @OPUS_HAVE_RTCD@ +OPUS_LT_AGE = @OPUS_LT_AGE@ +OPUS_LT_CURRENT = @OPUS_LT_CURRENT@ +OPUS_LT_REVISION = @OPUS_LT_REVISION@ +OPUS_X86_AVX_CFLAGS = @OPUS_X86_AVX_CFLAGS@ +OPUS_X86_SSE2_CFLAGS = @OPUS_X86_SSE2_CFLAGS@ +OPUS_X86_SSE4_1_CFLAGS = @OPUS_X86_SSE4_1_CFLAGS@ +OPUS_X86_SSE_CFLAGS = @OPUS_X86_SSE_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_BUILD = @PC_BUILD@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +X86_AVX_CFLAGS = @X86_AVX_CFLAGS@ +X86_SSE2_CFLAGS = @X86_SSE2_CFLAGS@ +X86_SSE4_1_CFLAGS = @X86_SSE4_1_CFLAGS@ +X86_SSE_CFLAGS = @X86_SSE_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +ACLOCAL_AMFLAGS = -I m4 +lib_LTLIBRARIES = libopus.la +DIST_SUBDIRS = doc +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/celt -I$(top_srcdir)/silk \ + -I$(top_srcdir)/silk/float -I$(top_srcdir)/silk/fixed $(NE10_CFLAGS) + +CELT_SOURCES = celt/bands.c celt/celt.c celt/celt_encoder.c \ + celt/celt_decoder.c celt/cwrs.c celt/entcode.c celt/entdec.c \ + celt/entenc.c celt/kiss_fft.c celt/laplace.c celt/mathops.c \ + celt/mdct.c celt/modes.c celt/pitch.c celt/celt_lpc.c \ + celt/quant_bands.c celt/rate.c celt/vq.c $(am__append_7) \ + $(am__append_8) $(am__append_9) $(am__append_10) \ + $(am__append_12) $(am__append_14) +CELT_SOURCES_SSE = \ +celt/x86/x86cpu.c \ +celt/x86/x86_celt_map.c \ +celt/x86/pitch_sse.c + +CELT_SOURCES_SSE2 = \ +celt/x86/pitch_sse2.c \ +celt/x86/vq_sse2.c + +CELT_SOURCES_SSE4_1 = \ +celt/x86/celt_lpc_sse4_1.c \ +celt/x86/pitch_sse4_1.c + +CELT_SOURCES_ARM = \ +celt/arm/armcpu.c \ +celt/arm/arm_celt_map.c + +CELT_SOURCES_ARM_ASM = \ +celt/arm/celt_pitch_xcorr_arm.s + +CELT_AM_SOURCES_ARM_ASM = \ +celt/arm/armopts.s.in + +CELT_SOURCES_ARM_NEON_INTR = \ +celt/arm/celt_neon_intr.c \ +celt/arm/pitch_neon_intr.c + +CELT_SOURCES_ARM_NE10 = \ +celt/arm/celt_fft_ne10.c \ +celt/arm/celt_mdct_ne10.c + +SILK_SOURCES = silk/CNG.c silk/code_signs.c silk/init_decoder.c \ + silk/decode_core.c silk/decode_frame.c \ + silk/decode_parameters.c silk/decode_indices.c \ + silk/decode_pulses.c silk/decoder_set_fs.c silk/dec_API.c \ + silk/enc_API.c silk/encode_indices.c silk/encode_pulses.c \ + silk/gain_quant.c silk/interpolate.c silk/LP_variable_cutoff.c \ + silk/NLSF_decode.c silk/NSQ.c silk/NSQ_del_dec.c silk/PLC.c \ + silk/shell_coder.c silk/tables_gain.c silk/tables_LTP.c \ + silk/tables_NLSF_CB_NB_MB.c silk/tables_NLSF_CB_WB.c \ + silk/tables_other.c silk/tables_pitch_lag.c \ + silk/tables_pulses_per_block.c silk/VAD.c \ + silk/control_audio_bandwidth.c silk/quant_LTP_gains.c \ + silk/VQ_WMat_EC.c silk/HP_variable_cutoff.c silk/NLSF_encode.c \ + silk/NLSF_VQ.c silk/NLSF_unpack.c silk/NLSF_del_dec_quant.c \ + silk/process_NLSFs.c silk/stereo_LR_to_MS.c \ + silk/stereo_MS_to_LR.c silk/check_control_input.c \ + silk/control_SNR.c silk/init_encoder.c silk/control_codec.c \ + silk/A2NLSF.c silk/ana_filt_bank_1.c silk/biquad_alt.c \ + silk/bwexpander_32.c silk/bwexpander.c silk/debug.c \ + silk/decode_pitch.c silk/inner_prod_aligned.c silk/lin2log.c \ + silk/log2lin.c silk/LPC_analysis_filter.c \ + silk/LPC_inv_pred_gain.c silk/table_LSF_cos.c silk/NLSF2A.c \ + silk/NLSF_stabilize.c silk/NLSF_VQ_weights_laroia.c \ + silk/pitch_est_tables.c silk/resampler.c \ + silk/resampler_down2_3.c silk/resampler_down2.c \ + silk/resampler_private_AR2.c silk/resampler_private_down_FIR.c \ + silk/resampler_private_IIR_FIR.c \ + silk/resampler_private_up2_HQ.c silk/resampler_rom.c \ + silk/sigm_Q15.c silk/sort.c silk/sum_sqr_shift.c \ + silk/stereo_decode_pred.c silk/stereo_encode_pred.c \ + silk/stereo_find_predictor.c silk/stereo_quant_pred.c \ + silk/LPC_fit.c $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) $(am__append_11) \ + $(am__append_13) +SILK_SOURCES_SSE4_1 = \ +silk/x86/NSQ_sse4_1.c \ +silk/x86/NSQ_del_dec_sse4_1.c \ +silk/x86/x86_silk_map.c \ +silk/x86/VAD_sse4_1.c \ +silk/x86/VQ_WMat_EC_sse4_1.c + +SILK_SOURCES_ARM_NEON_INTR = \ +silk/arm/arm_silk_map.c \ +silk/arm/biquad_alt_neon_intr.c \ +silk/arm/LPC_inv_pred_gain_neon_intr.c \ +silk/arm/NSQ_del_dec_neon_intr.c \ +silk/arm/NSQ_neon.c + +SILK_SOURCES_FIXED = \ +silk/fixed/LTP_analysis_filter_FIX.c \ +silk/fixed/LTP_scale_ctrl_FIX.c \ +silk/fixed/corrMatrix_FIX.c \ +silk/fixed/encode_frame_FIX.c \ +silk/fixed/find_LPC_FIX.c \ +silk/fixed/find_LTP_FIX.c \ +silk/fixed/find_pitch_lags_FIX.c \ +silk/fixed/find_pred_coefs_FIX.c \ +silk/fixed/noise_shape_analysis_FIX.c \ +silk/fixed/process_gains_FIX.c \ +silk/fixed/regularize_correlations_FIX.c \ +silk/fixed/residual_energy16_FIX.c \ +silk/fixed/residual_energy_FIX.c \ +silk/fixed/warped_autocorrelation_FIX.c \ +silk/fixed/apply_sine_window_FIX.c \ +silk/fixed/autocorr_FIX.c \ +silk/fixed/burg_modified_FIX.c \ +silk/fixed/k2a_FIX.c \ +silk/fixed/k2a_Q16_FIX.c \ +silk/fixed/pitch_analysis_core_FIX.c \ +silk/fixed/vector_ops_FIX.c \ +silk/fixed/schur64_FIX.c \ +silk/fixed/schur_FIX.c + +SILK_SOURCES_FIXED_SSE4_1 = \ +silk/fixed/x86/vector_ops_FIX_sse4_1.c \ +silk/fixed/x86/burg_modified_FIX_sse4_1.c + +SILK_SOURCES_FIXED_ARM_NEON_INTR = \ +silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c + +SILK_SOURCES_FLOAT = \ +silk/float/apply_sine_window_FLP.c \ +silk/float/corrMatrix_FLP.c \ +silk/float/encode_frame_FLP.c \ +silk/float/find_LPC_FLP.c \ +silk/float/find_LTP_FLP.c \ +silk/float/find_pitch_lags_FLP.c \ +silk/float/find_pred_coefs_FLP.c \ +silk/float/LPC_analysis_filter_FLP.c \ +silk/float/LTP_analysis_filter_FLP.c \ +silk/float/LTP_scale_ctrl_FLP.c \ +silk/float/noise_shape_analysis_FLP.c \ +silk/float/process_gains_FLP.c \ +silk/float/regularize_correlations_FLP.c \ +silk/float/residual_energy_FLP.c \ +silk/float/warped_autocorrelation_FLP.c \ +silk/float/wrappers_FLP.c \ +silk/float/autocorrelation_FLP.c \ +silk/float/burg_modified_FLP.c \ +silk/float/bwexpander_FLP.c \ +silk/float/energy_FLP.c \ +silk/float/inner_product_FLP.c \ +silk/float/k2a_FLP.c \ +silk/float/LPC_inv_pred_gain_FLP.c \ +silk/float/pitch_analysis_core_FLP.c \ +silk/float/scale_copy_vector_FLP.c \ +silk/float/scale_vector_FLP.c \ +silk/float/schur_FLP.c \ +silk/float/sort_FLP.c + +OPUS_SOURCES = src/opus.c src/opus_decoder.c src/opus_encoder.c \ + src/opus_multistream.c src/opus_multistream_encoder.c \ + src/opus_multistream_decoder.c src/repacketizer.c \ + src/opus_projection_encoder.c src/opus_projection_decoder.c \ + src/mapping_matrix.c $(am__append_6) +OPUS_SOURCES_FLOAT = \ +src/analysis.c \ +src/mlp.c \ +src/mlp_data.c + +@CPU_ARM_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@noinst_LTLIBRARIES = libarmasm.la +@CPU_ARM_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@libarmasm_la_SOURCES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) +@CPU_ARM_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@BUILT_SOURCES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) \ +@CPU_ARM_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@ $(CELT_AM_SOURCES_ARM_ASM:.s.in=.s) \ +@CPU_ARM_TRUE@@OPUS_ARM_EXTERNAL_ASM_TRUE@ $(CELT_AM_SOURCES_ARM_ASM:.s.in=-gnu.S) + +CLEANFILES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) \ + $(CELT_AM_SOURCES_ARM_ASM:.s.in=-gnu.S) + +CELT_HEAD = \ +celt/arch.h \ +celt/bands.h \ +celt/celt.h \ +celt/cpu_support.h \ +include/opus_types.h \ +include/opus_defines.h \ +include/opus_custom.h \ +celt/cwrs.h \ +celt/ecintrin.h \ +celt/entcode.h \ +celt/entdec.h \ +celt/entenc.h \ +celt/fixed_debug.h \ +celt/fixed_generic.h \ +celt/float_cast.h \ +celt/_kiss_fft_guts.h \ +celt/kiss_fft.h \ +celt/laplace.h \ +celt/mathops.h \ +celt/mdct.h \ +celt/mfrngcod.h \ +celt/modes.h \ +celt/os_support.h \ +celt/pitch.h \ +celt/celt_lpc.h \ +celt/x86/celt_lpc_sse.h \ +celt/quant_bands.h \ +celt/rate.h \ +celt/stack_alloc.h \ +celt/vq.h \ +celt/static_modes_float.h \ +celt/static_modes_fixed.h \ +celt/static_modes_float_arm_ne10.h \ +celt/static_modes_fixed_arm_ne10.h \ +celt/arm/armcpu.h \ +celt/arm/fixed_armv4.h \ +celt/arm/fixed_armv5e.h \ +celt/arm/fixed_arm64.h \ +celt/arm/kiss_fft_armv4.h \ +celt/arm/kiss_fft_armv5e.h \ +celt/arm/pitch_arm.h \ +celt/arm/fft_arm.h \ +celt/arm/mdct_arm.h \ +celt/mips/celt_mipsr1.h \ +celt/mips/fixed_generic_mipsr1.h \ +celt/mips/kiss_fft_mipsr1.h \ +celt/mips/mdct_mipsr1.h \ +celt/mips/pitch_mipsr1.h \ +celt/mips/vq_mipsr1.h \ +celt/x86/pitch_sse.h \ +celt/x86/vq_sse.h \ +celt/x86/x86cpu.h + +SILK_HEAD = \ +silk/debug.h \ +silk/control.h \ +silk/errors.h \ +silk/API.h \ +silk/typedef.h \ +silk/define.h \ +silk/main.h \ +silk/x86/main_sse.h \ +silk/PLC.h \ +silk/structs.h \ +silk/tables.h \ +silk/tuning_parameters.h \ +silk/Inlines.h \ +silk/MacroCount.h \ +silk/MacroDebug.h \ +silk/macros.h \ +silk/NSQ.h \ +silk/pitch_est_defines.h \ +silk/resampler_private.h \ +silk/resampler_rom.h \ +silk/resampler_structs.h \ +silk/SigProc_FIX.h \ +silk/x86/SigProc_FIX_sse.h \ +silk/arm/biquad_alt_arm.h \ +silk/arm/LPC_inv_pred_gain_arm.h \ +silk/arm/macros_armv4.h \ +silk/arm/macros_armv5e.h \ +silk/arm/macros_arm64.h \ +silk/arm/SigProc_FIX_armv4.h \ +silk/arm/SigProc_FIX_armv5e.h \ +silk/arm/NSQ_del_dec_arm.h \ +silk/arm/NSQ_neon.h \ +silk/fixed/main_FIX.h \ +silk/fixed/structs_FIX.h \ +silk/fixed/arm/warped_autocorrelation_FIX_arm.h \ +silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h \ +silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h \ +silk/float/main_FLP.h \ +silk/float/structs_FLP.h \ +silk/float/SigProc_FLP.h \ +silk/mips/macros_mipsr1.h \ +silk/mips/NSQ_del_dec_mipsr1.h \ +silk/mips/sigproc_fix_mipsr1.h + +OPUS_HEAD = \ +include/opus.h \ +include/opus_multistream.h \ +include/opus_projection.h \ +src/opus_private.h \ +src/analysis.h \ +src/mapping_matrix.h \ +src/mlp.h \ +src/tansig_table.h + +libopus_la_SOURCES = $(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES) +libopus_la_LDFLAGS = -no-undefined -version-info @OPUS_LT_CURRENT@:@OPUS_LT_REVISION@:@OPUS_LT_AGE@ +libopus_la_LIBADD = $(NE10_LIBS) $(LIBM) $(am__append_15) +pkginclude_HEADERS = include/opus.h include/opus_multistream.h \ + include/opus_types.h include/opus_defines.h \ + include/opus_projection.h $(am__append_22) +noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD) +@EXTRA_PROGRAMS_TRUE@opus_demo_SOURCES = src/opus_demo.c +@EXTRA_PROGRAMS_TRUE@opus_demo_LDADD = libopus.la $(NE10_LIBS) $(LIBM) +@EXTRA_PROGRAMS_TRUE@repacketizer_demo_SOURCES = src/repacketizer_demo.c +@EXTRA_PROGRAMS_TRUE@repacketizer_demo_LDADD = libopus.la $(NE10_LIBS) $(LIBM) +@EXTRA_PROGRAMS_TRUE@opus_compare_SOURCES = src/opus_compare.c +@EXTRA_PROGRAMS_TRUE@opus_compare_LDADD = $(LIBM) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_api_SOURCES = tests/test_opus_api.c tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@tests_test_opus_api_LDADD = libopus.la $(NE10_LIBS) $(LIBM) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_encode_SOURCES = tests/test_opus_encode.c tests/opus_encode_regressions.c tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@tests_test_opus_encode_LDADD = libopus.la $(NE10_LIBS) $(LIBM) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_decode_SOURCES = tests/test_opus_decode.c tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@tests_test_opus_decode_LDADD = libopus.la $(NE10_LIBS) $(LIBM) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_padding_SOURCES = tests/test_opus_padding.c tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@tests_test_opus_padding_LDADD = libopus.la $(NE10_LIBS) $(LIBM) +@EXTRA_PROGRAMS_TRUE@CELT_OBJ = $(CELT_SOURCES:.c=.lo) +@EXTRA_PROGRAMS_TRUE@SILK_OBJ = $(SILK_SOURCES:.c=.lo) +@EXTRA_PROGRAMS_TRUE@OPUS_OBJ = $(OPUS_SOURCES:.c=.lo) +@EXTRA_PROGRAMS_TRUE@tests_test_opus_projection_SOURCES = tests/test_opus_projection.c tests/test_opus_common.h +@EXTRA_PROGRAMS_TRUE@tests_test_opus_projection_LDADD = $(OPUS_OBJ) \ +@EXTRA_PROGRAMS_TRUE@ $(SILK_OBJ) $(CELT_OBJ) $(NE10_LIBS) \ +@EXTRA_PROGRAMS_TRUE@ $(LIBM) $(am__append_16) +@EXTRA_PROGRAMS_TRUE@silk_tests_test_unit_LPC_inv_pred_gain_SOURCES = silk/tests/test_unit_LPC_inv_pred_gain.c +@EXTRA_PROGRAMS_TRUE@silk_tests_test_unit_LPC_inv_pred_gain_LDADD = \ +@EXTRA_PROGRAMS_TRUE@ $(SILK_OBJ) $(CELT_OBJ) $(NE10_LIBS) \ +@EXTRA_PROGRAMS_TRUE@ $(LIBM) $(am__append_17) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_cwrs32_SOURCES = celt/tests/test_unit_cwrs32.c +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_cwrs32_LDADD = $(LIBM) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_dft_SOURCES = celt/tests/test_unit_dft.c +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_dft_LDADD = $(CELT_OBJ) \ +@EXTRA_PROGRAMS_TRUE@ $(NE10_LIBS) $(LIBM) $(am__append_18) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_entropy_SOURCES = celt/tests/test_unit_entropy.c +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_entropy_LDADD = $(LIBM) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_laplace_SOURCES = celt/tests/test_unit_laplace.c +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_laplace_LDADD = $(LIBM) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_mathops_SOURCES = celt/tests/test_unit_mathops.c +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_mathops_LDADD = $(CELT_OBJ) \ +@EXTRA_PROGRAMS_TRUE@ $(NE10_LIBS) $(LIBM) $(am__append_19) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_mdct_SOURCES = celt/tests/test_unit_mdct.c +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_mdct_LDADD = $(CELT_OBJ) \ +@EXTRA_PROGRAMS_TRUE@ $(NE10_LIBS) $(LIBM) $(am__append_20) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_rotation_SOURCES = celt/tests/test_unit_rotation.c +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_rotation_LDADD = \ +@EXTRA_PROGRAMS_TRUE@ $(CELT_OBJ) $(NE10_LIBS) $(LIBM) \ +@EXTRA_PROGRAMS_TRUE@ $(am__append_21) +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_types_SOURCES = celt/tests/test_unit_types.c +@EXTRA_PROGRAMS_TRUE@celt_tests_test_unit_types_LDADD = $(LIBM) +@CUSTOM_MODES_TRUE@@EXTRA_PROGRAMS_TRUE@opus_custom_demo_SOURCES = celt/opus_custom_demo.c +@CUSTOM_MODES_TRUE@@EXTRA_PROGRAMS_TRUE@opus_custom_demo_LDADD = libopus.la $(LIBM) +EXTRA_DIST = opus.pc.in \ + opus-uninstalled.pc.in \ + opus.m4 \ + Makefile.mips \ + Makefile.unix \ + CMakeLists.txt \ + config.h.cmake.in \ + opus_buildtype.cmake \ + opus_config.cmake \ + opus_functions.cmake \ + opus_sources.cmake \ + OpusConfig.cmake.in \ + tests/run_vectors.sh \ + celt/arm/arm2gnu.pl \ + celt/arm/celt_pitch_xcorr_arm.s \ + win32/VS2015/opus.vcxproj \ + win32/VS2015/test_opus_encode.vcxproj.filters \ + win32/VS2015/test_opus_encode.vcxproj \ + win32/VS2015/opus_demo.vcxproj \ + win32/VS2015/test_opus_api.vcxproj.filters \ + win32/VS2015/test_opus_api.vcxproj \ + win32/VS2015/test_opus_decode.vcxproj.filters \ + win32/VS2015/opus_demo.vcxproj.filters \ + win32/VS2015/opus.vcxproj.filters \ + win32/VS2015/test_opus_decode.vcxproj \ + win32/VS2015/opus.sln \ + win32/VS2015/common.props \ + win32/genversion.bat \ + win32/config.h + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = opus.pc +m4datadir = $(datadir)/aclocal +m4data_DATA = opus.m4 +OPT_UNIT_TEST_OBJ = $(celt_tests_test_unit_mathops_SOURCES:.c=.o) \ + $(celt_tests_test_unit_rotation_SOURCES:.c=.o) \ + $(celt_tests_test_unit_mdct_SOURCES:.c=.o) \ + $(celt_tests_test_unit_dft_SOURCES:.c=.o) \ + $(silk_tests_test_unit_LPC_inv_pred_gain_SOURCES:.c=.o) + +@HAVE_SSE_TRUE@SSE_OBJ = $(CELT_SOURCES_SSE:.c=.lo) +@HAVE_SSE2_TRUE@SSE2_OBJ = $(CELT_SOURCES_SSE2:.c=.lo) +@HAVE_SSE4_1_TRUE@SSE4_1_OBJ = $(CELT_SOURCES_SSE4_1:.c=.lo) \ +@HAVE_SSE4_1_TRUE@ $(SILK_SOURCES_SSE4_1:.c=.lo) \ +@HAVE_SSE4_1_TRUE@ $(SILK_SOURCES_FIXED_SSE4_1:.c=.lo) + +@HAVE_ARM_NEON_INTR_TRUE@ARM_NEON_INTR_OBJ = $(CELT_SOURCES_ARM_NEON_INTR:.c=.lo) \ +@HAVE_ARM_NEON_INTR_TRUE@ $(SILK_SOURCES_ARM_NEON_INTR:.c=.lo) \ +@HAVE_ARM_NEON_INTR_TRUE@ $(SILK_SOURCES_FIXED_ARM_NEON_INTR:.c=.lo) + +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .S .c .lo .log .o .obj .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/celt_sources.mk $(srcdir)/silk_sources.mk $(srcdir)/opus_sources.mk $(srcdir)/celt_headers.mk $(srcdir)/silk_headers.mk $(srcdir)/opus_headers.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/celt_sources.mk $(srcdir)/silk_sources.mk $(srcdir)/opus_sources.mk $(srcdir)/celt_headers.mk $(srcdir)/silk_headers.mk $(srcdir)/opus_headers.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +opus.pc: $(top_builddir)/config.status $(srcdir)/opus.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +opus-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/opus-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +celt/arm/armopts.s: $(top_builddir)/config.status $(top_srcdir)/celt/arm/armopts.s.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +celt/arm/$(am__dirstamp): + @$(MKDIR_P) celt/arm + @: > celt/arm/$(am__dirstamp) +celt/arm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) celt/arm/$(DEPDIR) + @: > celt/arm/$(DEPDIR)/$(am__dirstamp) +celt/arm/celt_pitch_xcorr_arm-gnu.lo: celt/arm/$(am__dirstamp) \ + celt/arm/$(DEPDIR)/$(am__dirstamp) + +libarmasm.la: $(libarmasm_la_OBJECTS) $(libarmasm_la_DEPENDENCIES) $(EXTRA_libarmasm_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libarmasm_la_rpath) $(libarmasm_la_OBJECTS) $(libarmasm_la_LIBADD) $(LIBS) +celt/$(am__dirstamp): + @$(MKDIR_P) celt + @: > celt/$(am__dirstamp) +celt/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) celt/$(DEPDIR) + @: > celt/$(DEPDIR)/$(am__dirstamp) +celt/bands.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/celt.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/celt_encoder.lo: celt/$(am__dirstamp) \ + celt/$(DEPDIR)/$(am__dirstamp) +celt/celt_decoder.lo: celt/$(am__dirstamp) \ + celt/$(DEPDIR)/$(am__dirstamp) +celt/cwrs.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/entcode.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/entdec.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/entenc.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/kiss_fft.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/laplace.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/mathops.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/mdct.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/modes.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/pitch.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/celt_lpc.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/quant_bands.lo: celt/$(am__dirstamp) \ + celt/$(DEPDIR)/$(am__dirstamp) +celt/rate.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/vq.lo: celt/$(am__dirstamp) celt/$(DEPDIR)/$(am__dirstamp) +celt/x86/$(am__dirstamp): + @$(MKDIR_P) celt/x86 + @: > celt/x86/$(am__dirstamp) +celt/x86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) celt/x86/$(DEPDIR) + @: > celt/x86/$(DEPDIR)/$(am__dirstamp) +celt/x86/x86cpu.lo: celt/x86/$(am__dirstamp) \ + celt/x86/$(DEPDIR)/$(am__dirstamp) +celt/x86/x86_celt_map.lo: celt/x86/$(am__dirstamp) \ + celt/x86/$(DEPDIR)/$(am__dirstamp) +celt/x86/pitch_sse.lo: celt/x86/$(am__dirstamp) \ + celt/x86/$(DEPDIR)/$(am__dirstamp) +celt/x86/pitch_sse2.lo: celt/x86/$(am__dirstamp) \ + celt/x86/$(DEPDIR)/$(am__dirstamp) +celt/x86/vq_sse2.lo: celt/x86/$(am__dirstamp) \ + celt/x86/$(DEPDIR)/$(am__dirstamp) +celt/x86/celt_lpc_sse4_1.lo: celt/x86/$(am__dirstamp) \ + celt/x86/$(DEPDIR)/$(am__dirstamp) +celt/x86/pitch_sse4_1.lo: celt/x86/$(am__dirstamp) \ + celt/x86/$(DEPDIR)/$(am__dirstamp) +celt/arm/armcpu.lo: celt/arm/$(am__dirstamp) \ + celt/arm/$(DEPDIR)/$(am__dirstamp) +celt/arm/arm_celt_map.lo: celt/arm/$(am__dirstamp) \ + celt/arm/$(DEPDIR)/$(am__dirstamp) +celt/arm/celt_neon_intr.lo: celt/arm/$(am__dirstamp) \ + celt/arm/$(DEPDIR)/$(am__dirstamp) +celt/arm/pitch_neon_intr.lo: celt/arm/$(am__dirstamp) \ + celt/arm/$(DEPDIR)/$(am__dirstamp) +celt/arm/celt_fft_ne10.lo: celt/arm/$(am__dirstamp) \ + celt/arm/$(DEPDIR)/$(am__dirstamp) +celt/arm/celt_mdct_ne10.lo: celt/arm/$(am__dirstamp) \ + celt/arm/$(DEPDIR)/$(am__dirstamp) +silk/$(am__dirstamp): + @$(MKDIR_P) silk + @: > silk/$(am__dirstamp) +silk/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) silk/$(DEPDIR) + @: > silk/$(DEPDIR)/$(am__dirstamp) +silk/CNG.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/code_signs.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/init_decoder.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/decode_core.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/decode_frame.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/decode_parameters.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/decode_indices.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/decode_pulses.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/decoder_set_fs.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/dec_API.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/enc_API.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/encode_indices.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/encode_pulses.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/gain_quant.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/interpolate.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/LP_variable_cutoff.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/NLSF_decode.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/NSQ.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/NSQ_del_dec.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/PLC.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/shell_coder.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/tables_gain.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/tables_LTP.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/tables_NLSF_CB_NB_MB.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/tables_NLSF_CB_WB.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/tables_other.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/tables_pitch_lag.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/tables_pulses_per_block.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/VAD.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/control_audio_bandwidth.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/quant_LTP_gains.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/VQ_WMat_EC.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/HP_variable_cutoff.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/NLSF_encode.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/NLSF_VQ.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/NLSF_unpack.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/NLSF_del_dec_quant.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/process_NLSFs.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/stereo_LR_to_MS.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/stereo_MS_to_LR.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/check_control_input.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/control_SNR.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/init_encoder.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/control_codec.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/A2NLSF.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/ana_filt_bank_1.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/biquad_alt.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/bwexpander_32.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/bwexpander.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/debug.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/decode_pitch.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/inner_prod_aligned.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/lin2log.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/log2lin.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/LPC_analysis_filter.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/LPC_inv_pred_gain.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/table_LSF_cos.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/NLSF2A.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/NLSF_stabilize.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/NLSF_VQ_weights_laroia.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/pitch_est_tables.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/resampler.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/resampler_down2_3.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/resampler_down2.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/resampler_private_AR2.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/resampler_private_down_FIR.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/resampler_private_IIR_FIR.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/resampler_private_up2_HQ.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/resampler_rom.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/sigm_Q15.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/sort.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/sum_sqr_shift.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/stereo_decode_pred.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/stereo_encode_pred.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/stereo_find_predictor.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/stereo_quant_pred.lo: silk/$(am__dirstamp) \ + silk/$(DEPDIR)/$(am__dirstamp) +silk/LPC_fit.lo: silk/$(am__dirstamp) silk/$(DEPDIR)/$(am__dirstamp) +silk/fixed/$(am__dirstamp): + @$(MKDIR_P) silk/fixed + @: > silk/fixed/$(am__dirstamp) +silk/fixed/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) silk/fixed/$(DEPDIR) + @: > silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/LTP_analysis_filter_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/LTP_scale_ctrl_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/corrMatrix_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/encode_frame_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/find_LPC_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/find_LTP_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/find_pitch_lags_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/find_pred_coefs_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/noise_shape_analysis_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/process_gains_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/regularize_correlations_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/residual_energy16_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/residual_energy_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/warped_autocorrelation_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/apply_sine_window_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/autocorr_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/burg_modified_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/k2a_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/k2a_Q16_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/pitch_analysis_core_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/vector_ops_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/schur64_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/fixed/schur_FIX.lo: silk/fixed/$(am__dirstamp) \ + silk/fixed/$(DEPDIR)/$(am__dirstamp) +silk/x86/$(am__dirstamp): + @$(MKDIR_P) silk/x86 + @: > silk/x86/$(am__dirstamp) +silk/x86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) silk/x86/$(DEPDIR) + @: > silk/x86/$(DEPDIR)/$(am__dirstamp) +silk/x86/NSQ_sse4_1.lo: silk/x86/$(am__dirstamp) \ + silk/x86/$(DEPDIR)/$(am__dirstamp) +silk/x86/NSQ_del_dec_sse4_1.lo: silk/x86/$(am__dirstamp) \ + silk/x86/$(DEPDIR)/$(am__dirstamp) +silk/x86/x86_silk_map.lo: silk/x86/$(am__dirstamp) \ + silk/x86/$(DEPDIR)/$(am__dirstamp) +silk/x86/VAD_sse4_1.lo: silk/x86/$(am__dirstamp) \ + silk/x86/$(DEPDIR)/$(am__dirstamp) +silk/x86/VQ_WMat_EC_sse4_1.lo: silk/x86/$(am__dirstamp) \ + silk/x86/$(DEPDIR)/$(am__dirstamp) +silk/fixed/x86/$(am__dirstamp): + @$(MKDIR_P) silk/fixed/x86 + @: > silk/fixed/x86/$(am__dirstamp) +silk/fixed/x86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) silk/fixed/x86/$(DEPDIR) + @: > silk/fixed/x86/$(DEPDIR)/$(am__dirstamp) +silk/fixed/x86/vector_ops_FIX_sse4_1.lo: \ + silk/fixed/x86/$(am__dirstamp) \ + silk/fixed/x86/$(DEPDIR)/$(am__dirstamp) +silk/fixed/x86/burg_modified_FIX_sse4_1.lo: \ + silk/fixed/x86/$(am__dirstamp) \ + silk/fixed/x86/$(DEPDIR)/$(am__dirstamp) +silk/fixed/arm/$(am__dirstamp): + @$(MKDIR_P) silk/fixed/arm + @: > silk/fixed/arm/$(am__dirstamp) +silk/fixed/arm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) silk/fixed/arm/$(DEPDIR) + @: > silk/fixed/arm/$(DEPDIR)/$(am__dirstamp) +silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.lo: \ + silk/fixed/arm/$(am__dirstamp) \ + silk/fixed/arm/$(DEPDIR)/$(am__dirstamp) +silk/float/$(am__dirstamp): + @$(MKDIR_P) silk/float + @: > silk/float/$(am__dirstamp) +silk/float/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) silk/float/$(DEPDIR) + @: > silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/apply_sine_window_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/corrMatrix_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/encode_frame_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/find_LPC_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/find_LTP_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/find_pitch_lags_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/find_pred_coefs_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/LPC_analysis_filter_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/LTP_analysis_filter_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/LTP_scale_ctrl_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/noise_shape_analysis_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/process_gains_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/regularize_correlations_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/residual_energy_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/warped_autocorrelation_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/wrappers_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/autocorrelation_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/burg_modified_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/bwexpander_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/energy_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/inner_product_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/k2a_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/LPC_inv_pred_gain_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/pitch_analysis_core_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/scale_copy_vector_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/scale_vector_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/schur_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/float/sort_FLP.lo: silk/float/$(am__dirstamp) \ + silk/float/$(DEPDIR)/$(am__dirstamp) +silk/arm/$(am__dirstamp): + @$(MKDIR_P) silk/arm + @: > silk/arm/$(am__dirstamp) +silk/arm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) silk/arm/$(DEPDIR) + @: > silk/arm/$(DEPDIR)/$(am__dirstamp) +silk/arm/arm_silk_map.lo: silk/arm/$(am__dirstamp) \ + silk/arm/$(DEPDIR)/$(am__dirstamp) +silk/arm/biquad_alt_neon_intr.lo: silk/arm/$(am__dirstamp) \ + silk/arm/$(DEPDIR)/$(am__dirstamp) +silk/arm/LPC_inv_pred_gain_neon_intr.lo: silk/arm/$(am__dirstamp) \ + silk/arm/$(DEPDIR)/$(am__dirstamp) +silk/arm/NSQ_del_dec_neon_intr.lo: silk/arm/$(am__dirstamp) \ + silk/arm/$(DEPDIR)/$(am__dirstamp) +silk/arm/NSQ_neon.lo: silk/arm/$(am__dirstamp) \ + silk/arm/$(DEPDIR)/$(am__dirstamp) +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/opus.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/opus_decoder.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/opus_encoder.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/opus_multistream.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/opus_multistream_encoder.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/opus_multistream_decoder.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/repacketizer.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/opus_projection_encoder.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/opus_projection_decoder.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/mapping_matrix.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/analysis.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/mlp.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/mlp_data.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) + +libopus.la: $(libopus_la_OBJECTS) $(libopus_la_DEPENDENCIES) $(EXTRA_libopus_la_DEPENDENCIES) + $(AM_V_CCLD)$(libopus_la_LINK) -rpath $(libdir) $(libopus_la_OBJECTS) $(libopus_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +celt/tests/$(am__dirstamp): + @$(MKDIR_P) celt/tests + @: > celt/tests/$(am__dirstamp) +celt/tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) celt/tests/$(DEPDIR) + @: > celt/tests/$(DEPDIR)/$(am__dirstamp) +celt/tests/test_unit_cwrs32.$(OBJEXT): celt/tests/$(am__dirstamp) \ + celt/tests/$(DEPDIR)/$(am__dirstamp) + +celt/tests/test_unit_cwrs32$(EXEEXT): $(celt_tests_test_unit_cwrs32_OBJECTS) $(celt_tests_test_unit_cwrs32_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_cwrs32_DEPENDENCIES) celt/tests/$(am__dirstamp) + @rm -f celt/tests/test_unit_cwrs32$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_cwrs32_OBJECTS) $(celt_tests_test_unit_cwrs32_LDADD) $(LIBS) +celt/tests/test_unit_dft.$(OBJEXT): celt/tests/$(am__dirstamp) \ + celt/tests/$(DEPDIR)/$(am__dirstamp) + +celt/tests/test_unit_dft$(EXEEXT): $(celt_tests_test_unit_dft_OBJECTS) $(celt_tests_test_unit_dft_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_dft_DEPENDENCIES) celt/tests/$(am__dirstamp) + @rm -f celt/tests/test_unit_dft$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_dft_OBJECTS) $(celt_tests_test_unit_dft_LDADD) $(LIBS) +celt/tests/test_unit_entropy.$(OBJEXT): celt/tests/$(am__dirstamp) \ + celt/tests/$(DEPDIR)/$(am__dirstamp) + +celt/tests/test_unit_entropy$(EXEEXT): $(celt_tests_test_unit_entropy_OBJECTS) $(celt_tests_test_unit_entropy_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_entropy_DEPENDENCIES) celt/tests/$(am__dirstamp) + @rm -f celt/tests/test_unit_entropy$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_entropy_OBJECTS) $(celt_tests_test_unit_entropy_LDADD) $(LIBS) +celt/tests/test_unit_laplace.$(OBJEXT): celt/tests/$(am__dirstamp) \ + celt/tests/$(DEPDIR)/$(am__dirstamp) + +celt/tests/test_unit_laplace$(EXEEXT): $(celt_tests_test_unit_laplace_OBJECTS) $(celt_tests_test_unit_laplace_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_laplace_DEPENDENCIES) celt/tests/$(am__dirstamp) + @rm -f celt/tests/test_unit_laplace$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_laplace_OBJECTS) $(celt_tests_test_unit_laplace_LDADD) $(LIBS) +celt/tests/test_unit_mathops.$(OBJEXT): celt/tests/$(am__dirstamp) \ + celt/tests/$(DEPDIR)/$(am__dirstamp) + +celt/tests/test_unit_mathops$(EXEEXT): $(celt_tests_test_unit_mathops_OBJECTS) $(celt_tests_test_unit_mathops_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_mathops_DEPENDENCIES) celt/tests/$(am__dirstamp) + @rm -f celt/tests/test_unit_mathops$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_mathops_OBJECTS) $(celt_tests_test_unit_mathops_LDADD) $(LIBS) +celt/tests/test_unit_mdct.$(OBJEXT): celt/tests/$(am__dirstamp) \ + celt/tests/$(DEPDIR)/$(am__dirstamp) + +celt/tests/test_unit_mdct$(EXEEXT): $(celt_tests_test_unit_mdct_OBJECTS) $(celt_tests_test_unit_mdct_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_mdct_DEPENDENCIES) celt/tests/$(am__dirstamp) + @rm -f celt/tests/test_unit_mdct$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_mdct_OBJECTS) $(celt_tests_test_unit_mdct_LDADD) $(LIBS) +celt/tests/test_unit_rotation.$(OBJEXT): celt/tests/$(am__dirstamp) \ + celt/tests/$(DEPDIR)/$(am__dirstamp) + +celt/tests/test_unit_rotation$(EXEEXT): $(celt_tests_test_unit_rotation_OBJECTS) $(celt_tests_test_unit_rotation_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_rotation_DEPENDENCIES) celt/tests/$(am__dirstamp) + @rm -f celt/tests/test_unit_rotation$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_rotation_OBJECTS) $(celt_tests_test_unit_rotation_LDADD) $(LIBS) +celt/tests/test_unit_types.$(OBJEXT): celt/tests/$(am__dirstamp) \ + celt/tests/$(DEPDIR)/$(am__dirstamp) + +celt/tests/test_unit_types$(EXEEXT): $(celt_tests_test_unit_types_OBJECTS) $(celt_tests_test_unit_types_DEPENDENCIES) $(EXTRA_celt_tests_test_unit_types_DEPENDENCIES) celt/tests/$(am__dirstamp) + @rm -f celt/tests/test_unit_types$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(celt_tests_test_unit_types_OBJECTS) $(celt_tests_test_unit_types_LDADD) $(LIBS) +src/opus_compare.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +opus_compare$(EXEEXT): $(opus_compare_OBJECTS) $(opus_compare_DEPENDENCIES) $(EXTRA_opus_compare_DEPENDENCIES) + @rm -f opus_compare$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(opus_compare_OBJECTS) $(opus_compare_LDADD) $(LIBS) +celt/opus_custom_demo.$(OBJEXT): celt/$(am__dirstamp) \ + celt/$(DEPDIR)/$(am__dirstamp) + +opus_custom_demo$(EXEEXT): $(opus_custom_demo_OBJECTS) $(opus_custom_demo_DEPENDENCIES) $(EXTRA_opus_custom_demo_DEPENDENCIES) + @rm -f opus_custom_demo$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(opus_custom_demo_OBJECTS) $(opus_custom_demo_LDADD) $(LIBS) +src/opus_demo.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +opus_demo$(EXEEXT): $(opus_demo_OBJECTS) $(opus_demo_DEPENDENCIES) $(EXTRA_opus_demo_DEPENDENCIES) + @rm -f opus_demo$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(opus_demo_OBJECTS) $(opus_demo_LDADD) $(LIBS) +src/repacketizer_demo.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +repacketizer_demo$(EXEEXT): $(repacketizer_demo_OBJECTS) $(repacketizer_demo_DEPENDENCIES) $(EXTRA_repacketizer_demo_DEPENDENCIES) + @rm -f repacketizer_demo$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(repacketizer_demo_OBJECTS) $(repacketizer_demo_LDADD) $(LIBS) +silk/tests/$(am__dirstamp): + @$(MKDIR_P) silk/tests + @: > silk/tests/$(am__dirstamp) +silk/tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) silk/tests/$(DEPDIR) + @: > silk/tests/$(DEPDIR)/$(am__dirstamp) +silk/tests/test_unit_LPC_inv_pred_gain.$(OBJEXT): \ + silk/tests/$(am__dirstamp) \ + silk/tests/$(DEPDIR)/$(am__dirstamp) + +silk/tests/test_unit_LPC_inv_pred_gain$(EXEEXT): $(silk_tests_test_unit_LPC_inv_pred_gain_OBJECTS) $(silk_tests_test_unit_LPC_inv_pred_gain_DEPENDENCIES) $(EXTRA_silk_tests_test_unit_LPC_inv_pred_gain_DEPENDENCIES) silk/tests/$(am__dirstamp) + @rm -f silk/tests/test_unit_LPC_inv_pred_gain$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(silk_tests_test_unit_LPC_inv_pred_gain_OBJECTS) $(silk_tests_test_unit_LPC_inv_pred_gain_LDADD) $(LIBS) +tests/$(am__dirstamp): + @$(MKDIR_P) tests + @: > tests/$(am__dirstamp) +tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) tests/$(DEPDIR) + @: > tests/$(DEPDIR)/$(am__dirstamp) +tests/test_opus_api.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/test_opus_api$(EXEEXT): $(tests_test_opus_api_OBJECTS) $(tests_test_opus_api_DEPENDENCIES) $(EXTRA_tests_test_opus_api_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/test_opus_api$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_test_opus_api_OBJECTS) $(tests_test_opus_api_LDADD) $(LIBS) +tests/test_opus_decode.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/test_opus_decode$(EXEEXT): $(tests_test_opus_decode_OBJECTS) $(tests_test_opus_decode_DEPENDENCIES) $(EXTRA_tests_test_opus_decode_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/test_opus_decode$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_test_opus_decode_OBJECTS) $(tests_test_opus_decode_LDADD) $(LIBS) +tests/test_opus_encode.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) +tests/opus_encode_regressions.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/test_opus_encode$(EXEEXT): $(tests_test_opus_encode_OBJECTS) $(tests_test_opus_encode_DEPENDENCIES) $(EXTRA_tests_test_opus_encode_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/test_opus_encode$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_test_opus_encode_OBJECTS) $(tests_test_opus_encode_LDADD) $(LIBS) +tests/test_opus_padding.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/test_opus_padding$(EXEEXT): $(tests_test_opus_padding_OBJECTS) $(tests_test_opus_padding_DEPENDENCIES) $(EXTRA_tests_test_opus_padding_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/test_opus_padding$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_test_opus_padding_OBJECTS) $(tests_test_opus_padding_LDADD) $(LIBS) +tests/test_opus_projection.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/test_opus_projection$(EXEEXT): $(tests_test_opus_projection_OBJECTS) $(tests_test_opus_projection_DEPENDENCIES) $(EXTRA_tests_test_opus_projection_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/test_opus_projection$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_test_opus_projection_OBJECTS) $(tests_test_opus_projection_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f celt/*.$(OBJEXT) + -rm -f celt/*.lo + -rm -f celt/arm/*.$(OBJEXT) + -rm -f celt/arm/*.lo + -rm -f celt/tests/*.$(OBJEXT) + -rm -f celt/x86/*.$(OBJEXT) + -rm -f celt/x86/*.lo + -rm -f silk/*.$(OBJEXT) + -rm -f silk/*.lo + -rm -f silk/arm/*.$(OBJEXT) + -rm -f silk/arm/*.lo + -rm -f silk/fixed/*.$(OBJEXT) + -rm -f silk/fixed/*.lo + -rm -f silk/fixed/arm/*.$(OBJEXT) + -rm -f silk/fixed/arm/*.lo + -rm -f silk/fixed/x86/*.$(OBJEXT) + -rm -f silk/fixed/x86/*.lo + -rm -f silk/float/*.$(OBJEXT) + -rm -f silk/float/*.lo + -rm -f silk/tests/*.$(OBJEXT) + -rm -f silk/x86/*.$(OBJEXT) + -rm -f silk/x86/*.lo + -rm -f src/*.$(OBJEXT) + -rm -f src/*.lo + -rm -f tests/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/bands.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/celt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/celt_decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/celt_encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/celt_lpc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/cwrs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/entcode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/entdec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/entenc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/kiss_fft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/laplace.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/mathops.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/mdct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/modes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/opus_custom_demo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/pitch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/quant_bands.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/rate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/$(DEPDIR)/vq.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/arm/$(DEPDIR)/arm_celt_map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/arm/$(DEPDIR)/armcpu.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/arm/$(DEPDIR)/celt_fft_ne10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/arm/$(DEPDIR)/celt_mdct_ne10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/arm/$(DEPDIR)/celt_neon_intr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/arm/$(DEPDIR)/celt_pitch_xcorr_arm-gnu.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/arm/$(DEPDIR)/pitch_neon_intr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_cwrs32.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_dft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_entropy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_laplace.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_mathops.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_mdct.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_rotation.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/tests/$(DEPDIR)/test_unit_types.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/x86/$(DEPDIR)/celt_lpc_sse4_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/x86/$(DEPDIR)/pitch_sse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/x86/$(DEPDIR)/pitch_sse2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/x86/$(DEPDIR)/pitch_sse4_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/x86/$(DEPDIR)/vq_sse2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/x86/$(DEPDIR)/x86_celt_map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@celt/x86/$(DEPDIR)/x86cpu.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/A2NLSF.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/CNG.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/HP_variable_cutoff.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/LPC_analysis_filter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/LPC_fit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/LPC_inv_pred_gain.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/LP_variable_cutoff.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF2A.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_VQ.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_VQ_weights_laroia.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_decode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_del_dec_quant.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_encode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_stabilize.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NLSF_unpack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NSQ.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/NSQ_del_dec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/PLC.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/VAD.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/VQ_WMat_EC.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/ana_filt_bank_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/biquad_alt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/bwexpander.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/bwexpander_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/check_control_input.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/code_signs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/control_SNR.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/control_audio_bandwidth.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/control_codec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/dec_API.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_core.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_frame.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_indices.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_parameters.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_pitch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decode_pulses.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/decoder_set_fs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/enc_API.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/encode_indices.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/encode_pulses.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/gain_quant.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/init_decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/init_encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/inner_prod_aligned.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/interpolate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/lin2log.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/log2lin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/pitch_est_tables.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/process_NLSFs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/quant_LTP_gains.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_down2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_down2_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_private_AR2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_private_IIR_FIR.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_private_down_FIR.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_private_up2_HQ.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/resampler_rom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/shell_coder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/sigm_Q15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/sort.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_LR_to_MS.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_MS_to_LR.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_decode_pred.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_encode_pred.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_find_predictor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/stereo_quant_pred.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/sum_sqr_shift.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/table_LSF_cos.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_LTP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_NLSF_CB_NB_MB.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_NLSF_CB_WB.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_gain.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_other.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_pitch_lag.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/$(DEPDIR)/tables_pulses_per_block.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/arm/$(DEPDIR)/LPC_inv_pred_gain_neon_intr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/arm/$(DEPDIR)/NSQ_del_dec_neon_intr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/arm/$(DEPDIR)/NSQ_neon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/arm/$(DEPDIR)/arm_silk_map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/arm/$(DEPDIR)/biquad_alt_neon_intr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/LTP_analysis_filter_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/LTP_scale_ctrl_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/apply_sine_window_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/autocorr_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/burg_modified_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/corrMatrix_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/encode_frame_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/find_LPC_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/find_LTP_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/find_pitch_lags_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/find_pred_coefs_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/k2a_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/k2a_Q16_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/noise_shape_analysis_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/pitch_analysis_core_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/process_gains_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/regularize_correlations_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/residual_energy16_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/residual_energy_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/schur64_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/schur_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/vector_ops_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/$(DEPDIR)/warped_autocorrelation_FIX.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/arm/$(DEPDIR)/warped_autocorrelation_FIX_neon_intr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/x86/$(DEPDIR)/burg_modified_FIX_sse4_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/fixed/x86/$(DEPDIR)/vector_ops_FIX_sse4_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/LPC_analysis_filter_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/LPC_inv_pred_gain_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/LTP_analysis_filter_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/LTP_scale_ctrl_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/apply_sine_window_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/autocorrelation_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/burg_modified_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/bwexpander_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/corrMatrix_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/encode_frame_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/energy_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/find_LPC_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/find_LTP_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/find_pitch_lags_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/find_pred_coefs_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/inner_product_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/k2a_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/noise_shape_analysis_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/pitch_analysis_core_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/process_gains_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/regularize_correlations_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/residual_energy_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/scale_copy_vector_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/scale_vector_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/schur_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/sort_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/warped_autocorrelation_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/float/$(DEPDIR)/wrappers_FLP.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/tests/$(DEPDIR)/test_unit_LPC_inv_pred_gain.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/x86/$(DEPDIR)/NSQ_del_dec_sse4_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/x86/$(DEPDIR)/NSQ_sse4_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/x86/$(DEPDIR)/VAD_sse4_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/x86/$(DEPDIR)/VQ_WMat_EC_sse4_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@silk/x86/$(DEPDIR)/x86_silk_map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/analysis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/mapping_matrix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/mlp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/mlp_data.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_compare.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_demo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_multistream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_multistream_decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_multistream_encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_projection_decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opus_projection_encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/repacketizer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/repacketizer_demo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/opus_encode_regressions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_opus_api.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_opus_decode.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_opus_encode.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_opus_padding.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/test_opus_projection.Po@am__quote@ + +.S.o: +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $< + +.S.obj: +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.S.lo: +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCCAS_TRUE@ $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(LTCPPASCOMPILE) -c -o $@ $< + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf celt/.libs celt/_libs + -rm -rf celt/arm/.libs celt/arm/_libs + -rm -rf celt/tests/.libs celt/tests/_libs + -rm -rf celt/x86/.libs celt/x86/_libs + -rm -rf silk/.libs silk/_libs + -rm -rf silk/arm/.libs silk/arm/_libs + -rm -rf silk/fixed/.libs silk/fixed/_libs + -rm -rf silk/fixed/arm/.libs silk/fixed/arm/_libs + -rm -rf silk/fixed/x86/.libs silk/fixed/x86/_libs + -rm -rf silk/float/.libs silk/float/_libs + -rm -rf silk/tests/.libs silk/tests/_libs + -rm -rf silk/x86/.libs silk/x86/_libs + -rm -rf src/.libs src/_libs + -rm -rf tests/.libs tests/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-m4dataDATA: $(m4data_DATA) + @$(NORMAL_INSTALL) + @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(m4datadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(m4datadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \ + done + +uninstall-m4dataDATA: + @$(NORMAL_UNINSTALL) + @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +celt/tests/test_unit_cwrs32.log: celt/tests/test_unit_cwrs32$(EXEEXT) + @p='celt/tests/test_unit_cwrs32$(EXEEXT)'; \ + b='celt/tests/test_unit_cwrs32'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +celt/tests/test_unit_dft.log: celt/tests/test_unit_dft$(EXEEXT) + @p='celt/tests/test_unit_dft$(EXEEXT)'; \ + b='celt/tests/test_unit_dft'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +celt/tests/test_unit_entropy.log: celt/tests/test_unit_entropy$(EXEEXT) + @p='celt/tests/test_unit_entropy$(EXEEXT)'; \ + b='celt/tests/test_unit_entropy'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +celt/tests/test_unit_laplace.log: celt/tests/test_unit_laplace$(EXEEXT) + @p='celt/tests/test_unit_laplace$(EXEEXT)'; \ + b='celt/tests/test_unit_laplace'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +celt/tests/test_unit_mathops.log: celt/tests/test_unit_mathops$(EXEEXT) + @p='celt/tests/test_unit_mathops$(EXEEXT)'; \ + b='celt/tests/test_unit_mathops'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +celt/tests/test_unit_mdct.log: celt/tests/test_unit_mdct$(EXEEXT) + @p='celt/tests/test_unit_mdct$(EXEEXT)'; \ + b='celt/tests/test_unit_mdct'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +celt/tests/test_unit_rotation.log: celt/tests/test_unit_rotation$(EXEEXT) + @p='celt/tests/test_unit_rotation$(EXEEXT)'; \ + b='celt/tests/test_unit_rotation'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +celt/tests/test_unit_types.log: celt/tests/test_unit_types$(EXEEXT) + @p='celt/tests/test_unit_types$(EXEEXT)'; \ + b='celt/tests/test_unit_types'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +silk/tests/test_unit_LPC_inv_pred_gain.log: silk/tests/test_unit_LPC_inv_pred_gain$(EXEEXT) + @p='silk/tests/test_unit_LPC_inv_pred_gain$(EXEEXT)'; \ + b='silk/tests/test_unit_LPC_inv_pred_gain'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tests/test_opus_api.log: tests/test_opus_api$(EXEEXT) + @p='tests/test_opus_api$(EXEEXT)'; \ + b='tests/test_opus_api'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tests/test_opus_decode.log: tests/test_opus_decode$(EXEEXT) + @p='tests/test_opus_decode$(EXEEXT)'; \ + b='tests/test_opus_decode'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tests/test_opus_encode.log: tests/test_opus_encode$(EXEEXT) + @p='tests/test_opus_encode$(EXEEXT)'; \ + b='tests/test_opus_encode'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tests/test_opus_padding.log: tests/test_opus_padding$(EXEEXT) + @p='tests/test_opus_padding$(EXEEXT)'; \ + b='tests/test_opus_padding'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tests/test_opus_projection.log: tests/test_opus_projection$(EXEEXT) + @p='tests/test_opus_projection$(EXEEXT)'; \ + b='tests/test_opus_projection'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) \ + config.h all-local +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f celt/$(DEPDIR)/$(am__dirstamp) + -rm -f celt/$(am__dirstamp) + -rm -f celt/arm/$(DEPDIR)/$(am__dirstamp) + -rm -f celt/arm/$(am__dirstamp) + -rm -f celt/tests/$(DEPDIR)/$(am__dirstamp) + -rm -f celt/tests/$(am__dirstamp) + -rm -f celt/x86/$(DEPDIR)/$(am__dirstamp) + -rm -f celt/x86/$(am__dirstamp) + -rm -f silk/$(DEPDIR)/$(am__dirstamp) + -rm -f silk/$(am__dirstamp) + -rm -f silk/arm/$(DEPDIR)/$(am__dirstamp) + -rm -f silk/arm/$(am__dirstamp) + -rm -f silk/fixed/$(DEPDIR)/$(am__dirstamp) + -rm -f silk/fixed/$(am__dirstamp) + -rm -f silk/fixed/arm/$(DEPDIR)/$(am__dirstamp) + -rm -f silk/fixed/arm/$(am__dirstamp) + -rm -f silk/fixed/x86/$(DEPDIR)/$(am__dirstamp) + -rm -f silk/fixed/x86/$(am__dirstamp) + -rm -f silk/float/$(DEPDIR)/$(am__dirstamp) + -rm -f silk/float/$(am__dirstamp) + -rm -f silk/tests/$(DEPDIR)/$(am__dirstamp) + -rm -f silk/tests/$(am__dirstamp) + -rm -f silk/x86/$(DEPDIR)/$(am__dirstamp) + -rm -f silk/x86/$(am__dirstamp) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + -rm -f tests/$(DEPDIR)/$(am__dirstamp) + -rm -f tests/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf celt/$(DEPDIR) celt/arm/$(DEPDIR) celt/tests/$(DEPDIR) celt/x86/$(DEPDIR) silk/$(DEPDIR) silk/arm/$(DEPDIR) silk/fixed/$(DEPDIR) silk/fixed/arm/$(DEPDIR) silk/fixed/x86/$(DEPDIR) silk/float/$(DEPDIR) silk/tests/$(DEPDIR) silk/x86/$(DEPDIR) src/$(DEPDIR) tests/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-data-local install-m4dataDATA \ + install-pkgconfigDATA install-pkgincludeHEADERS + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf celt/$(DEPDIR) celt/arm/$(DEPDIR) celt/tests/$(DEPDIR) celt/x86/$(DEPDIR) silk/$(DEPDIR) silk/arm/$(DEPDIR) silk/fixed/$(DEPDIR) silk/fixed/arm/$(DEPDIR) silk/fixed/x86/$(DEPDIR) silk/float/$(DEPDIR) silk/tests/$(DEPDIR) silk/x86/$(DEPDIR) src/$(DEPDIR) tests/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES uninstall-local \ + uninstall-m4dataDATA uninstall-pkgconfigDATA \ + uninstall-pkgincludeHEADERS + +.MAKE: $(am__recursive_targets) all check check-am install install-am \ + install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ + am--refresh check check-TESTS check-am clean clean-cscope \ + clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscope \ + cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-m4dataDATA install-man \ + install-pdf install-pdf-am install-pkgconfigDATA \ + install-pkgincludeHEADERS install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ + uninstall uninstall-am uninstall-libLTLIBRARIES \ + uninstall-local uninstall-m4dataDATA uninstall-pkgconfigDATA \ + uninstall-pkgincludeHEADERS + +.PRECIOUS: Makefile + + +# Provide the full test output for failed tests when using the parallel +# test suite (which is enabled by default with automake 1.13+). +export VERBOSE = yes + +# Targets to build and install just the library without the docs +opus check-opus install-opus: export NO_DOXYGEN = 1 + +opus: all +check-opus: check +install-opus: install + +# Or just the docs +docs: + ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) + +install-docs: + ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) + +# Or everything (by default) +all-local: + @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) + +install-data-local: + @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) + +clean-local: + -( cd doc && $(MAKE) $(AM_MAKEFLAGS) clean ) + +uninstall-local: + ( cd doc && $(MAKE) $(AM_MAKEFLAGS) uninstall ) + +# We check this every time make is run, with configure.ac being touched to +# trigger an update of the build system files if update_version changes the +# current PACKAGE_VERSION (or if package_version was modified manually by a +# user with either AUTO_UPDATE=no or no update_version script present - the +# latter being the normal case for tarball releases). +# +# We can't just add the package_version file to CONFIGURE_DEPENDENCIES since +# simply running autoconf will not actually regenerate configure for us when +# the content of that file changes (due to autoconf dependency checking not +# knowing about that without us creating yet another file for it to include). +# +# The MAKECMDGOALS check is a gnu-make'ism, but will degrade 'gracefully' for +# makes that don't support it. The only loss of functionality is not forcing +# an update of package_version for `make dist` if AUTO_UPDATE=no, but that is +# unlikely to be a real problem for any real user. +$(top_srcdir)/configure.ac: force + @case "$(MAKECMDGOALS)" in \ + dist-hook) exit 0 ;; \ + dist-* | dist | distcheck | distclean) _arg=release ;; \ + esac; \ + if ! $(top_srcdir)/update_version $$_arg 2> /dev/null; then \ + if [ ! -e $(top_srcdir)/package_version ]; then \ + echo 'PACKAGE_VERSION="unknown"' > $(top_srcdir)/package_version; \ + fi; \ + . $(top_srcdir)/package_version || exit 1; \ + [ "$(PACKAGE_VERSION)" != "$$PACKAGE_VERSION" ] || exit 0; \ + fi; \ + touch $@ + +force: + +# Create a minimal package_version file when make dist is run. +dist-hook: + echo 'PACKAGE_VERSION="$(PACKAGE_VERSION)"' > $(top_distdir)/package_version + +.PHONY: opus check-opus install-opus docs install-docs + +# automake doesn't do dependency tracking for asm files, that I can tell +$(CELT_SOURCES_ARM_ASM:%.s=%-gnu.S): celt/arm/armopts-gnu.S +$(CELT_SOURCES_ARM_ASM:%.s=%-gnu.S): $(top_srcdir)/celt/arm/arm2gnu.pl + +# convert ARM asm to GNU as format +%-gnu.S: $(top_srcdir)/%.s + $(top_srcdir)/celt/arm/arm2gnu.pl @ARM2GNU_PARAMS@ < $< > $@ +# For autoconf-modified sources (e.g., armopts.s) +%-gnu.S: %.s + $(top_srcdir)/celt/arm/arm2gnu.pl @ARM2GNU_PARAMS@ < $< > $@ +@HAVE_SSE_TRUE@$(SSE_OBJ): CFLAGS += $(OPUS_X86_SSE_CFLAGS) +@HAVE_SSE2_TRUE@$(SSE2_OBJ): CFLAGS += $(OPUS_X86_SSE2_CFLAGS) +@HAVE_SSE4_1_TRUE@$(SSE4_1_OBJ): CFLAGS += $(OPUS_X86_SSE4_1_CFLAGS) +@HAVE_ARM_NEON_INTR_TRUE@$(ARM_NEON_INTR_OBJ): CFLAGS += \ +@HAVE_ARM_NEON_INTR_TRUE@ $(OPUS_ARM_NEON_INTR_CFLAGS) $(NE10_CFLAGS) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/external/opus-1.3.1/Makefile.mips b/external/opus-1.3.1/Makefile.mips new file mode 100644 index 00000000..e9bfc22e --- /dev/null +++ b/external/opus-1.3.1/Makefile.mips @@ -0,0 +1,161 @@ +#################### COMPILE OPTIONS ####################### + +# Uncomment this for fixed-point build +FIXED_POINT=1 + +# It is strongly recommended to uncomment one of these +# VAR_ARRAYS: Use C99 variable-length arrays for stack allocation +# USE_ALLOCA: Use alloca() for stack allocation +# If none is defined, then the fallback is a non-threadsafe global array +CFLAGS := -DUSE_ALLOCA $(CFLAGS) +#CFLAGS := -DVAR_ARRAYS $(CFLAGS) + +# These options affect performance +# HAVE_LRINTF: Use C99 intrinsics to speed up float-to-int conversion +CFLAGS := -DHAVE_LRINTF $(CFLAGS) + +###################### END OF OPTIONS ###################### + +-include package_version + +include silk_sources.mk +include celt_sources.mk +include opus_sources.mk + +ifdef FIXED_POINT +SILK_SOURCES += $(SILK_SOURCES_FIXED) +else +SILK_SOURCES += $(SILK_SOURCES_FLOAT) +OPUS_SOURCES += $(OPUS_SOURCES_FLOAT) +endif + +EXESUFFIX = +LIBPREFIX = lib +LIBSUFFIX = .a +OBJSUFFIX = .o + +CC = $(TOOLCHAIN_PREFIX)cc$(TOOLCHAIN_SUFFIX) +AR = $(TOOLCHAIN_PREFIX)ar +RANLIB = $(TOOLCHAIN_PREFIX)ranlib +CP = $(TOOLCHAIN_PREFIX)cp + +cppflags-from-defines = $(addprefix -D,$(1)) +cppflags-from-includes = $(addprefix -I,$(1)) +ldflags-from-ldlibdirs = $(addprefix -L,$(1)) +ldlibs-from-libs = $(addprefix -l,$(1)) + +WARNINGS = -Wall -W -Wstrict-prototypes -Wextra -Wcast-align -Wnested-externs -Wshadow + +CFLAGS += -mips32r2 -mno-mips16 -std=gnu99 -O2 -g $(WARNINGS) -DENABLE_ASSERTIONS -DMIPSr1_ASM -DOPUS_BUILD -mdspr2 -march=74kc -mtune=74kc -mmt -mgp32 + +CINCLUDES = include silk celt + +ifdef FIXED_POINT +CFLAGS += -DFIXED_POINT=1 -DDISABLE_FLOAT_API +CINCLUDES += silk/fixed +else +CINCLUDES += silk/float +endif + + +LIBS = m + +LDLIBDIRS = ./ + +CFLAGS += $(call cppflags-from-defines,$(CDEFINES)) +CFLAGS += $(call cppflags-from-includes,$(CINCLUDES)) +LDFLAGS += $(call ldflags-from-ldlibdirs,$(LDLIBDIRS)) +LDLIBS += $(call ldlibs-from-libs,$(LIBS)) + +COMPILE.c.cmdline = $(CC) -c $(CFLAGS) -o $@ $< +LINK.o = $(CC) $(LDPREFLAGS) $(LDFLAGS) +LINK.o.cmdline = $(LINK.o) $^ $(LDLIBS) -o $@$(EXESUFFIX) + +ARCHIVE.cmdline = $(AR) $(ARFLAGS) $@ $^ && $(RANLIB) $@ + +%$(OBJSUFFIX):%.c + $(COMPILE.c.cmdline) + +%$(OBJSUFFIX):%.cpp + $(COMPILE.cpp.cmdline) + +# Directives + + +# Variable definitions +LIB_NAME = opus +TARGET = $(LIBPREFIX)$(LIB_NAME)$(LIBSUFFIX) + +SRCS_C = $(SILK_SOURCES) $(CELT_SOURCES) $(OPUS_SOURCES) + +OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(SRCS_C)) + +OPUSDEMO_SRCS_C = src/opus_demo.c +OPUSDEMO_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSDEMO_SRCS_C)) + +TESTOPUSAPI_SRCS_C = tests/test_opus_api.c +TESTOPUSAPI_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSAPI_SRCS_C)) + +TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.c +TESTOPUSDECODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSDECODE_SRCS_C)) + +TESTOPUSENCODE_SRCS_C = tests/test_opus_encode.c tests/opus_encode_regressions.c +TESTOPUSENCODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSENCODE_SRCS_C)) + +TESTOPUSPADDING_SRCS_C = tests/test_opus_padding.c +TESTOPUSPADDING_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSPADDING_SRCS_C)) + +OPUSCOMPARE_SRCS_C = src/opus_compare.c +OPUSCOMPARE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSCOMPARE_SRCS_C)) + +TESTS := test_opus_api test_opus_decode test_opus_encode test_opus_padding + +# Rules +all: lib opus_demo opus_compare $(TESTS) + +lib: $(TARGET) + +check: all + for test in $(TESTS); do ./$$test; done + +$(TARGET): $(OBJS) + $(ARCHIVE.cmdline) + +opus_demo$(EXESUFFIX): $(OPUSDEMO_OBJS) $(TARGET) + $(LINK.o.cmdline) + +test_opus_api$(EXESUFFIX): $(TESTOPUSAPI_OBJS) $(TARGET) + $(LINK.o.cmdline) + +test_opus_decode$(EXESUFFIX): $(TESTOPUSDECODE_OBJS) $(TARGET) + $(LINK.o.cmdline) + +test_opus_encode$(EXESUFFIX): $(TESTOPUSENCODE_OBJS) $(TARGET) + $(LINK.o.cmdline) + +test_opus_padding$(EXESUFFIX): $(TESTOPUSPADDING_OBJS) $(TARGET) + $(LINK.o.cmdline) + +opus_compare$(EXESUFFIX): $(OPUSCOMPARE_OBJS) + $(LINK.o.cmdline) + +celt/celt.o: CFLAGS += -DPACKAGE_VERSION='$(PACKAGE_VERSION)' +celt/celt.o: package_version + +package_version: force + @if [ -x ./update_version ]; then \ + ./update_version || true; \ + elif [ ! -e ./package_version ]; then \ + echo 'PACKAGE_VERSION="unknown"' > ./package_version; \ + fi + +force: + +clean: + rm -f opus_demo$(EXESUFFIX) opus_compare$(EXESUFFIX) $(TARGET) \ + test_opus_api$(EXESUFFIX) test_opus_decode$(EXESUFFIX) \ + test_opus_encode$(EXESUFFIX) test_opus_padding$(EXESUFFIX) \ + $(OBJS) $(OPUSDEMO_OBJS) $(OPUSCOMPARE_OBJS) $(TESTOPUSAPI_OBJS) \ + $(TESTOPUSDECODE_OBJS) $(TESTOPUSENCODE_OBJS) $(TESTOPUSPADDING_OBJS) + +.PHONY: all lib clean force check diff --git a/external/opus-1.0.3/Makefile.unix b/external/opus-1.3.1/Makefile.unix similarity index 68% rename from external/opus-1.0.3/Makefile.unix rename to external/opus-1.3.1/Makefile.unix index 1c5138be..90a48f0c 100644 --- a/external/opus-1.0.3/Makefile.unix +++ b/external/opus-1.3.1/Makefile.unix @@ -3,9 +3,6 @@ # Uncomment this for fixed-point build #FIXED_POINT=1 -# Uncomment this to include the opus encoder -#USE_ENCODER=1 - # It is strongly recommended to uncomment one of these # VAR_ARRAYS: Use C99 variable-length arrays for stack allocation # USE_ALLOCA: Use alloca() for stack allocation @@ -15,11 +12,7 @@ CFLAGS := -DUSE_ALLOCA $(CFLAGS) # These options affect performance # HAVE_LRINTF: Use C99 intrinsics to speed up float-to-int conversion -# inline: Don't use the 'inline' keyword (for ANSI C compilers) -# restrict: Don't use the 'restrict' keyword (for pre-C99 compilers) #CFLAGS := -DHAVE_LRINTF $(CFLAGS) -#CFLAGS := -Dinline= $(CFLAGS) -CFLAGS := -Drestrict= $(CFLAGS) ###################### END OF OPTIONS ###################### @@ -29,16 +22,11 @@ include silk_sources.mk include celt_sources.mk include opus_sources.mk -ifdef USE_ENCODER -CFLAGS := -DOPUS_ENABLE_ENCODER $(CFLAGS) -CELT_SOURCES += $(CELT_SOURCES_ENC) -SILK_SOURCES += $(SILK_SOURCES_ENC) -OPUS_SOURCES += $(OPUS_SOURCES_ENC) ifdef FIXED_POINT SILK_SOURCES += $(SILK_SOURCES_FIXED) else SILK_SOURCES += $(SILK_SOURCES_FLOAT) -endif +OPUS_SOURCES += $(OPUS_SOURCES_FLOAT) endif EXESUFFIX = @@ -103,20 +91,49 @@ OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(SRCS_C)) OPUSDEMO_SRCS_C = src/opus_demo.c OPUSDEMO_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSDEMO_SRCS_C)) +TESTOPUSAPI_SRCS_C = tests/test_opus_api.c +TESTOPUSAPI_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSAPI_SRCS_C)) + +TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.c +TESTOPUSDECODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSDECODE_SRCS_C)) + +TESTOPUSENCODE_SRCS_C = tests/test_opus_encode.c tests/opus_encode_regressions.c +TESTOPUSENCODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSENCODE_SRCS_C)) + +TESTOPUSPADDING_SRCS_C = tests/test_opus_padding.c +TESTOPUSPADDING_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSPADDING_SRCS_C)) + OPUSCOMPARE_SRCS_C = src/opus_compare.c OPUSCOMPARE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSCOMPARE_SRCS_C)) +TESTS := test_opus_api test_opus_decode test_opus_encode test_opus_padding + # Rules -all: lib opus_demo opus_compare +all: lib opus_demo opus_compare $(TESTS) lib: $(TARGET) +check: all + for test in $(TESTS); do ./$$test; done + $(TARGET): $(OBJS) $(ARCHIVE.cmdline) opus_demo$(EXESUFFIX): $(OPUSDEMO_OBJS) $(TARGET) $(LINK.o.cmdline) +test_opus_api$(EXESUFFIX): $(TESTOPUSAPI_OBJS) $(TARGET) + $(LINK.o.cmdline) + +test_opus_decode$(EXESUFFIX): $(TESTOPUSDECODE_OBJS) $(TARGET) + $(LINK.o.cmdline) + +test_opus_encode$(EXESUFFIX): $(TESTOPUSENCODE_OBJS) $(TARGET) + $(LINK.o.cmdline) + +test_opus_padding$(EXESUFFIX): $(TESTOPUSPADDING_OBJS) $(TARGET) + $(LINK.o.cmdline) + opus_compare$(EXESUFFIX): $(OPUSCOMPARE_OBJS) $(LINK.o.cmdline) @@ -134,6 +151,9 @@ force: clean: rm -f opus_demo$(EXESUFFIX) opus_compare$(EXESUFFIX) $(TARGET) \ - $(OBJS) $(OPUSDEMO_OBJS) $(OPUSCOMPARE_OBJS) + test_opus_api$(EXESUFFIX) test_opus_decode$(EXESUFFIX) \ + test_opus_encode$(EXESUFFIX) test_opus_padding$(EXESUFFIX) \ + $(OBJS) $(OPUSDEMO_OBJS) $(OPUSCOMPARE_OBJS) $(TESTOPUSAPI_OBJS) \ + $(TESTOPUSDECODE_OBJS) $(TESTOPUSENCODE_OBJS) $(TESTOPUSPADDING_OBJS) -.PHONY: all lib clean +.PHONY: all lib clean force check diff --git a/external/opus-1.0.3/NEWS b/external/opus-1.3.1/NEWS similarity index 100% rename from external/opus-1.0.3/NEWS rename to external/opus-1.3.1/NEWS diff --git a/external/opus-1.3.1/OpusConfig.cmake.in b/external/opus-1.3.1/OpusConfig.cmake.in new file mode 100644 index 00000000..15771743 --- /dev/null +++ b/external/opus-1.3.1/OpusConfig.cmake.in @@ -0,0 +1,19 @@ +set(OPUS_VERSION @PROJECT_VERSION@) +set(OPUS_VERSION_STRING @PROJECT_VERSION@) +set(OPUS_VERSION_MAJOR @PROJECT_VERSION_MAJOR@) +set(OPUS_VERSION_MINOR @PROJECT_VERSION_MINOR@) +set(OPUS_VERSION_PATCH @PROJECT_VERSION_PATCH@) + +@PACKAGE_INIT@ + +set_and_check(OPUS_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") +set_and_check(OPUS_INCLUDE_DIRS "@PACKAGE_INCLUDE_INSTALL_DIR@") + +include(${CMAKE_CURRENT_LIST_DIR}/OpusTargets.cmake) + +set(OPUS_LIBRARY Opus::opus) +set(OPUS_LIBRARIES Opus::opus) + +check_required_components(Opus) + +set(OPUS_FOUND 1) diff --git a/external/opus-1.0.3/README b/external/opus-1.3.1/README similarity index 82% rename from external/opus-1.0.3/README rename to external/opus-1.3.1/README index 655c6b44..27fddf96 100644 --- a/external/opus-1.0.3/README +++ b/external/opus-1.3.1/README @@ -13,14 +13,14 @@ soundtracks, portable music players, jukeboxes, and other applications that have historically used high latency formats such as MP3, AAC, or Vorbis. Opus is specified by IETF RFC 6716: - http://tools.ietf.org/html/rfc6716 + https://tools.ietf.org/html/rfc6716 The Opus format and this implementation of it are subject to the royalty- free patent and copyright licenses specified in the file COPYING. This package implements a shared library for encoding and decoding raw Opus bitstreams. Raw Opus bitstreams should be used over RTP according to - http://tools.ietf.org/html/draft-spittka-payload-rtp-opus + https://tools.ietf.org/html/rfc7587 The package also includes a number of test tools used for testing the correct operation of the library. The bitstreams read/written by these @@ -29,7 +29,7 @@ additional debugging data and cannot support seeking. Opus stored in files should use the Ogg encapsulation for Opus which is described at: - http://wiki.xiph.org/OggOpus + https://tools.ietf.org/html/rfc7845 An opus-tools package is available which provides encoding and decoding of Ogg encapsulated Opus files and includes a number of useful features. @@ -37,31 +37,49 @@ Ogg encapsulated Opus files and includes a number of useful features. Opus-tools can be found at: https://git.xiph.org/?p=opus-tools.git or on the main Opus website: - http://opus-codec.org/ + https://opus-codec.org/ == Compiling libopus == To build from a distribution tarball, you only need to do the following: -% ./configure -% make + % ./configure + % make To build from the git repository, the following steps are necessary: +0) Set up a development environment: + +On an Ubuntu or Debian family Linux distribution: + + % sudo apt-get install git autoconf automake libtool gcc make + +On a Fedora/Redhat based Linux: + + % sudo dnf install git autoconf automake libtool gcc make + +Or for older Redhat/Centos Linux releases: + + % sudo yum install git autoconf automake libtool gcc make + +On Apple macOS, install Xcode and brew.sh, then in the Terminal enter: + + % brew install autoconf automake libtool + 1) Clone the repository: -% git clone git://git.opus-codec.org/opus.git -% cd opus + % git clone https://git.xiph.org/opus.git + % cd opus 2) Compiling the source -% ./autogen.sh -% ./configure -% make + % ./autogen.sh + % ./configure + % make 3) Install the codec libraries (optional) -% sudo make install + % sudo make install Once you have compiled the codec, there will be a opus_demo executable in the top directory. @@ -102,17 +120,18 @@ which SHOULD be run after compiling the package especially the first time it is run on a new platform. To run the integrated tests: -% make check + + % make check There is also collection of standard test vectors which are not included in this package for size reasons but can be obtained from: -http://opus-codec.org/testvectors/opus_testvectors.tar.gz +https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz To run compare the code to these test vectors: -% curl -O http://opus-codec.org/testvectors/opus_testvectors.tar.gz -% tar -zxf opus_testvectors.tar.gz -% ./tests/run_vectors.sh ./ opus_testvectors 48000 + % curl -OL https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz + % tar -zxf opus_testvectors-rfc8251.tar.gz + % ./tests/run_vectors.sh ./ opus_newvectors 48000 == Portability notes == diff --git a/external/opus-1.0.3/aclocal.m4 b/external/opus-1.3.1/aclocal.m4 similarity index 63% rename from external/opus-1.0.3/aclocal.m4 rename to external/opus-1.3.1/aclocal.m4 index fd6b73a1..f4d9d0a4 100644 --- a/external/opus-1.0.3/aclocal.m4 +++ b/external/opus-1.3.1/aclocal.m4 @@ -1,8 +1,7 @@ -# generated automatically by aclocal 1.11.6 -*- Autoconf -*- +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, -# Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -12,33 +11,31 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, -[m4_warning([this file was generated for autoconf 2.68. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 2002-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.11' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.6], [], +m4_if([$1], [1.15.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -54,24 +51,42 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.6])dnl +[AM_AUTOMAKE_VERSION([1.15.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -# AM_AUX_DIR_EXPAND -*- Autoconf -*- +# Figure out how to run the assembler. -*- Autoconf -*- -# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 +# AM_PROG_AS +# ---------- +AC_DEFUN([AM_PROG_AS], +[# By default we simply use the C compiler to build assembly code. +AC_REQUIRE([AC_PROG_CC]) +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS +AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) +AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -90,7 +105,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you +# harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -108,30 +123,26 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 9 - # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -150,16 +161,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, -# 2010, 2011 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 12 -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -169,7 +178,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -182,12 +191,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -195,8 +205,8 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -236,16 +246,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -254,8 +264,8 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else @@ -263,7 +273,7 @@ AC_CACHE_CHECK([dependency style of $depcc], fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -311,7 +321,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -321,9 +331,13 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' @@ -338,20 +352,18 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -364,7 +376,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -376,21 +388,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -408,7 +418,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will +# is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -418,18 +428,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 16 - # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -442,7 +455,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -471,33 +484,42 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -506,34 +528,82 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -555,21 +625,18 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, -# Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -577,16 +644,14 @@ if test x"${install_sh}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST(install_sh)]) +AC_SUBST([install_sh])]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -603,20 +668,17 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, -# 2011 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 - # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. -# Default is to disable them, unless `enable' is passed literally. -# For symmetry, `disable' may be passed as well. Anyway, the user +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), @@ -627,10 +689,11 @@ AC_DEFUN([AM_MAINTAINER_MODE], AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], -[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - [USE_MAINTAINER_MODE=$enableval], - [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE @@ -638,18 +701,14 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) ] ) -AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) - # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -667,7 +726,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -692,52 +751,14 @@ AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) -# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) - # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 6 - # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -745,11 +766,10 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) - # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -762,54 +782,22 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) + AC_MSG_WARN(['missing' script is too old or missing]) fi ]) -# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, -# Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 1 - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software -# Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 - # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], @@ -819,7 +807,7 @@ AC_DEFUN([_AM_MANGLE_OPTION], # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ @@ -833,24 +821,82 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Check to make sure that the build environment is sane. -*- Autoconf -*- +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -861,32 +907,40 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$[2]" = conftest.file ) then @@ -896,31 +950,50 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT(yes)]) +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) -# Copyright (C) 2009, 2011 Free Software Foundation, Inc. +# Copyright (C) 2009-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT -# (`yes' being less verbose, `no' or empty being verbose). +# ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], -[AC_ARG_ENABLE([silent-rules], -[ --enable-silent-rules less verbose build output (undo: `make V=1') - --disable-silent-rules verbose build output (undo: `make V=0')]) -case $enable_silent_rules in -yes) AM_DEFAULT_VERBOSITY=0;; -no) AM_DEFAULT_VERBOSITY=1;; -*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl -dnl A few `make' implementations (e.g., NonStop OS and NextStep) +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} @@ -938,7 +1011,7 @@ else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then - dnl Using `$V' instead of `$(V)' breaks IRIX make. + dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else @@ -955,44 +1028,40 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor `install' (even GNU) is that you can't +# One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize +# always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. +# Copyright (C) 2006-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 - # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -1006,18 +1075,16 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. +# Copyright (C) 2004-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -1027,82 +1094,123 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar +# AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. + +# We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +m4_include([m4/as-gcc-inline-assembly.m4]) +m4_include([m4/ax_add_fortify_source.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) +m4_include([m4/opus-intrinsics.m4]) diff --git a/external/opus-1.0.3/celt/_kiss_fft_guts.h b/external/opus-1.3.1/celt/_kiss_fft_guts.h similarity index 85% rename from external/opus-1.0.3/celt/_kiss_fft_guts.h rename to external/opus-1.3.1/celt/_kiss_fft_guts.h index 33e62c6b..17392b3e 100644 --- a/external/opus-1.0.3/celt/_kiss_fft_guts.h +++ b/external/opus-1.3.1/celt/_kiss_fft_guts.h @@ -58,16 +58,12 @@ # define S_MUL(a,b) MULT16_32_Q15(b, a) # define C_MUL(m,a,b) \ - do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ - (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) + do{ (m).r = SUB32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ + (m).i = ADD32_ovflw(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) # define C_MULC(m,a,b) \ - do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ - (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) - -# define C_MUL4(m,a,b) \ - do{ (m).r = SHR32(SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)),2); \ - (m).i = SHR32(ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)),2); }while(0) + do{ (m).r = ADD32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ + (m).i = SUB32_ovflw(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = S_MUL( (c).r , s ) ;\ @@ -81,19 +77,30 @@ DIVSCALAR( (c).i , div); }while (0) #define C_ADD( res, a,b)\ - do {(res).r=ADD32((a).r,(b).r); (res).i=ADD32((a).i,(b).i); \ + do {(res).r=ADD32_ovflw((a).r,(b).r); (res).i=ADD32_ovflw((a).i,(b).i); \ }while(0) #define C_SUB( res, a,b)\ - do {(res).r=SUB32((a).r,(b).r); (res).i=SUB32((a).i,(b).i); \ + do {(res).r=SUB32_ovflw((a).r,(b).r); (res).i=SUB32_ovflw((a).i,(b).i); \ }while(0) #define C_ADDTO( res , a)\ - do {(res).r = ADD32((res).r, (a).r); (res).i = ADD32((res).i,(a).i);\ + do {(res).r = ADD32_ovflw((res).r, (a).r); (res).i = ADD32_ovflw((res).i,(a).i);\ }while(0) #define C_SUBFROM( res , a)\ - do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \ + do {(res).r = ADD32_ovflw((res).r,(a).r); (res).i = SUB32_ovflw((res).i,(a).i); \ }while(0) +#if defined(OPUS_ARM_INLINE_ASM) +#include "arm/kiss_fft_armv4.h" +#endif + +#if defined(OPUS_ARM_INLINE_EDSP) +#include "arm/kiss_fft_armv5e.h" +#endif +#if defined(MIPSr1_ASM) +#include "mips/kiss_fft_mipsr1.h" +#endif + #else /* not FIXED_POINT*/ # define S_MUL(a,b) ( (a)*(b) ) diff --git a/external/opus-1.0.3/celt/arch.h b/external/opus-1.3.1/celt/arch.h similarity index 63% rename from external/opus-1.0.3/celt/arch.h rename to external/opus-1.3.1/celt/arch.h index 03cda40f..08b07db5 100644 --- a/external/opus-1.0.3/celt/arch.h +++ b/external/opus-1.3.1/celt/arch.h @@ -35,6 +35,7 @@ #define ARCH_H #include "opus_types.h" +#include "opus_defines.h" # if !defined(__GNUC_PREREQ) # if defined(__GNUC__)&&defined(__GNUC_MINOR__) @@ -45,34 +46,56 @@ # endif # endif +#if OPUS_GNUC_PREREQ(3, 0) +#define opus_likely(x) (__builtin_expect(!!(x), 1)) +#define opus_unlikely(x) (__builtin_expect(!!(x), 0)) +#else +#define opus_likely(x) (!!(x)) +#define opus_unlikely(x) (!!(x)) +#endif + #define CELT_SIG_SCALE 32768.f -#define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); -#ifdef ENABLE_ASSERTIONS +#define CELT_FATAL(str) celt_fatal(str, __FILE__, __LINE__); + +#if defined(ENABLE_ASSERTIONS) || defined(ENABLE_HARDENING) +#ifdef __GNUC__ +__attribute__((noreturn)) +#endif +void celt_fatal(const char *str, const char *file, int line); + +#if defined(CELT_C) && !defined(OVERRIDE_celt_fatal) #include #include #ifdef __GNUC__ __attribute__((noreturn)) #endif -static inline void _celt_fatal(const char *str, const char *file, int line) +void celt_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); abort(); } -#define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}} -#define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}} +#endif + +#define celt_assert(cond) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond);}} +#define celt_assert2(cond, message) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond "\n" message);}} +#define MUST_SUCCEED(call) celt_assert((call) == OPUS_OK) #else #define celt_assert(cond) #define celt_assert2(cond, message) +#define MUST_SUCCEED(call) do {if((call) != OPUS_OK) {RESTORE_STACK; return OPUS_INTERNAL_ERROR;} } while (0) +#endif + +#if defined(ENABLE_ASSERTIONS) +#define celt_sig_assert(cond) {if (!(cond)) {CELT_FATAL("signal assertion failed: " #cond);}} +#else +#define celt_sig_assert(cond) #endif #define IMUL32(a,b) ((a)*(b)) -#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ -#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ -#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */ #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ @@ -80,42 +103,67 @@ static inline void _celt_fatal(const char *str, const char *file, int line) #define UADD32(a,b) ((a)+(b)) #define USUB32(a,b) ((a)-(b)) +/* Set this if opus_int64 is a native type of the CPU. */ +/* Assume that all LP64 architectures have fast 64-bit types; also x86_64 + (which can be ILP32 for x32) and Win64 (which is LLP64). */ +#if defined(__x86_64__) || defined(__LP64__) || defined(_WIN64) +#define OPUS_FAST_INT64 1 +#else +#define OPUS_FAST_INT64 0 +#endif + #define PRINT_MIPS(file) #ifdef FIXED_POINT typedef opus_int16 opus_val16; typedef opus_int32 opus_val32; +typedef opus_int64 opus_val64; typedef opus_val32 celt_sig; typedef opus_val16 celt_norm; typedef opus_val32 celt_ener; +#define celt_isnan(x) 0 + #define Q15ONE 32767 #define SIG_SHIFT 12 +/* Safe saturation value for 32-bit signals. Should be less than + 2^31*(1-0.85) to avoid blowing up on DC at deemphasis.*/ +#define SIG_SAT (300000000) #define NORM_SCALING 16384 #define DB_SHIFT 10 #define EPSILON 1 +#define VERY_SMALL 0 #define VERY_LARGE16 ((opus_val16)32767) #define Q15_ONE ((opus_val16)32767) #define SCALEIN(a) (a) #define SCALEOUT(a) (a) +#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) +#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) + +static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { + return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; +} + #ifdef FIXED_DEBUG #include "fixed_debug.h" #else #include "fixed_generic.h" -#ifdef ARM5E_ASM -#include "fixed_arm5e.h" -#elif defined (ARM4_ASM) -#include "fixed_arm4.h" +#ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR +#include "arm/fixed_arm64.h" +#elif defined (OPUS_ARM_INLINE_EDSP) +#include "arm/fixed_armv5e.h" +#elif defined (OPUS_ARM_INLINE_ASM) +#include "arm/fixed_armv4.h" #elif defined (BFIN_ASM) #include "fixed_bfin.h" #elif defined (TI_C5X_ASM) @@ -130,24 +178,47 @@ typedef opus_val32 celt_ener; typedef float opus_val16; typedef float opus_val32; +typedef float opus_val64; typedef float celt_sig; typedef float celt_norm; typedef float celt_ener; +#ifdef FLOAT_APPROX +/* This code should reliably detect NaN/inf even when -ffast-math is used. + Assumes IEEE 754 format. */ +static OPUS_INLINE int celt_isnan(float x) +{ + union {float f; opus_uint32 i;} in; + in.f = x; + return ((in.i>>23)&0xFF)==0xFF && (in.i&0x007FFFFF)!=0; +} +#else +#ifdef __FAST_MATH__ +#error Cannot build libopus with -ffast-math unless FLOAT_APPROX is defined. This could result in crashes on extreme (e.g. NaN) input +#endif +#define celt_isnan(x) ((x)!=(x)) +#endif + #define Q15ONE 1.0f #define NORM_SCALING 1.f #define EPSILON 1e-15f +#define VERY_SMALL 1e-30f #define VERY_LARGE16 1e15f #define Q15_ONE ((opus_val16)1.f) +/* This appears to be the same speed as C99's fabsf() but it's more portable. */ +#define ABS16(x) ((float)fabs(x)) +#define ABS32(x) ((float)fabs(x)) + #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) +#define NEG32_ovflw(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) @@ -161,8 +232,10 @@ typedef float celt_ener; #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) +#define SATURATE16(x) (x) #define ROUND16(a,shift) (a) +#define SROUND16(a,shift) (a) #define HALF16(x) (.5f*(x)) #define HALF32(x) (.5f*(x)) @@ -170,6 +243,8 @@ typedef float celt_ener; #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) +#define ADD32_ovflw(a,b) ((a)+(b)) +#define SUB32_ovflw(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b)) #define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b)) @@ -180,8 +255,10 @@ typedef float celt_ener; #define MULT32_32_Q31(a,b) ((a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) +#define MAC16_32_Q16(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) +#define MULT16_16_Q11(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) @@ -196,13 +273,15 @@ typedef float celt_ener; #define SCALEIN(a) ((a)*CELT_SIG_SCALE) #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) +#define SIG2WORD16(x) (x) + #endif /* !FIXED_POINT */ #ifndef GLOBAL_STACK_SIZE #ifdef FIXED_POINT -#define GLOBAL_STACK_SIZE 100000 +#define GLOBAL_STACK_SIZE 120000 #else -#define GLOBAL_STACK_SIZE 100000 +#define GLOBAL_STACK_SIZE 120000 #endif #endif diff --git a/external/opus-1.3.1/celt/arm/arm2gnu.pl b/external/opus-1.3.1/celt/arm/arm2gnu.pl new file mode 100755 index 00000000..a2895f74 --- /dev/null +++ b/external/opus-1.3.1/celt/arm/arm2gnu.pl @@ -0,0 +1,353 @@ +#!/usr/bin/perl +# Copyright (C) 2002-2013 Xiph.org Foundation +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +my $bigend; # little/big endian +my $nxstack; +my $apple = 0; +my $symprefix = ""; + +$nxstack = 0; + +eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' + if $running_under_some_shell; + +while ($ARGV[0] =~ /^-/) { + $_ = shift; + last if /^--$/; + if (/^-n$/) { + $nflag++; + next; + } + if (/^--apple$/) { + $apple = 1; + $symprefix = "_"; + next; + } + die "I don't recognize this switch: $_\\n"; +} +$printit++ unless $nflag; + +$\ = "\n"; # automatically add newline on print +$n=0; + +$thumb = 0; # ARM mode by default, not Thumb. +@proc_stack = (); + +printf (" .syntax unified\n"); + +LINE: +while (<>) { + + # For ADRLs we need to add a new line after the substituted one. + $addPadding = 0; + + # First, we do not dare to touch *anything* inside double quotes, do we? + # Second, if you want a dollar character in the string, + # insert two of them -- that's how ARM C and assembler treat strings. + s/^([A-Za-z_]\w*)[ \t]+DCB[ \t]*\"/$1: .ascii \"/ && do { s/\$\$/\$/g; next }; + s/\bDCB\b[ \t]*\"/.ascii \"/ && do { s/\$\$/\$/g; next }; + s/^(\S+)\s+RN\s+(\S+)/$1 .req r$2/ && do { s/\$\$/\$/g; next }; + # If there's nothing on a line but a comment, don't try to apply any further + # substitutions (this is a cheap hack to avoid mucking up the license header) + s/^([ \t]*);/$1@/ && do { s/\$\$/\$/g; next }; + # If substituted -- leave immediately ! + + s/@/,:/; + s/;/@/; + while ( /@.*'/ ) { + s/(@.*)'/$1/g; + } + s/\{FALSE\}/0/g; + s/\{TRUE\}/1/g; + s/\{(\w\w\w\w+)\}/$1/g; + s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/; + s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\"/; + s/\bIMPORT\b/.extern/; + s/\bEXPORT\b\s*/.global $symprefix/; + s/^(\s+)\[/$1IF/; + s/^(\s+)\|/$1ELSE/; + s/^(\s+)\]/$1ENDIF/; + s/IF *:DEF:/ .ifdef/; + s/IF *:LNOT: *:DEF:/ .ifndef/; + s/ELSE/ .else/; + s/ENDIF/ .endif/; + + if( /\bIF\b/ ) { + s/\bIF\b/ .if/; + s/=/==/; + } + if ( $n == 2) { + s/\$/\\/g; + } + if ($n == 1) { + s/\$//g; + s/label//g; + $n = 2; + } + if ( /MACRO/ ) { + s/MACRO *\n/.macro/; + $n=1; + } + if ( /\bMEND\b/ ) { + s/\bMEND\b/.endm/; + $n=0; + } + + # ".rdata" doesn't work in 'as' version 2.13.2, as it is ".rodata" there. + # + if ( /\bAREA\b/ ) { + my $align; + $align = "2"; + if ( /ALIGN=(\d+)/ ) { + $align = $1; + } + if ( /CODE/ ) { + $nxstack = 1; + } + s/^(.+)CODE(.+)READONLY(.*)/ .text/; + s/^(.+)DATA(.+)READONLY(.*)/ .section .rdata/; + s/^(.+)\|\|\.data\|\|(.+)/ .data/; + s/^(.+)\|\|\.bss\|\|(.+)/ .bss/; + s/$/; .p2align $align/; + # Enable NEON instructions but don't produce a binary that requires + # ARMv7. RVCT does not have equivalent directives, so we just do this + # for all CODE areas. + if ( /.text/ ) { + # Separating .arch, .fpu, etc., by semicolons does not work (gas + # thinks the semicolon is part of the arch name, even when there's + # whitespace separating them). Sadly this means our line numbers + # won't match the original source file (we could use the .line + # directive, which is documented to be obsolete, but then gdb will + # show the wrong line in the translated source file). + s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/ unless ($apple); + } + } + + s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3|| + s/\|\|\.bss\$(\d+)\|\|/.L_BSS$1/; # ||.bss$2|| + s/\|\|\.data\$(\d+)\|\|/.L_DATA$1/; # ||.data$2|| + s/\|\|([a-zA-Z0-9_]+)\@([a-zA-Z0-9_]+)\|\|/@ $&/; + s/^(\s+)\%(\s)/ .space $1/; + + s/\|(.+)\.(\d+)\|/\.$1_$2/; # |L80.123| -> .L80_123 + s/\bCODE32\b/.code 32/ && do {$thumb = 0}; + s/\bCODE16\b/.code 16/ && do {$thumb = 1}; + if (/\bPROC\b/) + { + my $prefix; + my $proc; + /^([A-Za-z_\.]\w+)\b/; + $proc = $1; + $prefix = ""; + if ($proc) + { + $prefix = $prefix.sprintf("\t.type\t%s, %%function", $proc) unless ($apple); + # Make sure we $prefix isn't empty here (for the $apple case). + # We handle mangling the label here, make sure it doesn't match + # the label handling below (if $prefix would be empty). + $prefix = $prefix."; "; + push(@proc_stack, $proc); + s/^[A-Za-z_\.]\w+/$symprefix$&:/; + } + $prefix = $prefix."\t.thumb_func; " if ($thumb); + s/\bPROC\b/@ $&/; + $_ = $prefix.$_; + } + s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/; + s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/; + if (/\bENDP\b/) + { + my $proc; + s/\bENDP\b/@ $&/; + $proc = pop(@proc_stack); + $_ = "\t.size $proc, .-$proc".$_ if ($proc && !$apple); + } + s/\bSUBT\b/@ $&/; + s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25 + s/\bKEEP\b/@ $&/; + s/\bEXPORTAS\b/@ $&/; + s/\|\|(.)+\bEQU\b/@ $&/; + s/\|\|([\w\$]+)\|\|/$1/; + s/\bENTRY\b/@ $&/; + s/\bASSERT\b/@ $&/; + s/\bGBLL\b/@ $&/; + s/\bGBLA\b/@ $&/; + s/^\W+OPT\b/@ $&/; + s/:OR:/|/g; + s/:SHL:/<>/g; + s/:AND:/&/g; + s/:LAND:/&&/g; + s/CPSR/cpsr/; + s/SPSR/spsr/; + s/ALIGN$/.balign 4/; + s/ALIGN\s+([0-9x]+)$/.balign $1/; + s/psr_cxsf/psr_all/; + s/LTORG/.ltorg/; + s/^([A-Za-z_]\w*)[ \t]+EQU/ .set $1,/; + s/^([A-Za-z_]\w*)[ \t]+SETL/ .set $1,/; + s/^([A-Za-z_]\w*)[ \t]+SETA/ .set $1,/; + s/^([A-Za-z_]\w*)[ \t]+\*/ .set $1,/; + + # {PC} + 0xdeadfeed --> . + 0xdeadfeed + s/\{PC\} \+/ \. +/; + + # Single hex constant on the line ! + # + # >>> NOTE <<< + # Double-precision floats in gcc are always mixed-endian, which means + # bytes in two words are little-endian, but words are big-endian. + # So, 0x0000deadfeed0000 would be stored as 0x0000dead at low address + # and 0xfeed0000 at high address. + # + s/\bDCFD\b[ \t]+0x([a-fA-F0-9]{8})([a-fA-F0-9]{8})/.long 0x$1, 0x$2/; + # Only decimal constants on the line, no hex ! + s/\bDCFD\b[ \t]+([0-9\.\-]+)/.double $1/; + + # Single hex constant on the line ! +# s/\bDCFS\b[ \t]+0x([a-f0-9]{8})([a-f0-9]{8})/.long 0x$1, 0x$2/; + # Only decimal constants on the line, no hex ! +# s/\bDCFS\b[ \t]+([0-9\.\-]+)/.double $1/; + s/\bDCFS[ \t]+0x/.word 0x/; + s/\bDCFS\b/.float/; + + s/^([A-Za-z_]\w*)[ \t]+DCD/$1 .word/; + s/\bDCD\b/.word/; + s/^([A-Za-z_]\w*)[ \t]+DCW/$1 .short/; + s/\bDCW\b/.short/; + s/^([A-Za-z_]\w*)[ \t]+DCB/$1 .byte/; + s/\bDCB\b/.byte/; + s/^([A-Za-z_]\w*)[ \t]+\%/.comm $1,/; + s/^[A-Za-z_\.]\w+/$&:/; + s/^(\d+)/$1:/; + s/\%(\d+)/$1b_or_f/; + s/\%[Bb](\d+)/$1b/; + s/\%[Ff](\d+)/$1f/; + s/\%[Ff][Tt](\d+)/$1f/; + s/&([\dA-Fa-f]+)/0x$1/; + if ( /\b2_[01]+\b/ ) { + s/\b2_([01]+)\b/conv$1&&&&/g; + while ( /[01][01][01][01]&&&&/ ) { + s/0000&&&&/&&&&0/g; + s/0001&&&&/&&&&1/g; + s/0010&&&&/&&&&2/g; + s/0011&&&&/&&&&3/g; + s/0100&&&&/&&&&4/g; + s/0101&&&&/&&&&5/g; + s/0110&&&&/&&&&6/g; + s/0111&&&&/&&&&7/g; + s/1000&&&&/&&&&8/g; + s/1001&&&&/&&&&9/g; + s/1010&&&&/&&&&A/g; + s/1011&&&&/&&&&B/g; + s/1100&&&&/&&&&C/g; + s/1101&&&&/&&&&D/g; + s/1110&&&&/&&&&E/g; + s/1111&&&&/&&&&F/g; + } + s/000&&&&/&&&&0/g; + s/001&&&&/&&&&1/g; + s/010&&&&/&&&&2/g; + s/011&&&&/&&&&3/g; + s/100&&&&/&&&&4/g; + s/101&&&&/&&&&5/g; + s/110&&&&/&&&&6/g; + s/111&&&&/&&&&7/g; + s/00&&&&/&&&&0/g; + s/01&&&&/&&&&1/g; + s/10&&&&/&&&&2/g; + s/11&&&&/&&&&3/g; + s/0&&&&/&&&&0/g; + s/1&&&&/&&&&1/g; + s/conv&&&&/0x/g; + } + + if ( /commandline/) + { + if( /-bigend/) + { + $bigend=1; + } + } + + if ( /\bDCDU\b/ ) + { + my $cmd=$_; + my $value; + my $prefix; + my $w1; + my $w2; + my $w3; + my $w4; + + s/\s+DCDU\b/@ $&/; + + $cmd =~ /\bDCDU\b\s+0x(\d+)/; + $value = $1; + $value =~ /(\w\w)(\w\w)(\w\w)(\w\w)/; + $w1 = $1; + $w2 = $2; + $w3 = $3; + $w4 = $4; + + if( $bigend ne "") + { + # big endian + $prefix = "\t.byte\t0x".$w1.";". + "\t.byte\t0x".$w2.";". + "\t.byte\t0x".$w3.";". + "\t.byte\t0x".$w4."; "; + } + else + { + # little endian + $prefix = "\t.byte\t0x".$w4.";". + "\t.byte\t0x".$w3.";". + "\t.byte\t0x".$w2.";". + "\t.byte\t0x".$w1."; "; + } + $_=$prefix.$_; + } + + if ( /\badrl\b/i ) + { + s/\badrl\s+(\w+)\s*,\s*(\w+)/ldr $1,=$2/i; + $addPadding = 1; + } + s/\bEND\b/@ END/; +} continue { + printf ("%s", $_) if $printit; + if ($addPadding != 0) + { + printf (" mov r0,r0\n"); + $addPadding = 0; + } +} +#If we had a code section, mark that this object doesn't need an executable +# stack. +if ($nxstack && !$apple) { + printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n"); +} diff --git a/external/opus-1.3.1/celt/arm/arm_celt_map.c b/external/opus-1.3.1/celt/arm/arm_celt_map.c new file mode 100644 index 00000000..ca988b66 --- /dev/null +++ b/external/opus-1.3.1/celt/arm/arm_celt_map.c @@ -0,0 +1,160 @@ +/* Copyright (c) 2010 Xiph.Org Foundation + * Copyright (c) 2013 Parrot */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pitch.h" +#include "kiss_fft.h" +#include "mdct.h" + +#if defined(OPUS_HAVE_RTCD) + +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) +opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N) = { + celt_inner_prod_c, /* ARMv4 */ + celt_inner_prod_c, /* EDSP */ + celt_inner_prod_c, /* Media */ + celt_inner_prod_neon /* NEON */ +}; + +void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, + int N, opus_val32 *xy1, opus_val32 *xy2) = { + dual_inner_prod_c, /* ARMv4 */ + dual_inner_prod_c, /* EDSP */ + dual_inner_prod_c, /* Media */ + dual_inner_prod_neon /* NEON */ +}; +# endif + +# if defined(FIXED_POINT) +# if ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \ + (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \ + (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP))) +opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, + const opus_val16 *, opus_val32 *, int, int, int) = { + celt_pitch_xcorr_c, /* ARMv4 */ + MAY_HAVE_EDSP(celt_pitch_xcorr), /* EDSP */ + MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */ + MAY_HAVE_NEON(celt_pitch_xcorr) /* NEON */ +}; + +# endif +# else /* !FIXED_POINT */ +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) +void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, + const opus_val16 *, opus_val32 *, int, int, int) = { + celt_pitch_xcorr_c, /* ARMv4 */ + celt_pitch_xcorr_c, /* EDSP */ + celt_pitch_xcorr_c, /* Media */ + celt_pitch_xcorr_float_neon /* Neon */ +}; +# endif +# endif /* FIXED_POINT */ + +#if defined(FIXED_POINT) && defined(OPUS_HAVE_RTCD) && \ + defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) + +void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])( + const opus_val16 *x, + const opus_val16 *y, + opus_val32 sum[4], + int len +) = { + xcorr_kernel_c, /* ARMv4 */ + xcorr_kernel_c, /* EDSP */ + xcorr_kernel_c, /* Media */ + xcorr_kernel_neon_fixed, /* Neon */ +}; + +#endif + +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# if defined(HAVE_ARM_NE10) +# if defined(CUSTOM_MODES) +int (*const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])(kiss_fft_state *st) = { + opus_fft_alloc_arch_c, /* ARMv4 */ + opus_fft_alloc_arch_c, /* EDSP */ + opus_fft_alloc_arch_c, /* Media */ + opus_fft_alloc_arm_neon /* Neon with NE10 library support */ +}; + +void (*const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])(kiss_fft_state *st) = { + opus_fft_free_arch_c, /* ARMv4 */ + opus_fft_free_arch_c, /* EDSP */ + opus_fft_free_arch_c, /* Media */ + opus_fft_free_arm_neon /* Neon with NE10 */ +}; +# endif /* CUSTOM_MODES */ + +void (*const OPUS_FFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, + const kiss_fft_cpx *fin, + kiss_fft_cpx *fout) = { + opus_fft_c, /* ARMv4 */ + opus_fft_c, /* EDSP */ + opus_fft_c, /* Media */ + opus_fft_neon /* Neon with NE10 */ +}; + +void (*const OPUS_IFFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, + const kiss_fft_cpx *fin, + kiss_fft_cpx *fout) = { + opus_ifft_c, /* ARMv4 */ + opus_ifft_c, /* EDSP */ + opus_ifft_c, /* Media */ + opus_ifft_neon /* Neon with NE10 */ +}; + +void (*const CLT_MDCT_FORWARD_IMPL[OPUS_ARCHMASK+1])(const mdct_lookup *l, + kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, + int overlap, int shift, + int stride, int arch) = { + clt_mdct_forward_c, /* ARMv4 */ + clt_mdct_forward_c, /* EDSP */ + clt_mdct_forward_c, /* Media */ + clt_mdct_forward_neon /* Neon with NE10 */ +}; + +void (*const CLT_MDCT_BACKWARD_IMPL[OPUS_ARCHMASK+1])(const mdct_lookup *l, + kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, + int overlap, int shift, + int stride, int arch) = { + clt_mdct_backward_c, /* ARMv4 */ + clt_mdct_backward_c, /* EDSP */ + clt_mdct_backward_c, /* Media */ + clt_mdct_backward_neon /* Neon with NE10 */ +}; + +# endif /* HAVE_ARM_NE10 */ +# endif /* OPUS_ARM_MAY_HAVE_NEON_INTR */ + +#endif /* OPUS_HAVE_RTCD */ diff --git a/external/opus-1.3.1/celt/arm/armcpu.c b/external/opus-1.3.1/celt/arm/armcpu.c new file mode 100644 index 00000000..694a63b7 --- /dev/null +++ b/external/opus-1.3.1/celt/arm/armcpu.c @@ -0,0 +1,185 @@ +/* Copyright (c) 2010 Xiph.Org Foundation + * Copyright (c) 2013 Parrot */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* Original code from libtheora modified to suit to Opus */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef OPUS_HAVE_RTCD + +#include "armcpu.h" +#include "cpu_support.h" +#include "os_support.h" +#include "opus_types.h" +#include "arch.h" + +#define OPUS_CPU_ARM_V4_FLAG (1< + +static OPUS_INLINE opus_uint32 opus_cpu_capabilities(void){ + opus_uint32 flags; + flags=0; + /* MSVC has no OPUS_INLINE __asm support for ARM, but it does let you __emit + * instructions via their assembled hex code. + * All of these instructions should be essentially nops. */ +# if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_MEDIA) \ + || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) + __try{ + /*PLD [r13]*/ + __emit(0xF5DDF000); + flags|=OPUS_CPU_ARM_EDSP_FLAG; + } + __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ + /*Ignore exception.*/ + } +# if defined(OPUS_ARM_MAY_HAVE_MEDIA) \ + || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) + __try{ + /*SHADD8 r3,r3,r3*/ + __emit(0xE6333F93); + flags|=OPUS_CPU_ARM_MEDIA_FLAG; + } + __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ + /*Ignore exception.*/ + } +# if defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) + __try{ + /*VORR q0,q0,q0*/ + __emit(0xF2200150); + flags|=OPUS_CPU_ARM_NEON_FLAG; + } + __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ + /*Ignore exception.*/ + } +# endif +# endif +# endif + return flags; +} + +#elif defined(__linux__) +/* Linux based */ +opus_uint32 opus_cpu_capabilities(void) +{ + opus_uint32 flags = 0; + FILE *cpuinfo; + + /* Reading /proc/self/auxv would be easier, but that doesn't work reliably on + * Android */ + cpuinfo = fopen("/proc/cpuinfo", "r"); + + if(cpuinfo != NULL) + { + /* 512 should be enough for anybody (it's even enough for all the flags that + * x86 has accumulated... so far). */ + char buf[512]; + + while(fgets(buf, 512, cpuinfo) != NULL) + { +# if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_MEDIA) \ + || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) + /* Search for edsp and neon flag */ + if(memcmp(buf, "Features", 8) == 0) + { + char *p; + p = strstr(buf, " edsp"); + if(p != NULL && (p[5] == ' ' || p[5] == '\n')) + flags |= OPUS_CPU_ARM_EDSP_FLAG; + +# if defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) + p = strstr(buf, " neon"); + if(p != NULL && (p[5] == ' ' || p[5] == '\n')) + flags |= OPUS_CPU_ARM_NEON_FLAG; +# endif + } +# endif + +# if defined(OPUS_ARM_MAY_HAVE_MEDIA) \ + || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) + /* Search for media capabilities (>= ARMv6) */ + if(memcmp(buf, "CPU architecture:", 17) == 0) + { + int version; + version = atoi(buf+17); + + if(version >= 6) + flags |= OPUS_CPU_ARM_MEDIA_FLAG; + } +# endif + } + + fclose(cpuinfo); + } + return flags; +} +#else +/* The feature registers which can tell us what the processor supports are + * accessible in priveleged modes only, so we can't have a general user-space + * detection method like on x86.*/ +# error "Configured to use ARM asm but no CPU detection method available for " \ + "your platform. Reconfigure with --disable-rtcd (or send patches)." +#endif + +int opus_select_arch(void) +{ + opus_uint32 flags = opus_cpu_capabilities(); + int arch = 0; + + if(!(flags & OPUS_CPU_ARM_EDSP_FLAG)) { + /* Asserts ensure arch values are sequential */ + celt_assert(arch == OPUS_ARCH_ARM_V4); + return arch; + } + arch++; + + if(!(flags & OPUS_CPU_ARM_MEDIA_FLAG)) { + celt_assert(arch == OPUS_ARCH_ARM_EDSP); + return arch; + } + arch++; + + if(!(flags & OPUS_CPU_ARM_NEON_FLAG)) { + celt_assert(arch == OPUS_ARCH_ARM_MEDIA); + return arch; + } + arch++; + + celt_assert(arch == OPUS_ARCH_ARM_NEON); + return arch; +} + +#endif diff --git a/external/opus-1.3.1/celt/arm/armcpu.h b/external/opus-1.3.1/celt/arm/armcpu.h new file mode 100644 index 00000000..820262ff --- /dev/null +++ b/external/opus-1.3.1/celt/arm/armcpu.h @@ -0,0 +1,77 @@ +/* Copyright (c) 2010 Xiph.Org Foundation + * Copyright (c) 2013 Parrot */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if !defined(ARMCPU_H) +# define ARMCPU_H + +# if defined(OPUS_ARM_MAY_HAVE_EDSP) +# define MAY_HAVE_EDSP(name) name ## _edsp +# else +# define MAY_HAVE_EDSP(name) name ## _c +# endif + +# if defined(OPUS_ARM_MAY_HAVE_MEDIA) +# define MAY_HAVE_MEDIA(name) name ## _media +# else +# define MAY_HAVE_MEDIA(name) MAY_HAVE_EDSP(name) +# endif + +# if defined(OPUS_ARM_MAY_HAVE_NEON) +# define MAY_HAVE_NEON(name) name ## _neon +# else +# define MAY_HAVE_NEON(name) MAY_HAVE_MEDIA(name) +# endif + +# if defined(OPUS_ARM_PRESUME_EDSP) +# define PRESUME_EDSP(name) name ## _edsp +# else +# define PRESUME_EDSP(name) name ## _c +# endif + +# if defined(OPUS_ARM_PRESUME_MEDIA) +# define PRESUME_MEDIA(name) name ## _media +# else +# define PRESUME_MEDIA(name) PRESUME_EDSP(name) +# endif + +# if defined(OPUS_ARM_PRESUME_NEON) +# define PRESUME_NEON(name) name ## _neon +# else +# define PRESUME_NEON(name) PRESUME_MEDIA(name) +# endif + +# if defined(OPUS_HAVE_RTCD) +int opus_select_arch(void); + +#define OPUS_ARCH_ARM_V4 (0) +#define OPUS_ARCH_ARM_EDSP (1) +#define OPUS_ARCH_ARM_MEDIA (2) +#define OPUS_ARCH_ARM_NEON (3) + +# endif + +#endif diff --git a/external/opus-1.0.3/celt/pitch.h b/external/opus-1.3.1/celt/arm/armopts.s.in similarity index 68% rename from external/opus-1.0.3/celt/pitch.h rename to external/opus-1.3.1/celt/arm/armopts.s.in index 2757071a..3d8aaf27 100644 --- a/external/opus-1.0.3/celt/pitch.h +++ b/external/opus-1.3.1/celt/arm/armopts.s.in @@ -1,11 +1,4 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Written by Jean-Marc Valin */ -/** - @file pitch.h - @brief Pitch analysis - */ - +/* Copyright (C) 2013 Mozilla Corporation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -31,18 +24,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef PITCH_H -#define PITCH_H - -#include "modes.h" - -void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp, - int len, int C); +; Set the following to 1 if we have EDSP instructions +; (LDRD/STRD, etc., ARMv5E and later). +OPUS_ARM_MAY_HAVE_EDSP * @OPUS_ARM_MAY_HAVE_EDSP@ -void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y, - int len, int max_pitch, int *pitch); +; Set the following to 1 if we have ARMv6 media instructions. +OPUS_ARM_MAY_HAVE_MEDIA * @OPUS_ARM_MAY_HAVE_MEDIA@ -opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, - int N, int *T0, int prev_period, opus_val16 prev_gain); +; Set the following to 1 if we have NEON (some ARMv7) +OPUS_ARM_MAY_HAVE_NEON * @OPUS_ARM_MAY_HAVE_NEON@ -#endif +END diff --git a/external/opus-1.3.1/celt/arm/celt_fft_ne10.c b/external/opus-1.3.1/celt/arm/celt_fft_ne10.c new file mode 100644 index 00000000..ea5fd780 --- /dev/null +++ b/external/opus-1.3.1/celt/arm/celt_fft_ne10.c @@ -0,0 +1,173 @@ +/* Copyright (c) 2015 Xiph.Org Foundation + Written by Viswanath Puttagunta */ +/** + @file celt_fft_ne10.c + @brief ARM Neon optimizations for fft using NE10 library + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef SKIP_CONFIG_H +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#endif + +#include +#include "os_support.h" +#include "kiss_fft.h" +#include "stack_alloc.h" + +#if !defined(FIXED_POINT) +# define NE10_FFT_ALLOC_C2C_TYPE_NEON ne10_fft_alloc_c2c_float32_neon +# define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_float32_t +# define NE10_FFT_STATE_TYPE_T ne10_fft_state_float32_t +# define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_float32 +# define NE10_FFT_CPX_TYPE_T ne10_fft_cpx_float32_t +# define NE10_FFT_C2C_1D_TYPE_NEON ne10_fft_c2c_1d_float32_neon +#else +# define NE10_FFT_ALLOC_C2C_TYPE_NEON(nfft) ne10_fft_alloc_c2c_int32_neon(nfft) +# define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_int32_t +# define NE10_FFT_STATE_TYPE_T ne10_fft_state_int32_t +# define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_int32 +# define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_int32 +# define NE10_FFT_CPX_TYPE_T ne10_fft_cpx_int32_t +# define NE10_FFT_C2C_1D_TYPE_NEON ne10_fft_c2c_1d_int32_neon +#endif + +#if defined(CUSTOM_MODES) + +/* nfft lengths in NE10 that support scaled fft */ +# define NE10_FFTSCALED_SUPPORT_MAX 4 +static const int ne10_fft_scaled_support[NE10_FFTSCALED_SUPPORT_MAX] = { + 480, 240, 120, 60 +}; + +int opus_fft_alloc_arm_neon(kiss_fft_state *st) +{ + int i; + size_t memneeded = sizeof(struct arch_fft_state); + + st->arch_fft = (arch_fft_state *)opus_alloc(memneeded); + if (!st->arch_fft) + return -1; + + for (i = 0; i < NE10_FFTSCALED_SUPPORT_MAX; i++) { + if(st->nfft == ne10_fft_scaled_support[i]) + break; + } + if (i == NE10_FFTSCALED_SUPPORT_MAX) { + /* This nfft length (scaled fft) is not supported in NE10 */ + st->arch_fft->is_supported = 0; + st->arch_fft->priv = NULL; + } + else { + st->arch_fft->is_supported = 1; + st->arch_fft->priv = (void *)NE10_FFT_ALLOC_C2C_TYPE_NEON(st->nfft); + if (st->arch_fft->priv == NULL) { + return -1; + } + } + return 0; +} + +void opus_fft_free_arm_neon(kiss_fft_state *st) +{ + NE10_FFT_CFG_TYPE_T cfg; + + if (!st->arch_fft) + return; + + cfg = (NE10_FFT_CFG_TYPE_T)st->arch_fft->priv; + if (cfg) + NE10_FFT_DESTROY_C2C_TYPE(cfg); + opus_free(st->arch_fft); +} +#endif + +void opus_fft_neon(const kiss_fft_state *st, + const kiss_fft_cpx *fin, + kiss_fft_cpx *fout) +{ + NE10_FFT_STATE_TYPE_T state; + NE10_FFT_CFG_TYPE_T cfg = &state; + VARDECL(NE10_FFT_CPX_TYPE_T, buffer); + SAVE_STACK; + ALLOC(buffer, st->nfft, NE10_FFT_CPX_TYPE_T); + + if (!st->arch_fft->is_supported) { + /* This nfft length (scaled fft) not supported in NE10 */ + opus_fft_c(st, fin, fout); + } + else { + memcpy((void *)cfg, st->arch_fft->priv, sizeof(NE10_FFT_STATE_TYPE_T)); + state.buffer = (NE10_FFT_CPX_TYPE_T *)&buffer[0]; +#if !defined(FIXED_POINT) + state.is_forward_scaled = 1; + + NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout, + (NE10_FFT_CPX_TYPE_T *)fin, + cfg, 0); +#else + NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout, + (NE10_FFT_CPX_TYPE_T *)fin, + cfg, 0, 1); +#endif + } + RESTORE_STACK; +} + +void opus_ifft_neon(const kiss_fft_state *st, + const kiss_fft_cpx *fin, + kiss_fft_cpx *fout) +{ + NE10_FFT_STATE_TYPE_T state; + NE10_FFT_CFG_TYPE_T cfg = &state; + VARDECL(NE10_FFT_CPX_TYPE_T, buffer); + SAVE_STACK; + ALLOC(buffer, st->nfft, NE10_FFT_CPX_TYPE_T); + + if (!st->arch_fft->is_supported) { + /* This nfft length (scaled fft) not supported in NE10 */ + opus_ifft_c(st, fin, fout); + } + else { + memcpy((void *)cfg, st->arch_fft->priv, sizeof(NE10_FFT_STATE_TYPE_T)); + state.buffer = (NE10_FFT_CPX_TYPE_T *)&buffer[0]; +#if !defined(FIXED_POINT) + state.is_backward_scaled = 0; + + NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout, + (NE10_FFT_CPX_TYPE_T *)fin, + cfg, 1); +#else + NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout, + (NE10_FFT_CPX_TYPE_T *)fin, + cfg, 1, 0); +#endif + } + RESTORE_STACK; +} diff --git a/external/opus-1.3.1/celt/arm/celt_mdct_ne10.c b/external/opus-1.3.1/celt/arm/celt_mdct_ne10.c new file mode 100644 index 00000000..3531d02d --- /dev/null +++ b/external/opus-1.3.1/celt/arm/celt_mdct_ne10.c @@ -0,0 +1,258 @@ +/* Copyright (c) 2015 Xiph.Org Foundation + Written by Viswanath Puttagunta */ +/** + @file celt_mdct_ne10.c + @brief ARM Neon optimizations for mdct using NE10 library + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef SKIP_CONFIG_H +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#endif + +#include "kiss_fft.h" +#include "_kiss_fft_guts.h" +#include "mdct.h" +#include "stack_alloc.h" + +void clt_mdct_forward_neon(const mdct_lookup *l, + kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, + int overlap, int shift, int stride, int arch) +{ + int i; + int N, N2, N4; + VARDECL(kiss_fft_scalar, f); + VARDECL(kiss_fft_cpx, f2); + const kiss_fft_state *st = l->kfft[shift]; + const kiss_twiddle_scalar *trig; + + SAVE_STACK; + + N = l->n; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } + N2 = N>>1; + N4 = N>>2; + + ALLOC(f, N2, kiss_fft_scalar); + ALLOC(f2, N4, kiss_fft_cpx); + + /* Consider the input to be composed of four blocks: [a, b, c, d] */ + /* Window, shuffle, fold */ + { + /* Temp pointers to make it really clear to the compiler what we're doing */ + const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1); + const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1); + kiss_fft_scalar * OPUS_RESTRICT yp = f; + const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1); + const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1; + for(i=0;i<((overlap+3)>>2);i++) + { + /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ + *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2); + *yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]); + xp1+=2; + xp2-=2; + wp1+=2; + wp2-=2; + } + wp1 = window; + wp2 = window+overlap-1; + for(;i>2);i++) + { + /* Real part arranged as a-bR, Imag part arranged as -c-dR */ + *yp++ = *xp2; + *yp++ = *xp1; + xp1+=2; + xp2-=2; + } + for(;ii,t[N4+i]) - S_MUL(fp->r,t[i]); + yi = S_MUL(fp->r,t[N4+i]) + S_MUL(fp->i,t[i]); + *yp1 = yr; + *yp2 = yi; + fp++; + yp1 += 2*stride; + yp2 -= 2*stride; + } + } + RESTORE_STACK; +} + +void clt_mdct_backward_neon(const mdct_lookup *l, + kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 * OPUS_RESTRICT window, + int overlap, int shift, int stride, int arch) +{ + int i; + int N, N2, N4; + VARDECL(kiss_fft_scalar, f); + const kiss_twiddle_scalar *trig; + const kiss_fft_state *st = l->kfft[shift]; + + N = l->n; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } + N2 = N>>1; + N4 = N>>2; + + ALLOC(f, N2, kiss_fft_scalar); + + /* Pre-rotate */ + { + /* Temp pointers to make it really clear to the compiler what we're doing */ + const kiss_fft_scalar * OPUS_RESTRICT xp1 = in; + const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1); + kiss_fft_scalar * OPUS_RESTRICT yp = f; + const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0]; + for(i=0;i>1)), arch); + + /* Post-rotate and de-shuffle from both ends of the buffer at once to make + it in-place. */ + { + kiss_fft_scalar * yp0 = out+(overlap>>1); + kiss_fft_scalar * yp1 = out+(overlap>>1)+N2-2; + const kiss_twiddle_scalar *t = &trig[0]; + /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the + middle pair will be computed twice. */ + for(i=0;i<(N4+1)>>1;i++) + { + kiss_fft_scalar re, im, yr, yi; + kiss_twiddle_scalar t0, t1; + re = yp0[0]; + im = yp0[1]; + t0 = t[i]; + t1 = t[N4+i]; + /* We'd scale up by 2 here, but instead it's done when mixing the windows */ + yr = S_MUL(re,t0) + S_MUL(im,t1); + yi = S_MUL(re,t1) - S_MUL(im,t0); + re = yp1[0]; + im = yp1[1]; + yp0[0] = yr; + yp1[1] = yi; + + t0 = t[(N4-i-1)]; + t1 = t[(N2-i-1)]; + /* We'd scale up by 2 here, but instead it's done when mixing the windows */ + yr = S_MUL(re,t0) + S_MUL(im,t1); + yi = S_MUL(re,t1) - S_MUL(im,t0); + yp1[0] = yr; + yp0[1] = yi; + yp0 += 2; + yp1 -= 2; + } + } + + /* Mirror on both sides for TDAC */ + { + kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1; + kiss_fft_scalar * OPUS_RESTRICT yp1 = out; + const opus_val16 * OPUS_RESTRICT wp1 = window; + const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1; + + for(i = 0; i < overlap/2; i++) + { + kiss_fft_scalar x1, x2; + x1 = *xp1; + x2 = *yp1; + *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1); + *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1); + wp1++; + wp2--; + } + } + RESTORE_STACK; +} diff --git a/external/opus-1.3.1/celt/arm/celt_neon_intr.c b/external/opus-1.3.1/celt/arm/celt_neon_intr.c new file mode 100644 index 00000000..effda769 --- /dev/null +++ b/external/opus-1.3.1/celt/arm/celt_neon_intr.c @@ -0,0 +1,211 @@ +/* Copyright (c) 2014-2015 Xiph.Org Foundation + Written by Viswanath Puttagunta */ +/** + @file celt_neon_intr.c + @brief ARM Neon Intrinsic optimizations for celt + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "../pitch.h" + +#if defined(FIXED_POINT) +void xcorr_kernel_neon_fixed(const opus_val16 * x, const opus_val16 * y, opus_val32 sum[4], int len) +{ + int j; + int32x4_t a = vld1q_s32(sum); + /* Load y[0...3] */ + /* This requires len>0 to always be valid (which we assert in the C code). */ + int16x4_t y0 = vld1_s16(y); + y += 4; + + for (j = 0; j + 8 <= len; j += 8) + { + /* Load x[0...7] */ + int16x8_t xx = vld1q_s16(x); + int16x4_t x0 = vget_low_s16(xx); + int16x4_t x4 = vget_high_s16(xx); + /* Load y[4...11] */ + int16x8_t yy = vld1q_s16(y); + int16x4_t y4 = vget_low_s16(yy); + int16x4_t y8 = vget_high_s16(yy); + int32x4_t a0 = vmlal_lane_s16(a, y0, x0, 0); + int32x4_t a1 = vmlal_lane_s16(a0, y4, x4, 0); + + int16x4_t y1 = vext_s16(y0, y4, 1); + int16x4_t y5 = vext_s16(y4, y8, 1); + int32x4_t a2 = vmlal_lane_s16(a1, y1, x0, 1); + int32x4_t a3 = vmlal_lane_s16(a2, y5, x4, 1); + + int16x4_t y2 = vext_s16(y0, y4, 2); + int16x4_t y6 = vext_s16(y4, y8, 2); + int32x4_t a4 = vmlal_lane_s16(a3, y2, x0, 2); + int32x4_t a5 = vmlal_lane_s16(a4, y6, x4, 2); + + int16x4_t y3 = vext_s16(y0, y4, 3); + int16x4_t y7 = vext_s16(y4, y8, 3); + int32x4_t a6 = vmlal_lane_s16(a5, y3, x0, 3); + int32x4_t a7 = vmlal_lane_s16(a6, y7, x4, 3); + + y0 = y8; + a = a7; + x += 8; + y += 8; + } + + for (; j < len; j++) + { + int16x4_t x0 = vld1_dup_s16(x); /* load next x */ + int32x4_t a0 = vmlal_s16(a, y0, x0); + + int16x4_t y4 = vld1_dup_s16(y); /* load next y */ + y0 = vext_s16(y0, y4, 1); + a = a0; + x++; + y++; + } + + vst1q_s32(sum, a); +} + +#else +/* + * Function: xcorr_kernel_neon_float + * --------------------------------- + * Computes 4 correlation values and stores them in sum[4] + */ +static void xcorr_kernel_neon_float(const float32_t *x, const float32_t *y, + float32_t sum[4], int len) { + float32x4_t YY[3]; + float32x4_t YEXT[3]; + float32x4_t XX[2]; + float32x2_t XX_2; + float32x4_t SUMM; + const float32_t *xi = x; + const float32_t *yi = y; + + celt_assert(len>0); + + YY[0] = vld1q_f32(yi); + SUMM = vdupq_n_f32(0); + + /* Consume 8 elements in x vector and 12 elements in y + * vector. However, the 12'th element never really gets + * touched in this loop. So, if len == 8, then we only + * must access y[0] to y[10]. y[11] must not be accessed + * hence make sure len > 8 and not len >= 8 + */ + while (len > 8) { + yi += 4; + YY[1] = vld1q_f32(yi); + yi += 4; + YY[2] = vld1q_f32(yi); + + XX[0] = vld1q_f32(xi); + xi += 4; + XX[1] = vld1q_f32(xi); + xi += 4; + + SUMM = vmlaq_lane_f32(SUMM, YY[0], vget_low_f32(XX[0]), 0); + YEXT[0] = vextq_f32(YY[0], YY[1], 1); + SUMM = vmlaq_lane_f32(SUMM, YEXT[0], vget_low_f32(XX[0]), 1); + YEXT[1] = vextq_f32(YY[0], YY[1], 2); + SUMM = vmlaq_lane_f32(SUMM, YEXT[1], vget_high_f32(XX[0]), 0); + YEXT[2] = vextq_f32(YY[0], YY[1], 3); + SUMM = vmlaq_lane_f32(SUMM, YEXT[2], vget_high_f32(XX[0]), 1); + + SUMM = vmlaq_lane_f32(SUMM, YY[1], vget_low_f32(XX[1]), 0); + YEXT[0] = vextq_f32(YY[1], YY[2], 1); + SUMM = vmlaq_lane_f32(SUMM, YEXT[0], vget_low_f32(XX[1]), 1); + YEXT[1] = vextq_f32(YY[1], YY[2], 2); + SUMM = vmlaq_lane_f32(SUMM, YEXT[1], vget_high_f32(XX[1]), 0); + YEXT[2] = vextq_f32(YY[1], YY[2], 3); + SUMM = vmlaq_lane_f32(SUMM, YEXT[2], vget_high_f32(XX[1]), 1); + + YY[0] = YY[2]; + len -= 8; + } + + /* Consume 4 elements in x vector and 8 elements in y + * vector. However, the 8'th element in y never really gets + * touched in this loop. So, if len == 4, then we only + * must access y[0] to y[6]. y[7] must not be accessed + * hence make sure len>4 and not len>=4 + */ + if (len > 4) { + yi += 4; + YY[1] = vld1q_f32(yi); + + XX[0] = vld1q_f32(xi); + xi += 4; + + SUMM = vmlaq_lane_f32(SUMM, YY[0], vget_low_f32(XX[0]), 0); + YEXT[0] = vextq_f32(YY[0], YY[1], 1); + SUMM = vmlaq_lane_f32(SUMM, YEXT[0], vget_low_f32(XX[0]), 1); + YEXT[1] = vextq_f32(YY[0], YY[1], 2); + SUMM = vmlaq_lane_f32(SUMM, YEXT[1], vget_high_f32(XX[0]), 0); + YEXT[2] = vextq_f32(YY[0], YY[1], 3); + SUMM = vmlaq_lane_f32(SUMM, YEXT[2], vget_high_f32(XX[0]), 1); + + YY[0] = YY[1]; + len -= 4; + } + + while (--len > 0) { + XX_2 = vld1_dup_f32(xi++); + SUMM = vmlaq_lane_f32(SUMM, YY[0], XX_2, 0); + YY[0]= vld1q_f32(++yi); + } + + XX_2 = vld1_dup_f32(xi); + SUMM = vmlaq_lane_f32(SUMM, YY[0], XX_2, 0); + + vst1q_f32(sum, SUMM); +} + +void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y, + opus_val32 *xcorr, int len, int max_pitch, int arch) { + int i; + (void)arch; + celt_assert(max_pitch > 0); + celt_sig_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); + + for (i = 0; i < (max_pitch-3); i += 4) { + xcorr_kernel_neon_float((const float32_t *)_x, (const float32_t *)_y+i, + (float32_t *)xcorr+i, len); + } + + /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */ + for (; i < max_pitch; i++) { + xcorr[i] = celt_inner_prod_neon(_x, _y+i, len); + } +} +#endif diff --git a/external/opus-1.3.1/celt/arm/celt_pitch_xcorr_arm.s b/external/opus-1.3.1/celt/arm/celt_pitch_xcorr_arm.s new file mode 100644 index 00000000..6e873afc --- /dev/null +++ b/external/opus-1.3.1/celt/arm/celt_pitch_xcorr_arm.s @@ -0,0 +1,551 @@ +; Copyright (c) 2007-2008 CSIRO +; Copyright (c) 2007-2009 Xiph.Org Foundation +; Copyright (c) 2013 Parrot +; Written by Aurélien Zanelli +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; - Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; +; - Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + AREA |.text|, CODE, READONLY + + GET celt/arm/armopts.s + +IF OPUS_ARM_MAY_HAVE_EDSP + EXPORT celt_pitch_xcorr_edsp +ENDIF + +IF OPUS_ARM_MAY_HAVE_NEON + EXPORT celt_pitch_xcorr_neon +ENDIF + +IF OPUS_ARM_MAY_HAVE_NEON + +; Compute sum[k]=sum(x[j]*y[j+k],j=0...len-1), k=0...3 +xcorr_kernel_neon PROC +xcorr_kernel_neon_start + ; input: + ; r3 = int len + ; r4 = opus_val16 *x + ; r5 = opus_val16 *y + ; q0 = opus_val32 sum[4] + ; output: + ; q0 = opus_val32 sum[4] + ; preserved: r0-r3, r6-r11, d2, q4-q7, q9-q15 + ; internal usage: + ; r12 = int j + ; d3 = y_3|y_2|y_1|y_0 + ; q2 = y_B|y_A|y_9|y_8|y_7|y_6|y_5|y_4 + ; q3 = x_7|x_6|x_5|x_4|x_3|x_2|x_1|x_0 + ; q8 = scratch + ; + ; Load y[0...3] + ; This requires len>0 to always be valid (which we assert in the C code). + VLD1.16 {d5}, [r5]! + SUBS r12, r3, #8 + BLE xcorr_kernel_neon_process4 +; Process 8 samples at a time. +; This loop loads one y value more than we actually need. Therefore we have to +; stop as soon as there are 8 or fewer samples left (instead of 7), to avoid +; reading past the end of the array. +xcorr_kernel_neon_process8 + ; This loop has 19 total instructions (10 cycles to issue, minimum), with + ; - 2 cycles of ARM insrtuctions, + ; - 10 cycles of load/store/byte permute instructions, and + ; - 9 cycles of data processing instructions. + ; On a Cortex A8, we dual-issue the maximum amount (9 cycles) between the + ; latter two categories, meaning the whole loop should run in 10 cycles per + ; iteration, barring cache misses. + ; + ; Load x[0...7] + VLD1.16 {d6, d7}, [r4]! + ; Unlike VMOV, VAND is a data processsing instruction (and doesn't get + ; assembled to VMOV, like VORR would), so it dual-issues with the prior VLD1. + VAND d3, d5, d5 + SUBS r12, r12, #8 + ; Load y[4...11] + VLD1.16 {d4, d5}, [r5]! + VMLAL.S16 q0, d3, d6[0] + VEXT.16 d16, d3, d4, #1 + VMLAL.S16 q0, d4, d7[0] + VEXT.16 d17, d4, d5, #1 + VMLAL.S16 q0, d16, d6[1] + VEXT.16 d16, d3, d4, #2 + VMLAL.S16 q0, d17, d7[1] + VEXT.16 d17, d4, d5, #2 + VMLAL.S16 q0, d16, d6[2] + VEXT.16 d16, d3, d4, #3 + VMLAL.S16 q0, d17, d7[2] + VEXT.16 d17, d4, d5, #3 + VMLAL.S16 q0, d16, d6[3] + VMLAL.S16 q0, d17, d7[3] + BGT xcorr_kernel_neon_process8 +; Process 4 samples here if we have > 4 left (still reading one extra y value). +xcorr_kernel_neon_process4 + ADDS r12, r12, #4 + BLE xcorr_kernel_neon_process2 + ; Load x[0...3] + VLD1.16 d6, [r4]! + ; Use VAND since it's a data processing instruction again. + VAND d4, d5, d5 + SUB r12, r12, #4 + ; Load y[4...7] + VLD1.16 d5, [r5]! + VMLAL.S16 q0, d4, d6[0] + VEXT.16 d16, d4, d5, #1 + VMLAL.S16 q0, d16, d6[1] + VEXT.16 d16, d4, d5, #2 + VMLAL.S16 q0, d16, d6[2] + VEXT.16 d16, d4, d5, #3 + VMLAL.S16 q0, d16, d6[3] +; Process 2 samples here if we have > 2 left (still reading one extra y value). +xcorr_kernel_neon_process2 + ADDS r12, r12, #2 + BLE xcorr_kernel_neon_process1 + ; Load x[0...1] + VLD2.16 {d6[],d7[]}, [r4]! + ; Use VAND since it's a data processing instruction again. + VAND d4, d5, d5 + SUB r12, r12, #2 + ; Load y[4...5] + VLD1.32 {d5[]}, [r5]! + VMLAL.S16 q0, d4, d6 + VEXT.16 d16, d4, d5, #1 + ; Replace bottom copy of {y5,y4} in d5 with {y3,y2} from d4, using VSRI + ; instead of VEXT, since it's a data-processing instruction. + VSRI.64 d5, d4, #32 + VMLAL.S16 q0, d16, d7 +; Process 1 sample using the extra y value we loaded above. +xcorr_kernel_neon_process1 + ; Load next *x + VLD1.16 {d6[]}, [r4]! + ADDS r12, r12, #1 + ; y[0...3] are left in d5 from prior iteration(s) (if any) + VMLAL.S16 q0, d5, d6 + MOVLE pc, lr +; Now process 1 last sample, not reading ahead. + ; Load last *y + VLD1.16 {d4[]}, [r5]! + VSRI.64 d4, d5, #16 + ; Load last *x + VLD1.16 {d6[]}, [r4]! + VMLAL.S16 q0, d4, d6 + MOV pc, lr + ENDP + +; opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y, +; opus_val32 *xcorr, int len, int max_pitch, int arch) +celt_pitch_xcorr_neon PROC + ; input: + ; r0 = opus_val16 *_x + ; r1 = opus_val16 *_y + ; r2 = opus_val32 *xcorr + ; r3 = int len + ; output: + ; r0 = int maxcorr + ; internal usage: + ; r4 = opus_val16 *x (for xcorr_kernel_neon()) + ; r5 = opus_val16 *y (for xcorr_kernel_neon()) + ; r6 = int max_pitch + ; r12 = int j + ; q15 = int maxcorr[4] (q15 is not used by xcorr_kernel_neon()) + ; ignored: + ; int arch + STMFD sp!, {r4-r6, lr} + LDR r6, [sp, #16] + VMOV.S32 q15, #1 + ; if (max_pitch < 4) goto celt_pitch_xcorr_neon_process4_done + SUBS r6, r6, #4 + BLT celt_pitch_xcorr_neon_process4_done +celt_pitch_xcorr_neon_process4 + ; xcorr_kernel_neon parameters: + ; r3 = len, r4 = _x, r5 = _y, q0 = {0, 0, 0, 0} + MOV r4, r0 + MOV r5, r1 + VEOR q0, q0, q0 + ; xcorr_kernel_neon only modifies r4, r5, r12, and q0...q3. + ; So we don't save/restore any other registers. + BL xcorr_kernel_neon_start + SUBS r6, r6, #4 + VST1.32 {q0}, [r2]! + ; _y += 4 + ADD r1, r1, #8 + VMAX.S32 q15, q15, q0 + ; if (max_pitch < 4) goto celt_pitch_xcorr_neon_process4_done + BGE celt_pitch_xcorr_neon_process4 +; We have less than 4 sums left to compute. +celt_pitch_xcorr_neon_process4_done + ADDS r6, r6, #4 + ; Reduce maxcorr to a single value + VMAX.S32 d30, d30, d31 + VPMAX.S32 d30, d30, d30 + ; if (max_pitch <= 0) goto celt_pitch_xcorr_neon_done + BLE celt_pitch_xcorr_neon_done +; Now compute each remaining sum one at a time. +celt_pitch_xcorr_neon_process_remaining + MOV r4, r0 + MOV r5, r1 + VMOV.I32 q0, #0 + SUBS r12, r3, #8 + BLT celt_pitch_xcorr_neon_process_remaining4 +; Sum terms 8 at a time. +celt_pitch_xcorr_neon_process_remaining_loop8 + ; Load x[0...7] + VLD1.16 {q1}, [r4]! + ; Load y[0...7] + VLD1.16 {q2}, [r5]! + SUBS r12, r12, #8 + VMLAL.S16 q0, d4, d2 + VMLAL.S16 q0, d5, d3 + BGE celt_pitch_xcorr_neon_process_remaining_loop8 +; Sum terms 4 at a time. +celt_pitch_xcorr_neon_process_remaining4 + ADDS r12, r12, #4 + BLT celt_pitch_xcorr_neon_process_remaining4_done + ; Load x[0...3] + VLD1.16 {d2}, [r4]! + ; Load y[0...3] + VLD1.16 {d3}, [r5]! + SUB r12, r12, #4 + VMLAL.S16 q0, d3, d2 +celt_pitch_xcorr_neon_process_remaining4_done + ; Reduce the sum to a single value. + VADD.S32 d0, d0, d1 + VPADDL.S32 d0, d0 + ADDS r12, r12, #4 + BLE celt_pitch_xcorr_neon_process_remaining_loop_done +; Sum terms 1 at a time. +celt_pitch_xcorr_neon_process_remaining_loop1 + VLD1.16 {d2[]}, [r4]! + VLD1.16 {d3[]}, [r5]! + SUBS r12, r12, #1 + VMLAL.S16 q0, d2, d3 + BGT celt_pitch_xcorr_neon_process_remaining_loop1 +celt_pitch_xcorr_neon_process_remaining_loop_done + VST1.32 {d0[0]}, [r2]! + VMAX.S32 d30, d30, d0 + SUBS r6, r6, #1 + ; _y++ + ADD r1, r1, #2 + ; if (--max_pitch > 0) goto celt_pitch_xcorr_neon_process_remaining + BGT celt_pitch_xcorr_neon_process_remaining +celt_pitch_xcorr_neon_done + VMOV.32 r0, d30[0] + LDMFD sp!, {r4-r6, pc} + ENDP + +ENDIF + +IF OPUS_ARM_MAY_HAVE_EDSP + +; This will get used on ARMv7 devices without NEON, so it has been optimized +; to take advantage of dual-issuing where possible. +xcorr_kernel_edsp PROC +xcorr_kernel_edsp_start + ; input: + ; r3 = int len + ; r4 = opus_val16 *_x (must be 32-bit aligned) + ; r5 = opus_val16 *_y (must be 32-bit aligned) + ; r6...r9 = opus_val32 sum[4] + ; output: + ; r6...r9 = opus_val32 sum[4] + ; preserved: r0-r5 + ; internal usage + ; r2 = int j + ; r12,r14 = opus_val16 x[4] + ; r10,r11 = opus_val16 y[4] + STMFD sp!, {r2,r4,r5,lr} + LDR r10, [r5], #4 ; Load y[0...1] + SUBS r2, r3, #4 ; j = len-4 + LDR r11, [r5], #4 ; Load y[2...3] + BLE xcorr_kernel_edsp_process4_done + LDR r12, [r4], #4 ; Load x[0...1] + ; Stall +xcorr_kernel_edsp_process4 + ; The multiplies must issue from pipeline 0, and can't dual-issue with each + ; other. Every other instruction here dual-issues with a multiply, and is + ; thus "free". There should be no stalls in the body of the loop. + SMLABB r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x_0,y_0) + LDR r14, [r4], #4 ; Load x[2...3] + SMLABT r7, r12, r10, r7 ; sum[1] = MAC16_16(sum[1],x_0,y_1) + SUBS r2, r2, #4 ; j-=4 + SMLABB r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x_0,y_2) + SMLABT r9, r12, r11, r9 ; sum[3] = MAC16_16(sum[3],x_0,y_3) + SMLATT r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x_1,y_1) + LDR r10, [r5], #4 ; Load y[4...5] + SMLATB r7, r12, r11, r7 ; sum[1] = MAC16_16(sum[1],x_1,y_2) + SMLATT r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x_1,y_3) + SMLATB r9, r12, r10, r9 ; sum[3] = MAC16_16(sum[3],x_1,y_4) + LDRGT r12, [r4], #4 ; Load x[0...1] + SMLABB r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],x_2,y_2) + SMLABT r7, r14, r11, r7 ; sum[1] = MAC16_16(sum[1],x_2,y_3) + SMLABB r8, r14, r10, r8 ; sum[2] = MAC16_16(sum[2],x_2,y_4) + SMLABT r9, r14, r10, r9 ; sum[3] = MAC16_16(sum[3],x_2,y_5) + SMLATT r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],x_3,y_3) + LDR r11, [r5], #4 ; Load y[6...7] + SMLATB r7, r14, r10, r7 ; sum[1] = MAC16_16(sum[1],x_3,y_4) + SMLATT r8, r14, r10, r8 ; sum[2] = MAC16_16(sum[2],x_3,y_5) + SMLATB r9, r14, r11, r9 ; sum[3] = MAC16_16(sum[3],x_3,y_6) + BGT xcorr_kernel_edsp_process4 +xcorr_kernel_edsp_process4_done + ADDS r2, r2, #4 + BLE xcorr_kernel_edsp_done + LDRH r12, [r4], #2 ; r12 = *x++ + SUBS r2, r2, #1 ; j-- + ; Stall + SMLABB r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x,y_0) + LDRHGT r14, [r4], #2 ; r14 = *x++ + SMLABT r7, r12, r10, r7 ; sum[1] = MAC16_16(sum[1],x,y_1) + SMLABB r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x,y_2) + SMLABT r9, r12, r11, r9 ; sum[3] = MAC16_16(sum[3],x,y_3) + BLE xcorr_kernel_edsp_done + SMLABT r6, r14, r10, r6 ; sum[0] = MAC16_16(sum[0],x,y_1) + SUBS r2, r2, #1 ; j-- + SMLABB r7, r14, r11, r7 ; sum[1] = MAC16_16(sum[1],x,y_2) + LDRH r10, [r5], #2 ; r10 = y_4 = *y++ + SMLABT r8, r14, r11, r8 ; sum[2] = MAC16_16(sum[2],x,y_3) + LDRHGT r12, [r4], #2 ; r12 = *x++ + SMLABB r9, r14, r10, r9 ; sum[3] = MAC16_16(sum[3],x,y_4) + BLE xcorr_kernel_edsp_done + SMLABB r6, r12, r11, r6 ; sum[0] = MAC16_16(sum[0],tmp,y_2) + CMP r2, #1 ; j-- + SMLABT r7, r12, r11, r7 ; sum[1] = MAC16_16(sum[1],tmp,y_3) + LDRH r2, [r5], #2 ; r2 = y_5 = *y++ + SMLABB r8, r12, r10, r8 ; sum[2] = MAC16_16(sum[2],tmp,y_4) + LDRHGT r14, [r4] ; r14 = *x + SMLABB r9, r12, r2, r9 ; sum[3] = MAC16_16(sum[3],tmp,y_5) + BLE xcorr_kernel_edsp_done + SMLABT r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],tmp,y_3) + LDRH r11, [r5] ; r11 = y_6 = *y + SMLABB r7, r14, r10, r7 ; sum[1] = MAC16_16(sum[1],tmp,y_4) + SMLABB r8, r14, r2, r8 ; sum[2] = MAC16_16(sum[2],tmp,y_5) + SMLABB r9, r14, r11, r9 ; sum[3] = MAC16_16(sum[3],tmp,y_6) +xcorr_kernel_edsp_done + LDMFD sp!, {r2,r4,r5,pc} + ENDP + +celt_pitch_xcorr_edsp PROC + ; input: + ; r0 = opus_val16 *_x (must be 32-bit aligned) + ; r1 = opus_val16 *_y (only needs to be 16-bit aligned) + ; r2 = opus_val32 *xcorr + ; r3 = int len + ; output: + ; r0 = maxcorr + ; internal usage + ; r4 = opus_val16 *x + ; r5 = opus_val16 *y + ; r6 = opus_val32 sum0 + ; r7 = opus_val32 sum1 + ; r8 = opus_val32 sum2 + ; r9 = opus_val32 sum3 + ; r1 = int max_pitch + ; r12 = int j + ; ignored: + ; int arch + STMFD sp!, {r4-r11, lr} + MOV r5, r1 + LDR r1, [sp, #36] + MOV r4, r0 + TST r5, #3 + ; maxcorr = 1 + MOV r0, #1 + BEQ celt_pitch_xcorr_edsp_process1u_done +; Compute one sum at the start to make y 32-bit aligned. + SUBS r12, r3, #4 + ; r14 = sum = 0 + MOV r14, #0 + LDRH r8, [r5], #2 + BLE celt_pitch_xcorr_edsp_process1u_loop4_done + LDR r6, [r4], #4 + MOV r8, r8, LSL #16 +celt_pitch_xcorr_edsp_process1u_loop4 + LDR r9, [r5], #4 + SMLABT r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0) + LDR r7, [r4], #4 + SMLATB r14, r6, r9, r14 ; sum = MAC16_16(sum, x_1, y_1) + LDR r8, [r5], #4 + SMLABT r14, r7, r9, r14 ; sum = MAC16_16(sum, x_2, y_2) + SUBS r12, r12, #4 ; j-=4 + SMLATB r14, r7, r8, r14 ; sum = MAC16_16(sum, x_3, y_3) + LDRGT r6, [r4], #4 + BGT celt_pitch_xcorr_edsp_process1u_loop4 + MOV r8, r8, LSR #16 +celt_pitch_xcorr_edsp_process1u_loop4_done + ADDS r12, r12, #4 +celt_pitch_xcorr_edsp_process1u_loop1 + LDRHGE r6, [r4], #2 + ; Stall + SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, *x, *y) + SUBSGE r12, r12, #1 + LDRHGT r8, [r5], #2 + BGT celt_pitch_xcorr_edsp_process1u_loop1 + ; Restore _x + SUB r4, r4, r3, LSL #1 + ; Restore and advance _y + SUB r5, r5, r3, LSL #1 + ; maxcorr = max(maxcorr, sum) + CMP r0, r14 + ADD r5, r5, #2 + MOVLT r0, r14 + SUBS r1, r1, #1 + ; xcorr[i] = sum + STR r14, [r2], #4 + BLE celt_pitch_xcorr_edsp_done +celt_pitch_xcorr_edsp_process1u_done + ; if (max_pitch < 4) goto celt_pitch_xcorr_edsp_process2 + SUBS r1, r1, #4 + BLT celt_pitch_xcorr_edsp_process2 +celt_pitch_xcorr_edsp_process4 + ; xcorr_kernel_edsp parameters: + ; r3 = len, r4 = _x, r5 = _y, r6...r9 = sum[4] = {0, 0, 0, 0} + MOV r6, #0 + MOV r7, #0 + MOV r8, #0 + MOV r9, #0 + BL xcorr_kernel_edsp_start ; xcorr_kernel_edsp(_x, _y+i, xcorr+i, len) + ; maxcorr = max(maxcorr, sum0, sum1, sum2, sum3) + CMP r0, r6 + ; _y+=4 + ADD r5, r5, #8 + MOVLT r0, r6 + CMP r0, r7 + MOVLT r0, r7 + CMP r0, r8 + MOVLT r0, r8 + CMP r0, r9 + MOVLT r0, r9 + STMIA r2!, {r6-r9} + SUBS r1, r1, #4 + BGE celt_pitch_xcorr_edsp_process4 +celt_pitch_xcorr_edsp_process2 + ADDS r1, r1, #2 + BLT celt_pitch_xcorr_edsp_process1a + SUBS r12, r3, #4 + ; {r10, r11} = {sum0, sum1} = {0, 0} + MOV r10, #0 + MOV r11, #0 + LDR r8, [r5], #4 + BLE celt_pitch_xcorr_edsp_process2_loop_done + LDR r6, [r4], #4 + LDR r9, [r5], #4 +celt_pitch_xcorr_edsp_process2_loop4 + SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0) + LDR r7, [r4], #4 + SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1) + SUBS r12, r12, #4 ; j-=4 + SMLATT r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_1, y_1) + LDR r8, [r5], #4 + SMLATB r11, r6, r9, r11 ; sum1 = MAC16_16(sum1, x_1, y_2) + LDRGT r6, [r4], #4 + SMLABB r10, r7, r9, r10 ; sum0 = MAC16_16(sum0, x_2, y_2) + SMLABT r11, r7, r9, r11 ; sum1 = MAC16_16(sum1, x_2, y_3) + SMLATT r10, r7, r9, r10 ; sum0 = MAC16_16(sum0, x_3, y_3) + LDRGT r9, [r5], #4 + SMLATB r11, r7, r8, r11 ; sum1 = MAC16_16(sum1, x_3, y_4) + BGT celt_pitch_xcorr_edsp_process2_loop4 +celt_pitch_xcorr_edsp_process2_loop_done + ADDS r12, r12, #2 + BLE celt_pitch_xcorr_edsp_process2_1 + LDR r6, [r4], #4 + ; Stall + SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0) + LDR r9, [r5], #4 + SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1) + SUB r12, r12, #2 + SMLATT r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_1, y_1) + MOV r8, r9 + SMLATB r11, r6, r9, r11 ; sum1 = MAC16_16(sum1, x_1, y_2) +celt_pitch_xcorr_edsp_process2_1 + LDRH r6, [r4], #2 + ADDS r12, r12, #1 + ; Stall + SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0) + LDRHGT r7, [r4], #2 + SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1) + BLE celt_pitch_xcorr_edsp_process2_done + LDRH r9, [r5], #2 + SMLABT r10, r7, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_1) + SMLABB r11, r7, r9, r11 ; sum1 = MAC16_16(sum1, x_0, y_2) +celt_pitch_xcorr_edsp_process2_done + ; Restore _x + SUB r4, r4, r3, LSL #1 + ; Restore and advance _y + SUB r5, r5, r3, LSL #1 + ; maxcorr = max(maxcorr, sum0) + CMP r0, r10 + ADD r5, r5, #2 + MOVLT r0, r10 + SUB r1, r1, #2 + ; maxcorr = max(maxcorr, sum1) + CMP r0, r11 + ; xcorr[i] = sum + STR r10, [r2], #4 + MOVLT r0, r11 + STR r11, [r2], #4 +celt_pitch_xcorr_edsp_process1a + ADDS r1, r1, #1 + BLT celt_pitch_xcorr_edsp_done + SUBS r12, r3, #4 + ; r14 = sum = 0 + MOV r14, #0 + BLT celt_pitch_xcorr_edsp_process1a_loop_done + LDR r6, [r4], #4 + LDR r8, [r5], #4 + LDR r7, [r4], #4 + LDR r9, [r5], #4 +celt_pitch_xcorr_edsp_process1a_loop4 + SMLABB r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0) + SUBS r12, r12, #4 ; j-=4 + SMLATT r14, r6, r8, r14 ; sum = MAC16_16(sum, x_1, y_1) + LDRGE r6, [r4], #4 + SMLABB r14, r7, r9, r14 ; sum = MAC16_16(sum, x_2, y_2) + LDRGE r8, [r5], #4 + SMLATT r14, r7, r9, r14 ; sum = MAC16_16(sum, x_3, y_3) + LDRGE r7, [r4], #4 + LDRGE r9, [r5], #4 + BGE celt_pitch_xcorr_edsp_process1a_loop4 +celt_pitch_xcorr_edsp_process1a_loop_done + ADDS r12, r12, #2 + LDRGE r6, [r4], #4 + LDRGE r8, [r5], #4 + ; Stall + SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0) + SUBGE r12, r12, #2 + SMLATTGE r14, r6, r8, r14 ; sum = MAC16_16(sum, x_1, y_1) + ADDS r12, r12, #1 + LDRHGE r6, [r4], #2 + LDRHGE r8, [r5], #2 + ; Stall + SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, *x, *y) + ; maxcorr = max(maxcorr, sum) + CMP r0, r14 + ; xcorr[i] = sum + STR r14, [r2], #4 + MOVLT r0, r14 +celt_pitch_xcorr_edsp_done + LDMFD sp!, {r4-r11, pc} + ENDP + +ENDIF + +END diff --git a/external/opus-1.3.1/celt/arm/fft_arm.h b/external/opus-1.3.1/celt/arm/fft_arm.h new file mode 100644 index 00000000..0b78175f --- /dev/null +++ b/external/opus-1.3.1/celt/arm/fft_arm.h @@ -0,0 +1,71 @@ +/* Copyright (c) 2015 Xiph.Org Foundation + Written by Viswanath Puttagunta */ +/** + @file fft_arm.h + @brief ARM Neon Intrinsic optimizations for fft using NE10 library + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if !defined(FFT_ARM_H) +#define FFT_ARM_H + +#include "kiss_fft.h" + +#if defined(HAVE_ARM_NE10) + +int opus_fft_alloc_arm_neon(kiss_fft_state *st); +void opus_fft_free_arm_neon(kiss_fft_state *st); + +void opus_fft_neon(const kiss_fft_state *st, + const kiss_fft_cpx *fin, + kiss_fft_cpx *fout); + +void opus_ifft_neon(const kiss_fft_state *st, + const kiss_fft_cpx *fin, + kiss_fft_cpx *fout); + +#if !defined(OPUS_HAVE_RTCD) +#define OVERRIDE_OPUS_FFT (1) + +#define opus_fft_alloc_arch(_st, arch) \ + ((void)(arch), opus_fft_alloc_arm_neon(_st)) + +#define opus_fft_free_arch(_st, arch) \ + ((void)(arch), opus_fft_free_arm_neon(_st)) + +#define opus_fft(_st, _fin, _fout, arch) \ + ((void)(arch), opus_fft_neon(_st, _fin, _fout)) + +#define opus_ifft(_st, _fin, _fout, arch) \ + ((void)(arch), opus_ifft_neon(_st, _fin, _fout)) + +#endif /* OPUS_HAVE_RTCD */ + +#endif /* HAVE_ARM_NE10 */ + +#endif diff --git a/external/opus-1.0.3/src/opus.c b/external/opus-1.3.1/celt/arm/fixed_arm64.h similarity index 76% rename from external/opus-1.0.3/src/opus.c rename to external/opus-1.3.1/celt/arm/fixed_arm64.h index d6ae7bab..c6fbd3db 100644 --- a/external/opus-1.0.3/src/opus.c +++ b/external/opus-1.3.1/celt/arm/fixed_arm64.h @@ -1,5 +1,4 @@ -/* Copyright (c) 2011 Xiph.Org Foundation, Skype Limited - Written by Jean-Marc Valin and Koen Vos */ +/* Copyright (C) 2015 Vidyo */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -25,23 +24,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif +#ifndef FIXED_ARM64_H +#define FIXED_ARM64_H -#include "opus.h" -#include "opus_private.h" +#include -int encode_size(int size, unsigned char *data) -{ - if (size < 252) - { - data[0] = size; - return 1; - } else { - data[0] = 252+(size&0x3); - data[1] = (size-(int)data[0])>>2; - return 2; - } -} +#undef SIG2WORD16 +#define SIG2WORD16(x) (vqmovns_s32(PSHR32((x), SIG_SHIFT))) +#endif diff --git a/external/opus-1.3.1/celt/arm/fixed_armv4.h b/external/opus-1.3.1/celt/arm/fixed_armv4.h new file mode 100644 index 00000000..d84888a7 --- /dev/null +++ b/external/opus-1.3.1/celt/arm/fixed_armv4.h @@ -0,0 +1,80 @@ +/* Copyright (C) 2013 Xiph.Org Foundation and contributors */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef FIXED_ARMv4_H +#define FIXED_ARMv4_H + +/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ +#undef MULT16_32_Q16 +static OPUS_INLINE opus_val32 MULT16_32_Q16_armv4(opus_val16 a, opus_val32 b) +{ + unsigned rd_lo; + int rd_hi; + __asm__( + "#MULT16_32_Q16\n\t" + "smull %0, %1, %2, %3\n\t" + : "=&r"(rd_lo), "=&r"(rd_hi) + : "%r"(b),"r"(SHL32(a,16)) + ); + return rd_hi; +} +#define MULT16_32_Q16(a, b) (MULT16_32_Q16_armv4(a, b)) + + +/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ +#undef MULT16_32_Q15 +static OPUS_INLINE opus_val32 MULT16_32_Q15_armv4(opus_val16 a, opus_val32 b) +{ + unsigned rd_lo; + int rd_hi; + __asm__( + "#MULT16_32_Q15\n\t" + "smull %0, %1, %2, %3\n\t" + : "=&r"(rd_lo), "=&r"(rd_hi) + : "%r"(b), "r"(SHL32(a,16)) + ); + /*We intentionally don't OR in the high bit of rd_lo for speed.*/ + return SHL32(rd_hi,1); +} +#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv4(a, b)) + + +/** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. + b must fit in 31 bits. + Result fits in 32 bits. */ +#undef MAC16_32_Q15 +#define MAC16_32_Q15(c, a, b) ADD32(c, MULT16_32_Q15(a, b)) + +/** 16x32 multiply, followed by a 16-bit shift right and 32-bit add. + Result fits in 32 bits. */ +#undef MAC16_32_Q16 +#define MAC16_32_Q16(c, a, b) ADD32(c, MULT16_32_Q16(a, b)) + +/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ +#undef MULT32_32_Q31 +#define MULT32_32_Q31(a,b) (opus_val32)((((opus_int64)(a)) * ((opus_int64)(b)))>>31) + +#endif diff --git a/external/opus-1.3.1/celt/arm/fixed_armv5e.h b/external/opus-1.3.1/celt/arm/fixed_armv5e.h new file mode 100644 index 00000000..6bf73cba --- /dev/null +++ b/external/opus-1.3.1/celt/arm/fixed_armv5e.h @@ -0,0 +1,151 @@ +/* Copyright (C) 2007-2009 Xiph.Org Foundation + Copyright (C) 2003-2008 Jean-Marc Valin + Copyright (C) 2007-2008 CSIRO + Copyright (C) 2013 Parrot */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef FIXED_ARMv5E_H +#define FIXED_ARMv5E_H + +#include "fixed_armv4.h" + +/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ +#undef MULT16_32_Q16 +static OPUS_INLINE opus_val32 MULT16_32_Q16_armv5e(opus_val16 a, opus_val32 b) +{ + int res; + __asm__( + "#MULT16_32_Q16\n\t" + "smulwb %0, %1, %2\n\t" + : "=r"(res) + : "r"(b),"r"(a) + ); + return res; +} +#define MULT16_32_Q16(a, b) (MULT16_32_Q16_armv5e(a, b)) + + +/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ +#undef MULT16_32_Q15 +static OPUS_INLINE opus_val32 MULT16_32_Q15_armv5e(opus_val16 a, opus_val32 b) +{ + int res; + __asm__( + "#MULT16_32_Q15\n\t" + "smulwb %0, %1, %2\n\t" + : "=r"(res) + : "r"(b), "r"(a) + ); + return SHL32(res,1); +} +#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv5e(a, b)) + + +/** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. + b must fit in 31 bits. + Result fits in 32 bits. */ +#undef MAC16_32_Q15 +static OPUS_INLINE opus_val32 MAC16_32_Q15_armv5e(opus_val32 c, opus_val16 a, + opus_val32 b) +{ + int res; + __asm__( + "#MAC16_32_Q15\n\t" + "smlawb %0, %1, %2, %3;\n" + : "=r"(res) + : "r"(SHL32(b,1)), "r"(a), "r"(c) + ); + return res; +} +#define MAC16_32_Q15(c, a, b) (MAC16_32_Q15_armv5e(c, a, b)) + +/** 16x32 multiply, followed by a 16-bit shift right and 32-bit add. + Result fits in 32 bits. */ +#undef MAC16_32_Q16 +static OPUS_INLINE opus_val32 MAC16_32_Q16_armv5e(opus_val32 c, opus_val16 a, + opus_val32 b) +{ + int res; + __asm__( + "#MAC16_32_Q16\n\t" + "smlawb %0, %1, %2, %3;\n" + : "=r"(res) + : "r"(b), "r"(a), "r"(c) + ); + return res; +} +#define MAC16_32_Q16(c, a, b) (MAC16_32_Q16_armv5e(c, a, b)) + +/** 16x16 multiply-add where the result fits in 32 bits */ +#undef MAC16_16 +static OPUS_INLINE opus_val32 MAC16_16_armv5e(opus_val32 c, opus_val16 a, + opus_val16 b) +{ + int res; + __asm__( + "#MAC16_16\n\t" + "smlabb %0, %1, %2, %3;\n" + : "=r"(res) + : "r"(a), "r"(b), "r"(c) + ); + return res; +} +#define MAC16_16(c, a, b) (MAC16_16_armv5e(c, a, b)) + +/** 16x16 multiplication where the result fits in 32 bits */ +#undef MULT16_16 +static OPUS_INLINE opus_val32 MULT16_16_armv5e(opus_val16 a, opus_val16 b) +{ + int res; + __asm__( + "#MULT16_16\n\t" + "smulbb %0, %1, %2;\n" + : "=r"(res) + : "r"(a), "r"(b) + ); + return res; +} +#define MULT16_16(a, b) (MULT16_16_armv5e(a, b)) + +#ifdef OPUS_ARM_INLINE_MEDIA + +#undef SIG2WORD16 +static OPUS_INLINE opus_val16 SIG2WORD16_armv6(opus_val32 x) +{ + celt_sig res; + __asm__( + "#SIG2WORD16\n\t" + "ssat %0, #16, %1, ASR #12\n\t" + : "=r"(res) + : "r"(x+2048) + ); + return EXTRACT16(res); +} +#define SIG2WORD16(x) (SIG2WORD16_armv6(x)) + +#endif /* OPUS_ARM_INLINE_MEDIA */ + +#endif diff --git a/external/opus-1.3.1/celt/arm/kiss_fft_armv4.h b/external/opus-1.3.1/celt/arm/kiss_fft_armv4.h new file mode 100644 index 00000000..e4faad6f --- /dev/null +++ b/external/opus-1.3.1/celt/arm/kiss_fft_armv4.h @@ -0,0 +1,121 @@ +/*Copyright (c) 2013, Xiph.Org Foundation and contributors. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE.*/ + +#ifndef KISS_FFT_ARMv4_H +#define KISS_FFT_ARMv4_H + +#if !defined(KISS_FFT_GUTS_H) +#error "This file should only be included from _kiss_fft_guts.h" +#endif + +#ifdef FIXED_POINT + +#undef C_MUL +#define C_MUL(m,a,b) \ + do{ \ + int br__; \ + int bi__; \ + int tt__; \ + __asm__ __volatile__( \ + "#C_MUL\n\t" \ + "ldrsh %[br], [%[bp], #0]\n\t" \ + "ldm %[ap], {r0,r1}\n\t" \ + "ldrsh %[bi], [%[bp], #2]\n\t" \ + "smull %[tt], %[mi], r1, %[br]\n\t" \ + "smlal %[tt], %[mi], r0, %[bi]\n\t" \ + "rsb %[bi], %[bi], #0\n\t" \ + "smull %[br], %[mr], r0, %[br]\n\t" \ + "mov %[tt], %[tt], lsr #15\n\t" \ + "smlal %[br], %[mr], r1, %[bi]\n\t" \ + "orr %[mi], %[tt], %[mi], lsl #17\n\t" \ + "mov %[br], %[br], lsr #15\n\t" \ + "orr %[mr], %[br], %[mr], lsl #17\n\t" \ + : [mr]"=r"((m).r), [mi]"=r"((m).i), \ + [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ + : [ap]"r"(&(a)), [bp]"r"(&(b)) \ + : "r0", "r1" \ + ); \ + } \ + while(0) + +#undef C_MUL4 +#define C_MUL4(m,a,b) \ + do{ \ + int br__; \ + int bi__; \ + int tt__; \ + __asm__ __volatile__( \ + "#C_MUL4\n\t" \ + "ldrsh %[br], [%[bp], #0]\n\t" \ + "ldm %[ap], {r0,r1}\n\t" \ + "ldrsh %[bi], [%[bp], #2]\n\t" \ + "smull %[tt], %[mi], r1, %[br]\n\t" \ + "smlal %[tt], %[mi], r0, %[bi]\n\t" \ + "rsb %[bi], %[bi], #0\n\t" \ + "smull %[br], %[mr], r0, %[br]\n\t" \ + "mov %[tt], %[tt], lsr #17\n\t" \ + "smlal %[br], %[mr], r1, %[bi]\n\t" \ + "orr %[mi], %[tt], %[mi], lsl #15\n\t" \ + "mov %[br], %[br], lsr #17\n\t" \ + "orr %[mr], %[br], %[mr], lsl #15\n\t" \ + : [mr]"=r"((m).r), [mi]"=r"((m).i), \ + [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ + : [ap]"r"(&(a)), [bp]"r"(&(b)) \ + : "r0", "r1" \ + ); \ + } \ + while(0) + +#undef C_MULC +#define C_MULC(m,a,b) \ + do{ \ + int br__; \ + int bi__; \ + int tt__; \ + __asm__ __volatile__( \ + "#C_MULC\n\t" \ + "ldrsh %[br], [%[bp], #0]\n\t" \ + "ldm %[ap], {r0,r1}\n\t" \ + "ldrsh %[bi], [%[bp], #2]\n\t" \ + "smull %[tt], %[mr], r0, %[br]\n\t" \ + "smlal %[tt], %[mr], r1, %[bi]\n\t" \ + "rsb %[bi], %[bi], #0\n\t" \ + "smull %[br], %[mi], r1, %[br]\n\t" \ + "mov %[tt], %[tt], lsr #15\n\t" \ + "smlal %[br], %[mi], r0, %[bi]\n\t" \ + "orr %[mr], %[tt], %[mr], lsl #17\n\t" \ + "mov %[br], %[br], lsr #15\n\t" \ + "orr %[mi], %[br], %[mi], lsl #17\n\t" \ + : [mr]"=r"((m).r), [mi]"=r"((m).i), \ + [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ + : [ap]"r"(&(a)), [bp]"r"(&(b)) \ + : "r0", "r1" \ + ); \ + } \ + while(0) + +#endif /* FIXED_POINT */ + +#endif /* KISS_FFT_ARMv4_H */ diff --git a/external/opus-1.3.1/celt/arm/kiss_fft_armv5e.h b/external/opus-1.3.1/celt/arm/kiss_fft_armv5e.h new file mode 100644 index 00000000..9eca183d --- /dev/null +++ b/external/opus-1.3.1/celt/arm/kiss_fft_armv5e.h @@ -0,0 +1,118 @@ +/*Copyright (c) 2013, Xiph.Org Foundation and contributors. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE.*/ + +#ifndef KISS_FFT_ARMv5E_H +#define KISS_FFT_ARMv5E_H + +#if !defined(KISS_FFT_GUTS_H) +#error "This file should only be included from _kiss_fft_guts.h" +#endif + +#ifdef FIXED_POINT + +#if defined(__thumb__)||defined(__thumb2__) +#define LDRD_CONS "Q" +#else +#define LDRD_CONS "Uq" +#endif + +#undef C_MUL +#define C_MUL(m,a,b) \ + do{ \ + int mr1__; \ + int mr2__; \ + int mi__; \ + long long aval__; \ + int bval__; \ + __asm__( \ + "#C_MUL\n\t" \ + "ldrd %[aval], %H[aval], %[ap]\n\t" \ + "ldr %[bval], %[bp]\n\t" \ + "smulwb %[mi], %H[aval], %[bval]\n\t" \ + "smulwb %[mr1], %[aval], %[bval]\n\t" \ + "smulwt %[mr2], %H[aval], %[bval]\n\t" \ + "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \ + : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \ + [aval]"=&r"(aval__), [bval]"=r"(bval__) \ + : [ap]LDRD_CONS(a), [bp]"m"(b) \ + ); \ + (m).r = SHL32(SUB32(mr1__, mr2__), 1); \ + (m).i = SHL32(mi__, 1); \ + } \ + while(0) + +#undef C_MUL4 +#define C_MUL4(m,a,b) \ + do{ \ + int mr1__; \ + int mr2__; \ + int mi__; \ + long long aval__; \ + int bval__; \ + __asm__( \ + "#C_MUL4\n\t" \ + "ldrd %[aval], %H[aval], %[ap]\n\t" \ + "ldr %[bval], %[bp]\n\t" \ + "smulwb %[mi], %H[aval], %[bval]\n\t" \ + "smulwb %[mr1], %[aval], %[bval]\n\t" \ + "smulwt %[mr2], %H[aval], %[bval]\n\t" \ + "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \ + : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \ + [aval]"=&r"(aval__), [bval]"=r"(bval__) \ + : [ap]LDRD_CONS(a), [bp]"m"(b) \ + ); \ + (m).r = SHR32(SUB32(mr1__, mr2__), 1); \ + (m).i = SHR32(mi__, 1); \ + } \ + while(0) + +#undef C_MULC +#define C_MULC(m,a,b) \ + do{ \ + int mr__; \ + int mi1__; \ + int mi2__; \ + long long aval__; \ + int bval__; \ + __asm__( \ + "#C_MULC\n\t" \ + "ldrd %[aval], %H[aval], %[ap]\n\t" \ + "ldr %[bval], %[bp]\n\t" \ + "smulwb %[mr], %[aval], %[bval]\n\t" \ + "smulwb %[mi1], %H[aval], %[bval]\n\t" \ + "smulwt %[mi2], %[aval], %[bval]\n\t" \ + "smlawt %[mr], %H[aval], %[bval], %[mr]\n\t" \ + : [mr]"=r"(mr__), [mi1]"=r"(mi1__), [mi2]"=r"(mi2__), \ + [aval]"=&r"(aval__), [bval]"=r"(bval__) \ + : [ap]LDRD_CONS(a), [bp]"m"(b) \ + ); \ + (m).r = SHL32(mr__, 1); \ + (m).i = SHL32(SUB32(mi1__, mi2__), 1); \ + } \ + while(0) + +#endif /* FIXED_POINT */ + +#endif /* KISS_FFT_GUTS_H */ diff --git a/external/opus-1.3.1/celt/arm/mdct_arm.h b/external/opus-1.3.1/celt/arm/mdct_arm.h new file mode 100644 index 00000000..14200bac --- /dev/null +++ b/external/opus-1.3.1/celt/arm/mdct_arm.h @@ -0,0 +1,59 @@ +/* Copyright (c) 2015 Xiph.Org Foundation + Written by Viswanath Puttagunta */ +/** + @file arm_mdct.h + @brief ARM Neon Intrinsic optimizations for mdct using NE10 library + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if !defined(MDCT_ARM_H) +#define MDCT_ARM_H + +#include "mdct.h" + +#if defined(HAVE_ARM_NE10) +/** Compute a forward MDCT and scale by 4/N, trashes the input array */ +void clt_mdct_forward_neon(const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, int overlap, + int shift, int stride, int arch); + +void clt_mdct_backward_neon(const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, int overlap, + int shift, int stride, int arch); + +#if !defined(OPUS_HAVE_RTCD) +#define OVERRIDE_OPUS_MDCT (1) +#define clt_mdct_forward(_l, _in, _out, _window, _int, _shift, _stride, _arch) \ + clt_mdct_forward_neon(_l, _in, _out, _window, _int, _shift, _stride, _arch) +#define clt_mdct_backward(_l, _in, _out, _window, _int, _shift, _stride, _arch) \ + clt_mdct_backward_neon(_l, _in, _out, _window, _int, _shift, _stride, _arch) +#endif /* OPUS_HAVE_RTCD */ +#endif /* HAVE_ARM_NE10 */ + +#endif diff --git a/external/opus-1.3.1/celt/arm/pitch_arm.h b/external/opus-1.3.1/celt/arm/pitch_arm.h new file mode 100644 index 00000000..bed8b04e --- /dev/null +++ b/external/opus-1.3.1/celt/arm/pitch_arm.h @@ -0,0 +1,160 @@ +/* Copyright (c) 2010 Xiph.Org Foundation + * Copyright (c) 2013 Parrot */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if !defined(PITCH_ARM_H) +# define PITCH_ARM_H + +# include "armcpu.h" + +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N); +void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, + const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2); + +# if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) +# define OVERRIDE_CELT_INNER_PROD (1) +# define OVERRIDE_DUAL_INNER_PROD (1) +# define celt_inner_prod(x, y, N, arch) ((void)(arch), PRESUME_NEON(celt_inner_prod)(x, y, N)) +# define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), PRESUME_NEON(dual_inner_prod)(x, y01, y02, N, xy1, xy2)) +# endif +# endif + +# if !defined(OVERRIDE_CELT_INNER_PROD) +# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) +extern opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N); +# define OVERRIDE_CELT_INNER_PROD (1) +# define celt_inner_prod(x, y, N, arch) ((*CELT_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y, N)) +# elif defined(OPUS_ARM_PRESUME_NEON_INTR) +# define OVERRIDE_CELT_INNER_PROD (1) +# define celt_inner_prod(x, y, N, arch) ((void)(arch), celt_inner_prod_neon(x, y, N)) +# endif +# endif + +# if !defined(OVERRIDE_DUAL_INNER_PROD) +# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) +extern void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, + const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2); +# define OVERRIDE_DUAL_INNER_PROD (1) +# define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((*DUAL_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y01, y02, N, xy1, xy2)) +# elif defined(OPUS_ARM_PRESUME_NEON_INTR) +# define OVERRIDE_DUAL_INNER_PROD (1) +# define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), dual_inner_prod_neon(x, y01, y02, N, xy1, xy2)) +# endif +# endif + +# if defined(FIXED_POINT) + +# if defined(OPUS_ARM_MAY_HAVE_NEON) +opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y, + opus_val32 *xcorr, int len, int max_pitch, int arch); +# endif + +# if defined(OPUS_ARM_MAY_HAVE_MEDIA) +# define celt_pitch_xcorr_media MAY_HAVE_EDSP(celt_pitch_xcorr) +# endif + +# if defined(OPUS_ARM_MAY_HAVE_EDSP) +opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y, + opus_val32 *xcorr, int len, int max_pitch, int arch); +# endif + +# if defined(OPUS_HAVE_RTCD) && \ + ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \ + (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \ + (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP))) +extern opus_val32 +(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, + const opus_val16 *, opus_val32 *, int, int, int); +# define OVERRIDE_PITCH_XCORR (1) +# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ + ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \ + xcorr, len, max_pitch, arch)) + +# elif defined(OPUS_ARM_PRESUME_EDSP) || \ + defined(OPUS_ARM_PRESUME_MEDIA) || \ + defined(OPUS_ARM_PRESUME_NEON) +# define OVERRIDE_PITCH_XCORR (1) +# define celt_pitch_xcorr (PRESUME_NEON(celt_pitch_xcorr)) + +# endif + +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +void xcorr_kernel_neon_fixed( + const opus_val16 *x, + const opus_val16 *y, + opus_val32 sum[4], + int len); +# endif + +# if defined(OPUS_HAVE_RTCD) && \ + (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) + +extern void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])( + const opus_val16 *x, + const opus_val16 *y, + opus_val32 sum[4], + int len); + +# define OVERRIDE_XCORR_KERNEL (1) +# define xcorr_kernel(x, y, sum, len, arch) \ + ((*XCORR_KERNEL_IMPL[(arch) & OPUS_ARCHMASK])(x, y, sum, len)) + +# elif defined(OPUS_ARM_PRESUME_NEON_INTR) +# define OVERRIDE_XCORR_KERNEL (1) +# define xcorr_kernel(x, y, sum, len, arch) \ + ((void)arch, xcorr_kernel_neon_fixed(x, y, sum, len)) + +# endif + +#else /* Start !FIXED_POINT */ +/* Float case */ +#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y, + opus_val32 *xcorr, int len, int max_pitch, int arch); +#endif + +# if defined(OPUS_HAVE_RTCD) && \ + (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) +extern void +(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, + const opus_val16 *, opus_val32 *, int, int, int); + +# define OVERRIDE_PITCH_XCORR (1) +# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ + ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \ + xcorr, len, max_pitch, arch)) + +# elif defined(OPUS_ARM_PRESUME_NEON_INTR) + +# define OVERRIDE_PITCH_XCORR (1) +# define celt_pitch_xcorr celt_pitch_xcorr_float_neon + +# endif + +#endif /* end !FIXED_POINT */ + +#endif diff --git a/external/opus-1.3.1/celt/arm/pitch_neon_intr.c b/external/opus-1.3.1/celt/arm/pitch_neon_intr.c new file mode 100644 index 00000000..1ac38c43 --- /dev/null +++ b/external/opus-1.3.1/celt/arm/pitch_neon_intr.c @@ -0,0 +1,290 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "pitch.h" + +#ifdef FIXED_POINT + +opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N) +{ + int i; + opus_val32 xy; + int16x8_t x_s16x8, y_s16x8; + int32x4_t xy_s32x4 = vdupq_n_s32(0); + int64x2_t xy_s64x2; + int64x1_t xy_s64x1; + + for (i = 0; i < N - 7; i += 8) { + x_s16x8 = vld1q_s16(&x[i]); + y_s16x8 = vld1q_s16(&y[i]); + xy_s32x4 = vmlal_s16(xy_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y_s16x8)); + xy_s32x4 = vmlal_s16(xy_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y_s16x8)); + } + + if (N - i >= 4) { + const int16x4_t x_s16x4 = vld1_s16(&x[i]); + const int16x4_t y_s16x4 = vld1_s16(&y[i]); + xy_s32x4 = vmlal_s16(xy_s32x4, x_s16x4, y_s16x4); + i += 4; + } + + xy_s64x2 = vpaddlq_s32(xy_s32x4); + xy_s64x1 = vadd_s64(vget_low_s64(xy_s64x2), vget_high_s64(xy_s64x2)); + xy = vget_lane_s32(vreinterpret_s32_s64(xy_s64x1), 0); + + for (; i < N; i++) { + xy = MAC16_16(xy, x[i], y[i]); + } + +#ifdef OPUS_CHECK_ASM + celt_assert(celt_inner_prod_c(x, y, N) == xy); +#endif + + return xy; +} + +void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, + int N, opus_val32 *xy1, opus_val32 *xy2) +{ + int i; + opus_val32 xy01, xy02; + int16x8_t x_s16x8, y01_s16x8, y02_s16x8; + int32x4_t xy01_s32x4 = vdupq_n_s32(0); + int32x4_t xy02_s32x4 = vdupq_n_s32(0); + int64x2_t xy01_s64x2, xy02_s64x2; + int64x1_t xy01_s64x1, xy02_s64x1; + + for (i = 0; i < N - 7; i += 8) { + x_s16x8 = vld1q_s16(&x[i]); + y01_s16x8 = vld1q_s16(&y01[i]); + y02_s16x8 = vld1q_s16(&y02[i]); + xy01_s32x4 = vmlal_s16(xy01_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y01_s16x8)); + xy02_s32x4 = vmlal_s16(xy02_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y02_s16x8)); + xy01_s32x4 = vmlal_s16(xy01_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y01_s16x8)); + xy02_s32x4 = vmlal_s16(xy02_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y02_s16x8)); + } + + if (N - i >= 4) { + const int16x4_t x_s16x4 = vld1_s16(&x[i]); + const int16x4_t y01_s16x4 = vld1_s16(&y01[i]); + const int16x4_t y02_s16x4 = vld1_s16(&y02[i]); + xy01_s32x4 = vmlal_s16(xy01_s32x4, x_s16x4, y01_s16x4); + xy02_s32x4 = vmlal_s16(xy02_s32x4, x_s16x4, y02_s16x4); + i += 4; + } + + xy01_s64x2 = vpaddlq_s32(xy01_s32x4); + xy02_s64x2 = vpaddlq_s32(xy02_s32x4); + xy01_s64x1 = vadd_s64(vget_low_s64(xy01_s64x2), vget_high_s64(xy01_s64x2)); + xy02_s64x1 = vadd_s64(vget_low_s64(xy02_s64x2), vget_high_s64(xy02_s64x2)); + xy01 = vget_lane_s32(vreinterpret_s32_s64(xy01_s64x1), 0); + xy02 = vget_lane_s32(vreinterpret_s32_s64(xy02_s64x1), 0); + + for (; i < N; i++) { + xy01 = MAC16_16(xy01, x[i], y01[i]); + xy02 = MAC16_16(xy02, x[i], y02[i]); + } + *xy1 = xy01; + *xy2 = xy02; + +#ifdef OPUS_CHECK_ASM + { + opus_val32 xy1_c, xy2_c; + dual_inner_prod_c(x, y01, y02, N, &xy1_c, &xy2_c); + celt_assert(xy1_c == *xy1); + celt_assert(xy2_c == *xy2); + } +#endif +} + +#else /* !FIXED_POINT */ + +/* ========================================================================== */ + +#ifdef OPUS_CHECK_ASM + +/* This part of code simulates floating-point NEON operations. */ + +/* celt_inner_prod_neon_float_c_simulation() simulates the floating-point */ +/* operations of celt_inner_prod_neon(), and both functions should have bit */ +/* exact output. */ +static opus_val32 celt_inner_prod_neon_float_c_simulation(const opus_val16 *x, const opus_val16 *y, int N) +{ + int i; + opus_val32 xy, xy0 = 0, xy1 = 0, xy2 = 0, xy3 = 0; + for (i = 0; i < N - 3; i += 4) { + xy0 = MAC16_16(xy0, x[i + 0], y[i + 0]); + xy1 = MAC16_16(xy1, x[i + 1], y[i + 1]); + xy2 = MAC16_16(xy2, x[i + 2], y[i + 2]); + xy3 = MAC16_16(xy3, x[i + 3], y[i + 3]); + } + xy0 += xy2; + xy1 += xy3; + xy = xy0 + xy1; + for (; i < N; i++) { + xy = MAC16_16(xy, x[i], y[i]); + } + return xy; +} + +/* dual_inner_prod_neon_float_c_simulation() simulates the floating-point */ +/* operations of dual_inner_prod_neon(), and both functions should have bit */ +/* exact output. */ +static void dual_inner_prod_neon_float_c_simulation(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, + int N, opus_val32 *xy1, opus_val32 *xy2) +{ + int i; + opus_val32 xy01, xy02, xy01_0 = 0, xy01_1 = 0, xy01_2 = 0, xy01_3 = 0, xy02_0 = 0, xy02_1 = 0, xy02_2 = 0, xy02_3 = 0; + for (i = 0; i < N - 3; i += 4) { + xy01_0 = MAC16_16(xy01_0, x[i + 0], y01[i + 0]); + xy01_1 = MAC16_16(xy01_1, x[i + 1], y01[i + 1]); + xy01_2 = MAC16_16(xy01_2, x[i + 2], y01[i + 2]); + xy01_3 = MAC16_16(xy01_3, x[i + 3], y01[i + 3]); + xy02_0 = MAC16_16(xy02_0, x[i + 0], y02[i + 0]); + xy02_1 = MAC16_16(xy02_1, x[i + 1], y02[i + 1]); + xy02_2 = MAC16_16(xy02_2, x[i + 2], y02[i + 2]); + xy02_3 = MAC16_16(xy02_3, x[i + 3], y02[i + 3]); + } + xy01_0 += xy01_2; + xy02_0 += xy02_2; + xy01_1 += xy01_3; + xy02_1 += xy02_3; + xy01 = xy01_0 + xy01_1; + xy02 = xy02_0 + xy02_1; + for (; i < N; i++) { + xy01 = MAC16_16(xy01, x[i], y01[i]); + xy02 = MAC16_16(xy02, x[i], y02[i]); + } + *xy1 = xy01; + *xy2 = xy02; +} + +#endif /* OPUS_CHECK_ASM */ + +/* ========================================================================== */ + +opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N) +{ + int i; + opus_val32 xy; + float32x4_t xy_f32x4 = vdupq_n_f32(0); + float32x2_t xy_f32x2; + + for (i = 0; i < N - 7; i += 8) { + float32x4_t x_f32x4, y_f32x4; + x_f32x4 = vld1q_f32(&x[i]); + y_f32x4 = vld1q_f32(&y[i]); + xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); + x_f32x4 = vld1q_f32(&x[i + 4]); + y_f32x4 = vld1q_f32(&y[i + 4]); + xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); + } + + if (N - i >= 4) { + const float32x4_t x_f32x4 = vld1q_f32(&x[i]); + const float32x4_t y_f32x4 = vld1q_f32(&y[i]); + xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); + i += 4; + } + + xy_f32x2 = vadd_f32(vget_low_f32(xy_f32x4), vget_high_f32(xy_f32x4)); + xy_f32x2 = vpadd_f32(xy_f32x2, xy_f32x2); + xy = vget_lane_f32(xy_f32x2, 0); + + for (; i < N; i++) { + xy = MAC16_16(xy, x[i], y[i]); + } + +#ifdef OPUS_CHECK_ASM + celt_assert(ABS32(celt_inner_prod_neon_float_c_simulation(x, y, N) - xy) <= VERY_SMALL); +#endif + + return xy; +} + +void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, + int N, opus_val32 *xy1, opus_val32 *xy2) +{ + int i; + opus_val32 xy01, xy02; + float32x4_t xy01_f32x4 = vdupq_n_f32(0); + float32x4_t xy02_f32x4 = vdupq_n_f32(0); + float32x2_t xy01_f32x2, xy02_f32x2; + + for (i = 0; i < N - 7; i += 8) { + float32x4_t x_f32x4, y01_f32x4, y02_f32x4; + x_f32x4 = vld1q_f32(&x[i]); + y01_f32x4 = vld1q_f32(&y01[i]); + y02_f32x4 = vld1q_f32(&y02[i]); + xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); + xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); + x_f32x4 = vld1q_f32(&x[i + 4]); + y01_f32x4 = vld1q_f32(&y01[i + 4]); + y02_f32x4 = vld1q_f32(&y02[i + 4]); + xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); + xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); + } + + if (N - i >= 4) { + const float32x4_t x_f32x4 = vld1q_f32(&x[i]); + const float32x4_t y01_f32x4 = vld1q_f32(&y01[i]); + const float32x4_t y02_f32x4 = vld1q_f32(&y02[i]); + xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); + xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); + i += 4; + } + + xy01_f32x2 = vadd_f32(vget_low_f32(xy01_f32x4), vget_high_f32(xy01_f32x4)); + xy02_f32x2 = vadd_f32(vget_low_f32(xy02_f32x4), vget_high_f32(xy02_f32x4)); + xy01_f32x2 = vpadd_f32(xy01_f32x2, xy01_f32x2); + xy02_f32x2 = vpadd_f32(xy02_f32x2, xy02_f32x2); + xy01 = vget_lane_f32(xy01_f32x2, 0); + xy02 = vget_lane_f32(xy02_f32x2, 0); + + for (; i < N; i++) { + xy01 = MAC16_16(xy01, x[i], y01[i]); + xy02 = MAC16_16(xy02, x[i], y02[i]); + } + *xy1 = xy01; + *xy2 = xy02; + +#ifdef OPUS_CHECK_ASM + { + opus_val32 xy1_c, xy2_c; + dual_inner_prod_neon_float_c_simulation(x, y01, y02, N, &xy1_c, &xy2_c); + celt_assert(ABS32(xy1_c - *xy1) <= VERY_SMALL); + celt_assert(ABS32(xy2_c - *xy2) <= VERY_SMALL); + } +#endif +} + +#endif /* FIXED_POINT */ diff --git a/external/opus-1.3.1/celt/bands.c b/external/opus-1.3.1/celt/bands.c new file mode 100644 index 00000000..2702963c --- /dev/null +++ b/external/opus-1.3.1/celt/bands.c @@ -0,0 +1,1672 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2008-2009 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "bands.h" +#include "modes.h" +#include "vq.h" +#include "cwrs.h" +#include "stack_alloc.h" +#include "os_support.h" +#include "mathops.h" +#include "rate.h" +#include "quant_bands.h" +#include "pitch.h" + +int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev) +{ + int i; + for (i=0;iprev && val < thresholds[prev]+hysteresis[prev]) + i=prev; + if (i thresholds[prev-1]-hysteresis[prev-1]) + i=prev; + return i; +} + +opus_uint32 celt_lcg_rand(opus_uint32 seed) +{ + return 1664525 * seed + 1013904223; +} + +/* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness + with this approximation is important because it has an impact on the bit allocation */ +opus_int16 bitexact_cos(opus_int16 x) +{ + opus_int32 tmp; + opus_int16 x2; + tmp = (4096+((opus_int32)(x)*(x)))>>13; + celt_sig_assert(tmp<=32767); + x2 = tmp; + x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2))))); + celt_sig_assert(x2<=32766); + return 1+x2; +} + +int bitexact_log2tan(int isin,int icos) +{ + int lc; + int ls; + lc=EC_ILOG(icos); + ls=EC_ILOG(isin); + icos<<=15-lc; + isin<<=15-ls; + return (ls-lc)*(1<<11) + +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932) + -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932); +} + +#ifdef FIXED_POINT +/* Compute the amplitude (sqrt energy) in each of the bands */ +void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch) +{ + int i, c, N; + const opus_int16 *eBands = m->eBands; + (void)arch; + N = m->shortMdctSize< 0) + { + int shift = celt_ilog2(maxval) - 14 + (((m->logN[i]>>BITRES)+LM+1)>>1); + j=eBands[i]<0) + { + do { + sum = MAC16_16(sum, EXTRACT16(SHR32(X[j+c*N],shift)), + EXTRACT16(SHR32(X[j+c*N],shift))); + } while (++jnbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift); + } else { + bandE[i+c*m->nbEBands] = EPSILON; + } + /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ + } + } while (++ceBands; + N = M*m->shortMdctSize; + c=0; do { + i=0; do { + opus_val16 g; + int j,shift; + opus_val16 E; + shift = celt_zlog2(bandE[i+c*m->nbEBands])-13; + E = VSHR32(bandE[i+c*m->nbEBands], shift); + g = EXTRACT16(celt_rcp(SHL32(E,3))); + j=M*eBands[i]; do { + X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); + } while (++jeBands; + N = m->shortMdctSize<nbEBands] = celt_sqrt(sum); + /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ + } + } while (++ceBands; + N = M*m->shortMdctSize; + c=0; do { + for (i=0;inbEBands]); + for (j=M*eBands[i];jeBands; + N = M*m->shortMdctSize; + bound = M*eBands[end]; + if (downsample!=1) + bound = IMIN(bound, N/downsample); + if (silence) + { + bound = 0; + start = end = 0; + } + f = freq; + x = X+M*eBands[start]; + for (i=0;i>DB_SHIFT); + if (shift>31) + { + shift=0; + g=0; + } else { + /* Handle the fractional part. */ + g = celt_exp2_frac(lg&((1< 16384 we'd be likely to overflow, so we're + capping the gain here, which is equivalent to a cap of 18 on lg. + This shouldn't trigger unless the bitstream is already corrupted. */ + if (shift <= -2) + { + g = 16384; + shift = -2; + } + do { + *f++ = SHL32(MULT16_16(*x++, g), -shift); + } while (++jeBands[i+1]-m->eBands[i]; + /* depth in 1/8 bits */ + celt_sig_assert(pulses[i]>=0); + depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM; + +#ifdef FIXED_POINT + thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1); + thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32)); + { + opus_val32 t; + t = N0<>1; + t = SHL32(t, (7-shift)<<1); + sqrt_1 = celt_rsqrt_norm(t); + } +#else + thresh = .5f*celt_exp2(-.125f*depth); + sqrt_1 = celt_rsqrt(N0<nbEBands+i]; + prev2 = prev2logE[c*m->nbEBands+i]; + if (C==1) + { + prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]); + prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]); + } + Ediff = EXTEND32(logE[c*m->nbEBands+i])-EXTEND32(MIN16(prev1,prev2)); + Ediff = MAX32(0, Ediff); + +#ifdef FIXED_POINT + if (Ediff < 16384) + { + opus_val32 r32 = SHR32(celt_exp2(-EXTRACT16(Ediff)),1); + r = 2*MIN16(16383,r32); + } else { + r = 0; + } + if (LM==3) + r = MULT16_16_Q14(23170, MIN32(23169, r)); + r = SHR16(MIN16(thresh, r),1); + r = SHR32(MULT16_16_Q15(sqrt_1, r),shift); +#else + /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because + short blocks don't have the same energy as long */ + r = 2.f*celt_exp2(-Ediff); + if (LM==3) + r *= 1.41421356f; + r = MIN16(thresh, r); + r = r*sqrt_1; +#endif + X = X_+c*size+(m->eBands[i]<nbEBands]))-13; +#endif + left = VSHR32(bandE[i],shift); + right = VSHR32(bandE[i+m->nbEBands],shift); + norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right)); + a1 = DIV32_16(SHL32(EXTEND32(left),14),norm); + a2 = DIV32_16(SHL32(EXTEND32(right),14),norm); + for (j=0;j>1; + kr = celt_ilog2(Er)>>1; +#endif + t = VSHR32(El, (kl-7)<<1); + lgain = celt_rsqrt_norm(t); + t = VSHR32(Er, (kr-7)<<1); + rgain = celt_rsqrt_norm(t); + +#ifdef FIXED_POINT + if (kl < 7) + kl = 7; + if (kr < 7) + kr = 7; +#endif + + for (j=0;jeBands; + int decision; + int hf_sum=0; + + celt_assert(end>0); + + N0 = M*m->shortMdctSize; + + if (M*(eBands[end]-eBands[end-1]) <= 8) + return SPREAD_NONE; + c=0; do { + for (i=0;im->nbEBands-4) + hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N); + tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); + sum += tmp*spread_weight[i]; + nbBands+=spread_weight[i]; + } + } while (++cnbEBands+end)); + *hf_average = (*hf_average+hf_sum)>>1; + hf_sum = *hf_average; + if (*tapset_decision==2) + hf_sum += 4; + else if (*tapset_decision==0) + hf_sum -= 4; + if (hf_sum > 22) + *tapset_decision=2; + else if (hf_sum > 18) + *tapset_decision=1; + else + *tapset_decision=0; + } + /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ + celt_assert(nbBands>0); /* end has to be non-zero */ + celt_assert(sum>=0); + sum = celt_udiv((opus_int32)sum<<8, nbBands); + /* Recursive averaging */ + sum = (sum+*average)>>1; + *average = sum; + /* Hysteresis */ + sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2; + if (sum < 80) + { + decision = SPREAD_AGGRESSIVE; + } else if (sum < 256) + { + decision = SPREAD_NORMAL; + } else if (sum < 384) + { + decision = SPREAD_LIGHT; + } else { + decision = SPREAD_NONE; + } +#ifdef FUZZING + decision = rand()&0x3; + *tapset_decision=rand()%3; +#endif + return decision; +} + +/* Indexing table for converting from natural Hadamard to ordery Hadamard + This is essentially a bit-reversed Gray, on top of which we've added + an inversion of the order because we want the DC at the end rather than + the beginning. The lines are for N=2, 4, 8, 16 */ +static const int ordery_table[] = { + 1, 0, + 3, 0, 2, 1, + 7, 0, 4, 3, 6, 1, 5, 2, + 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5, +}; + +static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard) +{ + int i,j; + VARDECL(celt_norm, tmp); + int N; + SAVE_STACK; + N = N0*stride; + ALLOC(tmp, N, celt_norm); + celt_assert(stride>0); + if (hadamard) + { + const int *ordery = ordery_table+stride-2; + for (i=0;i>= 1; + for (i=0;i>1)) { + qn = 1; + } else { + qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES)); + qn = (qn+1)>>1<<1; + } + celt_assert(qn <= 256); + return qn; +} + +struct band_ctx { + int encode; + int resynth; + const CELTMode *m; + int i; + int intensity; + int spread; + int tf_change; + ec_ctx *ec; + opus_int32 remaining_bits; + const celt_ener *bandE; + opus_uint32 seed; + int arch; + int theta_round; + int disable_inv; + int avoid_split_noise; +}; + +struct split_ctx { + int inv; + int imid; + int iside; + int delta; + int itheta; + int qalloc; +}; + +static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, + celt_norm *X, celt_norm *Y, int N, int *b, int B, int B0, + int LM, + int stereo, int *fill) +{ + int qn; + int itheta=0; + int delta; + int imid, iside; + int qalloc; + int pulse_cap; + int offset; + opus_int32 tell; + int inv=0; + int encode; + const CELTMode *m; + int i; + int intensity; + ec_ctx *ec; + const celt_ener *bandE; + + encode = ctx->encode; + m = ctx->m; + i = ctx->i; + intensity = ctx->intensity; + ec = ctx->ec; + bandE = ctx->bandE; + + /* Decide on the resolution to give to the split parameter theta */ + pulse_cap = m->logN[i]+LM*(1<>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET); + qn = compute_qn(N, *b, offset, pulse_cap, stereo); + if (stereo && i>=intensity) + qn = 1; + if (encode) + { + /* theta is the atan() of the ratio between the (normalized) + side and mid. With just that parameter, we can re-scale both + mid and side because we know that 1) they have unit norm and + 2) they are orthogonal. */ + itheta = stereo_itheta(X, Y, stereo, N, ctx->arch); + } + tell = ec_tell_frac(ec); + if (qn!=1) + { + if (encode) + { + if (!stereo || ctx->theta_round == 0) + { + itheta = (itheta*(opus_int32)qn+8192)>>14; + if (!stereo && ctx->avoid_split_noise && itheta > 0 && itheta < qn) + { + /* Check if the selected value of theta will cause the bit allocation + to inject noise on one side. If so, make sure the energy of that side + is zero. */ + int unquantized = celt_udiv((opus_int32)itheta*16384, qn); + imid = bitexact_cos((opus_int16)unquantized); + iside = bitexact_cos((opus_int16)(16384-unquantized)); + delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid)); + if (delta > *b) + itheta = qn; + else if (delta < -*b) + itheta = 0; + } + } else { + int down; + /* Bias quantization towards itheta=0 and itheta=16384. */ + int bias = itheta > 8192 ? 32767/qn : -32767/qn; + down = IMIN(qn-1, IMAX(0, (itheta*(opus_int32)qn + bias)>>14)); + if (ctx->theta_round < 0) + itheta = down; + else + itheta = down+1; + } + } + /* Entropy coding of the angle. We use a uniform pdf for the + time split, a step for stereo, and a triangular one for the rest. */ + if (stereo && N>2) + { + int p0 = 3; + int x = itheta; + int x0 = qn/2; + int ft = p0*(x0+1) + x0; + /* Use a probability of p0 up to itheta=8192 and then use 1 after */ + if (encode) + { + ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); + } else { + int fs; + fs=ec_decode(ec,ft); + if (fs<(x0+1)*p0) + x=fs/p0; + else + x=x0+1+(fs-(x0+1)*p0); + ec_dec_update(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); + itheta = x; + } + } else if (B0>1 || stereo) { + /* Uniform pdf */ + if (encode) + ec_enc_uint(ec, itheta, qn+1); + else + itheta = ec_dec_uint(ec, qn+1); + } else { + int fs=1, ft; + ft = ((qn>>1)+1)*((qn>>1)+1); + if (encode) + { + int fl; + + fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta; + fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 : + ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); + + ec_encode(ec, fl, fl+fs, ft); + } else { + /* Triangular pdf */ + int fl=0; + int fm; + fm = ec_decode(ec, ft); + + if (fm < ((qn>>1)*((qn>>1) + 1)>>1)) + { + itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1; + fs = itheta + 1; + fl = itheta*(itheta + 1)>>1; + } + else + { + itheta = (2*(qn + 1) + - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1; + fs = qn + 1 - itheta; + fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); + } + + ec_dec_update(ec, fl, fl+fs, ft); + } + } + celt_assert(itheta>=0); + itheta = celt_udiv((opus_int32)itheta*16384, qn); + if (encode && stereo) + { + if (itheta==0) + intensity_stereo(m, X, Y, bandE, i, N); + else + stereo_split(X, Y, N); + } + /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate. + Let's do that at higher complexity */ + } else if (stereo) { + if (encode) + { + inv = itheta > 8192 && !ctx->disable_inv; + if (inv) + { + int j; + for (j=0;j2<remaining_bits > 2<disable_inv) + inv = 0; + itheta = 0; + } + qalloc = ec_tell_frac(ec) - tell; + *b -= qalloc; + + if (itheta == 0) + { + imid = 32767; + iside = 0; + *fill &= (1<inv = inv; + sctx->imid = imid; + sctx->iside = iside; + sctx->delta = delta; + sctx->itheta = itheta; + sctx->qalloc = qalloc; +} +static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, int b, + celt_norm *lowband_out) +{ + int c; + int stereo; + celt_norm *x = X; + int encode; + ec_ctx *ec; + + encode = ctx->encode; + ec = ctx->ec; + + stereo = Y != NULL; + c=0; do { + int sign=0; + if (ctx->remaining_bits>=1<remaining_bits -= 1<resynth) + x[0] = sign ? -NORM_SCALING : NORM_SCALING; + x = Y; + } while (++c<1+stereo); + if (lowband_out) + lowband_out[0] = SHR16(X[0],4); + return 1; +} + +/* This function is responsible for encoding and decoding a mono partition. + It can split the band in two and transmit the energy difference with + the two half-bands. It can be called recursively so bands can end up being + split in 8 parts. */ +static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, + int N, int b, int B, celt_norm *lowband, + int LM, + opus_val16 gain, int fill) +{ + const unsigned char *cache; + int q; + int curr_bits; + int imid=0, iside=0; + int B0=B; + opus_val16 mid=0, side=0; + unsigned cm=0; + celt_norm *Y=NULL; + int encode; + const CELTMode *m; + int i; + int spread; + ec_ctx *ec; + + encode = ctx->encode; + m = ctx->m; + i = ctx->i; + spread = ctx->spread; + ec = ctx->ec; + + /* If we need 1.5 more bit than we can produce, split the band in two. */ + cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i]; + if (LM != -1 && b > cache[cache[0]]+12 && N>2) + { + int mbits, sbits, delta; + int itheta; + int qalloc; + struct split_ctx sctx; + celt_norm *next_lowband2=NULL; + opus_int32 rebalance; + + N >>= 1; + Y = X+N; + LM -= 1; + if (B==1) + fill = (fill&1)|(fill<<1); + B = (B+1)>>1; + + compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill); + imid = sctx.imid; + iside = sctx.iside; + delta = sctx.delta; + itheta = sctx.itheta; + qalloc = sctx.qalloc; +#ifdef FIXED_POINT + mid = imid; + side = iside; +#else + mid = (1.f/32768)*imid; + side = (1.f/32768)*iside; +#endif + + /* Give more bits to low-energy MDCTs than they would otherwise deserve */ + if (B0>1 && (itheta&0x3fff)) + { + if (itheta > 8192) + /* Rough approximation for pre-echo masking */ + delta -= delta>>(4-LM); + else + /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */ + delta = IMIN(0, delta + (N<>(5-LM))); + } + mbits = IMAX(0, IMIN(b, (b-delta)/2)); + sbits = b-mbits; + ctx->remaining_bits -= qalloc; + + if (lowband) + next_lowband2 = lowband+N; /* >32-bit split case */ + + rebalance = ctx->remaining_bits; + if (mbits >= sbits) + { + cm = quant_partition(ctx, X, N, mbits, B, lowband, LM, + MULT16_16_P15(gain,mid), fill); + rebalance = mbits - (rebalance-ctx->remaining_bits); + if (rebalance > 3<>B)<<(B0>>1); + } else { + cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, + MULT16_16_P15(gain,side), fill>>B)<<(B0>>1); + rebalance = sbits - (rebalance-ctx->remaining_bits); + if (rebalance > 3<remaining_bits -= curr_bits; + + /* Ensures we can never bust the budget */ + while (ctx->remaining_bits < 0 && q > 0) + { + ctx->remaining_bits += curr_bits; + q--; + curr_bits = pulses2bits(m, i, LM, q); + ctx->remaining_bits -= curr_bits; + } + + if (q!=0) + { + int K = get_pulses(q); + + /* Finally do the actual quantization */ + if (encode) + { + cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth, ctx->arch); + } else { + cm = alg_unquant(X, N, K, spread, B, ec, gain); + } + } else { + /* If there's no pulse, fill the band anyway */ + int j; + if (ctx->resynth) + { + unsigned cm_mask; + /* B can be as large as 16, so this shift might overflow an int on a + 16-bit platform; use a long to get defined behavior.*/ + cm_mask = (unsigned)(1UL<seed = celt_lcg_rand(ctx->seed); + X[j] = (celt_norm)((opus_int32)ctx->seed>>20); + } + cm = cm_mask; + } else { + /* Folded spectrum */ + for (j=0;jseed = celt_lcg_rand(ctx->seed); + /* About 48 dB below the "normal" folding level */ + tmp = QCONST16(1.0f/256, 10); + tmp = (ctx->seed)&0x8000 ? tmp : -tmp; + X[j] = lowband[j]+tmp; + } + cm = fill; + } + renormalise_vector(X, N, gain, ctx->arch); + } + } + } + } + + return cm; +} + + +/* This function is responsible for encoding and decoding a band for the mono case. */ +static unsigned quant_band(struct band_ctx *ctx, celt_norm *X, + int N, int b, int B, celt_norm *lowband, + int LM, celt_norm *lowband_out, + opus_val16 gain, celt_norm *lowband_scratch, int fill) +{ + int N0=N; + int N_B=N; + int N_B0; + int B0=B; + int time_divide=0; + int recombine=0; + int longBlocks; + unsigned cm=0; + int k; + int encode; + int tf_change; + + encode = ctx->encode; + tf_change = ctx->tf_change; + + longBlocks = B0==1; + + N_B = celt_udiv(N_B, B); + + /* Special case for one sample */ + if (N==1) + { + return quant_band_n1(ctx, X, NULL, b, lowband_out); + } + + if (tf_change>0) + recombine = tf_change; + /* Band recombining to increase frequency resolution */ + + if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1)) + { + OPUS_COPY(lowband_scratch, lowband, N); + lowband = lowband_scratch; + } + + for (k=0;k>k, 1<>k, 1<>4]<<2; + } + B>>=recombine; + N_B<<=recombine; + + /* Increasing the time resolution */ + while ((N_B&1) == 0 && tf_change<0) + { + if (encode) + haar1(X, N_B, B); + if (lowband) + haar1(lowband, N_B, B); + fill |= fill<>= 1; + time_divide++; + tf_change++; + } + B0=B; + N_B0 = N_B; + + /* Reorganize the samples in time order instead of frequency order */ + if (B0>1) + { + if (encode) + deinterleave_hadamard(X, N_B>>recombine, B0<>recombine, B0<resynth) + { + /* Undo the sample reorganization going from time order to frequency order */ + if (B0>1) + interleave_hadamard(X, N_B>>recombine, B0<>= 1; + N_B <<= 1; + cm |= cm>>B; + haar1(X, N_B, B); + } + + for (k=0;k>k, 1<encode; + ec = ctx->ec; + + /* Special case for one sample */ + if (N==1) + { + return quant_band_n1(ctx, X, Y, b, lowband_out); + } + + orig_fill = fill; + + compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill); + inv = sctx.inv; + imid = sctx.imid; + iside = sctx.iside; + delta = sctx.delta; + itheta = sctx.itheta; + qalloc = sctx.qalloc; +#ifdef FIXED_POINT + mid = imid; + side = iside; +#else + mid = (1.f/32768)*imid; + side = (1.f/32768)*iside; +#endif + + /* This is a special case for N=2 that only works for stereo and takes + advantage of the fact that mid and side are orthogonal to encode + the side with just one bit. */ + if (N==2) + { + int c; + int sign=0; + celt_norm *x2, *y2; + mbits = b; + sbits = 0; + /* Only need one bit for the side. */ + if (itheta != 0 && itheta != 16384) + sbits = 1< 8192; + ctx->remaining_bits -= qalloc+sbits; + + x2 = c ? Y : X; + y2 = c ? X : Y; + if (sbits) + { + if (encode) + { + /* Here we only need to encode a sign for the side. */ + sign = x2[0]*y2[1] - x2[1]*y2[0] < 0; + ec_enc_bits(ec, sign, 1); + } else { + sign = ec_dec_bits(ec, 1); + } + } + sign = 1-2*sign; + /* We use orig_fill here because we want to fold the side, but if + itheta==16384, we'll have cleared the low bits of fill. */ + cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q15ONE, + lowband_scratch, orig_fill); + /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), + and there's no need to worry about mixing with the other channel. */ + y2[0] = -sign*x2[1]; + y2[1] = sign*x2[0]; + if (ctx->resynth) + { + celt_norm tmp; + X[0] = MULT16_16_Q15(mid, X[0]); + X[1] = MULT16_16_Q15(mid, X[1]); + Y[0] = MULT16_16_Q15(side, Y[0]); + Y[1] = MULT16_16_Q15(side, Y[1]); + tmp = X[0]; + X[0] = SUB16(tmp,Y[0]); + Y[0] = ADD16(tmp,Y[0]); + tmp = X[1]; + X[1] = SUB16(tmp,Y[1]); + Y[1] = ADD16(tmp,Y[1]); + } + } else { + /* "Normal" split code */ + opus_int32 rebalance; + + mbits = IMAX(0, IMIN(b, (b-delta)/2)); + sbits = b-mbits; + ctx->remaining_bits -= qalloc; + + rebalance = ctx->remaining_bits; + if (mbits >= sbits) + { + /* In stereo mode, we do not apply a scaling to the mid because we need the normalized + mid for folding later. */ + cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, + lowband_scratch, fill); + rebalance = mbits - (rebalance-ctx->remaining_bits); + if (rebalance > 3<>B); + } else { + /* For a stereo split, the high bits of fill are always zero, so no + folding will be done to the side. */ + cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); + rebalance = sbits - (rebalance-ctx->remaining_bits); + if (rebalance > 3<resynth) + { + if (N!=2) + stereo_merge(X, Y, mid, N, ctx->arch); + if (inv) + { + int j; + for (j=0;jeBands; + n1 = M*(eBands[start+1]-eBands[start]); + n2 = M*(eBands[start+2]-eBands[start+1]); + /* Duplicate enough of the first band folding data to be able to fold the second band. + Copies no data for CELT-only mode. */ + OPUS_COPY(&norm[n1], &norm[2*n1 - n2], n2-n1); + if (dual_stereo) + OPUS_COPY(&norm2[n1], &norm2[2*n1 - n2], n2-n1); +} + +void quant_all_bands(int encode, const CELTMode *m, int start, int end, + celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, + const celt_ener *bandE, int *pulses, int shortBlocks, int spread, + int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, + opus_int32 balance, ec_ctx *ec, int LM, int codedBands, + opus_uint32 *seed, int complexity, int arch, int disable_inv) +{ + int i; + opus_int32 remaining_bits; + const opus_int16 * OPUS_RESTRICT eBands = m->eBands; + celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; + VARDECL(celt_norm, _norm); + VARDECL(celt_norm, _lowband_scratch); + VARDECL(celt_norm, X_save); + VARDECL(celt_norm, Y_save); + VARDECL(celt_norm, X_save2); + VARDECL(celt_norm, Y_save2); + VARDECL(celt_norm, norm_save2); + int resynth_alloc; + celt_norm *lowband_scratch; + int B; + int M; + int lowband_offset; + int update_lowband = 1; + int C = Y_ != NULL ? 2 : 1; + int norm_offset; + int theta_rdo = encode && Y_!=NULL && !dual_stereo && complexity>=8; +#ifdef RESYNTH + int resynth = 1; +#else + int resynth = !encode || theta_rdo; +#endif + struct band_ctx ctx; + SAVE_STACK; + + M = 1<nbEBands-1]-norm_offset), celt_norm); + norm = _norm; + norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset; + + /* For decoding, we can use the last band as scratch space because we don't need that + scratch space for the last band and we don't care about the data there until we're + decoding the last band. */ + if (encode && resynth) + resynth_alloc = M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]); + else + resynth_alloc = ALLOC_NONE; + ALLOC(_lowband_scratch, resynth_alloc, celt_norm); + if (encode && resynth) + lowband_scratch = _lowband_scratch; + else + lowband_scratch = X_+M*eBands[m->nbEBands-1]; + ALLOC(X_save, resynth_alloc, celt_norm); + ALLOC(Y_save, resynth_alloc, celt_norm); + ALLOC(X_save2, resynth_alloc, celt_norm); + ALLOC(Y_save2, resynth_alloc, celt_norm); + ALLOC(norm_save2, resynth_alloc, celt_norm); + + lowband_offset = 0; + ctx.bandE = bandE; + ctx.ec = ec; + ctx.encode = encode; + ctx.intensity = intensity; + ctx.m = m; + ctx.seed = *seed; + ctx.spread = spread; + ctx.arch = arch; + ctx.disable_inv = disable_inv; + ctx.resynth = resynth; + ctx.theta_round = 0; + /* Avoid injecting noise in the first band on transients. */ + ctx.avoid_split_noise = B > 1; + for (i=start;i 0); + tell = ec_tell_frac(ec); + + /* Compute how many bits we want to allocate to this band */ + if (i != start) + balance -= tell; + remaining_bits = total_bits-tell-1; + ctx.remaining_bits = remaining_bits; + if (i <= codedBands-1) + { + curr_balance = celt_sudiv(balance, IMIN(3, codedBands-i)); + b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance))); + } else { + b = 0; + } + +#ifndef DISABLE_UPDATE_DRAFT + if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0)) + lowband_offset = i; + if (i == start+1) + special_hybrid_folding(m, norm, norm2, start, M, dual_stereo); +#else + if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0)) + lowband_offset = i; +#endif + + tf_change = tf_res[i]; + ctx.tf_change = tf_change; + if (i>=m->effEBands) + { + X=norm; + if (Y_!=NULL) + Y = norm; + lowband_scratch = NULL; + } + if (last && !theta_rdo) + lowband_scratch = NULL; + + /* Get a conservative estimate of the collapse_mask's for the bands we're + going to be folding from. */ + if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0)) + { + int fold_start; + int fold_end; + int fold_i; + /* This ensures we never repeat spectral content within one band */ + effective_lowband = IMAX(0, M*eBands[lowband_offset]-norm_offset-N); + fold_start = lowband_offset; + while(M*eBands[--fold_start] > effective_lowband+norm_offset); + fold_end = lowband_offset-1; +#ifndef DISABLE_UPDATE_DRAFT + while(++fold_end < i && M*eBands[fold_end] < effective_lowband+norm_offset+N); +#else + while(M*eBands[++fold_end] < effective_lowband+norm_offset+N); +#endif + x_cm = y_cm = 0; + fold_i = fold_start; do { + x_cm |= collapse_masks[fold_i*C+0]; + y_cm |= collapse_masks[fold_i*C+C-1]; + } while (++fold_inbEBands], w); + /* Make a copy. */ + cm = x_cm|y_cm; + ec_save = *ec; + ctx_save = ctx; + OPUS_COPY(X_save, X, N); + OPUS_COPY(Y_save, Y, N); + /* Encode and round down. */ + ctx.theta_round = -1; + x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); + dist0 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch)); + + /* Save first result. */ + cm2 = x_cm; + ec_save2 = *ec; + ctx_save2 = ctx; + OPUS_COPY(X_save2, X, N); + OPUS_COPY(Y_save2, Y, N); + if (!last) + OPUS_COPY(norm_save2, norm+M*eBands[i]-norm_offset, N); + nstart_bytes = ec_save.offs; + nend_bytes = ec_save.storage; + bytes_buf = ec_save.buf+nstart_bytes; + save_bytes = nend_bytes-nstart_bytes; + OPUS_COPY(bytes_save, bytes_buf, save_bytes); + + /* Restore */ + *ec = ec_save; + ctx = ctx_save; + OPUS_COPY(X, X_save, N); + OPUS_COPY(Y, Y_save, N); +#ifndef DISABLE_UPDATE_DRAFT + if (i == start+1) + special_hybrid_folding(m, norm, norm2, start, M, dual_stereo); +#endif + /* Encode and round up. */ + ctx.theta_round = 1; + x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); + dist1 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch)); + if (dist0 >= dist1) { + x_cm = cm2; + *ec = ec_save2; + ctx = ctx_save2; + OPUS_COPY(X, X_save2, N); + OPUS_COPY(Y, Y_save2, N); + if (!last) + OPUS_COPY(norm+M*eBands[i]-norm_offset, norm_save2, N); + OPUS_COPY(bytes_buf, bytes_save, save_bytes); + } + } else { + ctx.theta_round = 0; + x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm); + } + } else { + x_cm = quant_band(&ctx, X, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm); + } + y_cm = x_cm; + } + collapse_masks[i*C+0] = (unsigned char)x_cm; + collapse_masks[i*C+C-1] = (unsigned char)y_cm; + balance += pulses[i] + tell; + + /* Update the folding position only as long as we have 1 bit/sample depth. */ + update_lowband = b>(N< +#include "celt.h" +#include "pitch.h" +#include "bands.h" +#include "modes.h" +#include "entcode.h" +#include "quant_bands.h" +#include "rate.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "float_cast.h" +#include +#include "celt_lpc.h" +#include "vq.h" + +#ifndef PACKAGE_VERSION +#define PACKAGE_VERSION "unknown" +#endif + +#if defined(MIPSr1_ASM) +#include "mips/celt_mipsr1.h" +#endif + + +int resampling_factor(opus_int32 rate) +{ + int ret; + switch (rate) + { + case 48000: + ret = 1; + break; + case 24000: + ret = 2; + break; + case 16000: + ret = 3; + break; + case 12000: + ret = 4; + break; + case 8000: + ret = 6; + break; + default: +#ifndef CUSTOM_MODES + celt_assert(0); +#endif + ret = 0; + break; + } + return ret; +} + +#if !defined(OVERRIDE_COMB_FILTER_CONST) || defined(NON_STATIC_COMB_FILTER_CONST_C) +/* This version should be faster on ARM */ +#ifdef OPUS_ARM_ASM +#ifndef NON_STATIC_COMB_FILTER_CONST_C +static +#endif +void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, + opus_val16 g10, opus_val16 g11, opus_val16 g12) +{ + opus_val32 x0, x1, x2, x3, x4; + int i; + x4 = SHL32(x[-T-2], 1); + x3 = SHL32(x[-T-1], 1); + x2 = SHL32(x[-T], 1); + x1 = SHL32(x[-T+1], 1); + for (i=0;inbEBands;i++) + { + int N; + N=(m->eBands[i+1]-m->eBands[i])<cache.caps[m->nbEBands*(2*LM+C-1)+i]+64)*C*N>>2; + } +} + + + +const char *opus_strerror(int error) +{ + static const char * const error_strings[8] = { + "success", + "invalid argument", + "buffer too small", + "internal error", + "corrupted stream", + "request not implemented", + "invalid state", + "memory allocation failed" + }; + if (error > 0 || error < -7) + return "unknown error"; + else + return error_strings[-error]; +} + +const char *opus_get_version_string(void) +{ + return "libopus " PACKAGE_VERSION + /* Applications may rely on the presence of this substring in the version + string to determine if they have a fixed-point or floating-point build + at runtime. */ +#ifdef FIXED_POINT + "-fixed" +#endif +#ifdef FUZZING + "-fuzzing" +#endif + ; +} diff --git a/external/opus-1.3.1/celt/celt.h b/external/opus-1.3.1/celt/celt.h new file mode 100644 index 00000000..24b6b2b5 --- /dev/null +++ b/external/opus-1.3.1/celt/celt.h @@ -0,0 +1,251 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/** + @file celt.h + @brief Contains all the functions for encoding and decoding audio + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CELT_H +#define CELT_H + +#include "opus_types.h" +#include "opus_defines.h" +#include "opus_custom.h" +#include "entenc.h" +#include "entdec.h" +#include "arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define CELTEncoder OpusCustomEncoder +#define CELTDecoder OpusCustomDecoder +#define CELTMode OpusCustomMode + +#define LEAK_BANDS 19 + +typedef struct { + int valid; + float tonality; + float tonality_slope; + float noisiness; + float activity; + float music_prob; + float music_prob_min; + float music_prob_max; + int bandwidth; + float activity_probability; + float max_pitch_ratio; + /* Store as Q6 char to save space. */ + unsigned char leak_boost[LEAK_BANDS]; +} AnalysisInfo; + +typedef struct { + int signalType; + int offset; +} SILKInfo; + +#define __celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr))) + +#define __celt_check_analysis_ptr(ptr) ((ptr) + ((ptr) - (const AnalysisInfo*)(ptr))) + +#define __celt_check_silkinfo_ptr(ptr) ((ptr) + ((ptr) - (const SILKInfo*)(ptr))) + +/* Encoder/decoder Requests */ + + +#define CELT_SET_PREDICTION_REQUEST 10002 +/** Controls the use of interframe prediction. + 0=Independent frames + 1=Short term interframe prediction allowed + 2=Long term prediction allowed + */ +#define CELT_SET_PREDICTION(x) CELT_SET_PREDICTION_REQUEST, __opus_check_int(x) + +#define CELT_SET_INPUT_CLIPPING_REQUEST 10004 +#define CELT_SET_INPUT_CLIPPING(x) CELT_SET_INPUT_CLIPPING_REQUEST, __opus_check_int(x) + +#define CELT_GET_AND_CLEAR_ERROR_REQUEST 10007 +#define CELT_GET_AND_CLEAR_ERROR(x) CELT_GET_AND_CLEAR_ERROR_REQUEST, __opus_check_int_ptr(x) + +#define CELT_SET_CHANNELS_REQUEST 10008 +#define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, __opus_check_int(x) + + +/* Internal */ +#define CELT_SET_START_BAND_REQUEST 10010 +#define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, __opus_check_int(x) + +#define CELT_SET_END_BAND_REQUEST 10012 +#define CELT_SET_END_BAND(x) CELT_SET_END_BAND_REQUEST, __opus_check_int(x) + +#define CELT_GET_MODE_REQUEST 10015 +/** Get the CELTMode used by an encoder or decoder */ +#define CELT_GET_MODE(x) CELT_GET_MODE_REQUEST, __celt_check_mode_ptr_ptr(x) + +#define CELT_SET_SIGNALLING_REQUEST 10016 +#define CELT_SET_SIGNALLING(x) CELT_SET_SIGNALLING_REQUEST, __opus_check_int(x) + +#define CELT_SET_TONALITY_REQUEST 10018 +#define CELT_SET_TONALITY(x) CELT_SET_TONALITY_REQUEST, __opus_check_int(x) +#define CELT_SET_TONALITY_SLOPE_REQUEST 10020 +#define CELT_SET_TONALITY_SLOPE(x) CELT_SET_TONALITY_SLOPE_REQUEST, __opus_check_int(x) + +#define CELT_SET_ANALYSIS_REQUEST 10022 +#define CELT_SET_ANALYSIS(x) CELT_SET_ANALYSIS_REQUEST, __celt_check_analysis_ptr(x) + +#define OPUS_SET_LFE_REQUEST 10024 +#define OPUS_SET_LFE(x) OPUS_SET_LFE_REQUEST, __opus_check_int(x) + +#define OPUS_SET_ENERGY_MASK_REQUEST 10026 +#define OPUS_SET_ENERGY_MASK(x) OPUS_SET_ENERGY_MASK_REQUEST, __opus_check_val16_ptr(x) + +#define CELT_SET_SILK_INFO_REQUEST 10028 +#define CELT_SET_SILK_INFO(x) CELT_SET_SILK_INFO_REQUEST, __celt_check_silkinfo_ptr(x) + +/* Encoder stuff */ + +int celt_encoder_get_size(int channels); + +int celt_encode_with_ec(OpusCustomEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc); + +int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels, + int arch); + + + +/* Decoder stuff */ + +int celt_decoder_get_size(int channels); + + +int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels); + +int celt_decode_with_ec(OpusCustomDecoder * OPUS_RESTRICT st, const unsigned char *data, + int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum); + +#define celt_encoder_ctl opus_custom_encoder_ctl +#define celt_decoder_ctl opus_custom_decoder_ctl + + +#ifdef CUSTOM_MODES +#define OPUS_CUSTOM_NOSTATIC +#else +#define OPUS_CUSTOM_NOSTATIC static OPUS_INLINE +#endif + +static const unsigned char trim_icdf[11] = {126, 124, 119, 109, 87, 41, 19, 9, 4, 2, 0}; +/* Probs: NONE: 21.875%, LIGHT: 6.25%, NORMAL: 65.625%, AGGRESSIVE: 6.25% */ +static const unsigned char spread_icdf[4] = {25, 23, 2, 0}; + +static const unsigned char tapset_icdf[3]={2,1,0}; + +#ifdef CUSTOM_MODES +static const unsigned char toOpusTable[20] = { + 0xE0, 0xE8, 0xF0, 0xF8, + 0xC0, 0xC8, 0xD0, 0xD8, + 0xA0, 0xA8, 0xB0, 0xB8, + 0x00, 0x00, 0x00, 0x00, + 0x80, 0x88, 0x90, 0x98, +}; + +static const unsigned char fromOpusTable[16] = { + 0x80, 0x88, 0x90, 0x98, + 0x40, 0x48, 0x50, 0x58, + 0x20, 0x28, 0x30, 0x38, + 0x00, 0x08, 0x10, 0x18 +}; + +static OPUS_INLINE int toOpus(unsigned char c) +{ + int ret=0; + if (c<0xA0) + ret = toOpusTable[c>>3]; + if (ret == 0) + return -1; + else + return ret|(c&0x7); +} + +static OPUS_INLINE int fromOpus(unsigned char c) +{ + if (c<0x80) + return -1; + else + return fromOpusTable[(c>>3)-16] | (c&0x7); +} +#endif /* CUSTOM_MODES */ + +#define COMBFILTER_MAXPERIOD 1024 +#define COMBFILTER_MINPERIOD 15 + +extern const signed char tf_select_table[4][8]; + +#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) +void validate_celt_decoder(CELTDecoder *st); +#define VALIDATE_CELT_DECODER(st) validate_celt_decoder(st) +#else +#define VALIDATE_CELT_DECODER(st) +#endif + +int resampling_factor(opus_int32 rate); + +void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp, + int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip); + +void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, + opus_val16 g0, opus_val16 g1, int tapset0, int tapset1, + const opus_val16 *window, int overlap, int arch); + +#ifdef NON_STATIC_COMB_FILTER_CONST_C +void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, + opus_val16 g10, opus_val16 g11, opus_val16 g12); +#endif + +#ifndef OVERRIDE_COMB_FILTER_CONST +# define comb_filter_const(y, x, T, N, g10, g11, g12, arch) \ + ((void)(arch),comb_filter_const_c(y, x, T, N, g10, g11, g12)) +#endif + +void init_caps(const CELTMode *m,int *cap,int LM,int C); + +#ifdef RESYNTH +void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, const opus_val16 *coef, celt_sig *mem); +void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[], + opus_val16 *oldBandE, int start, int effEnd, int C, int CC, int isTransient, + int LM, int downsample, int silence); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* CELT_H */ diff --git a/external/opus-1.3.1/celt/celt_decoder.c b/external/opus-1.3.1/celt/celt_decoder.c new file mode 100644 index 00000000..e6efce93 --- /dev/null +++ b/external/opus-1.3.1/celt/celt_decoder.c @@ -0,0 +1,1372 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2010 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define CELT_DECODER_C + +#include "cpu_support.h" +#include "os_support.h" +#include "mdct.h" +#include +#include "celt.h" +#include "pitch.h" +#include "bands.h" +#include "modes.h" +#include "entcode.h" +#include "quant_bands.h" +#include "rate.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "float_cast.h" +#include +#include "celt_lpc.h" +#include "vq.h" + +/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save + CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The + current value corresponds to a pitch of 66.67 Hz. */ +#define PLC_PITCH_LAG_MAX (720) +/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a + pitch of 480 Hz. */ +#define PLC_PITCH_LAG_MIN (100) + +#if defined(SMALL_FOOTPRINT) && defined(FIXED_POINT) +#define NORM_ALIASING_HACK +#endif +/**********************************************************************/ +/* */ +/* DECODER */ +/* */ +/**********************************************************************/ +#define DECODE_BUFFER_SIZE 2048 + +/** Decoder state + @brief Decoder state + */ +struct OpusCustomDecoder { + const OpusCustomMode *mode; + int overlap; + int channels; + int stream_channels; + + int downsample; + int start, end; + int signalling; + int disable_inv; + int arch; + + /* Everything beyond this point gets cleared on a reset */ +#define DECODER_RESET_START rng + + opus_uint32 rng; + int error; + int last_pitch_index; + int loss_count; + int skip_plc; + int postfilter_period; + int postfilter_period_old; + opus_val16 postfilter_gain; + opus_val16 postfilter_gain_old; + int postfilter_tapset; + int postfilter_tapset_old; + + celt_sig preemph_memD[2]; + + celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */ + /* opus_val16 lpc[], Size = channels*LPC_ORDER */ + /* opus_val16 oldEBands[], Size = 2*mode->nbEBands */ + /* opus_val16 oldLogE[], Size = 2*mode->nbEBands */ + /* opus_val16 oldLogE2[], Size = 2*mode->nbEBands */ + /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */ +}; + +#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) +/* Make basic checks on the CELT state to ensure we don't end + up writing all over memory. */ +void validate_celt_decoder(CELTDecoder *st) +{ +#ifndef CUSTOM_MODES + celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL)); + celt_assert(st->overlap == 120); +#endif + celt_assert(st->channels == 1 || st->channels == 2); + celt_assert(st->stream_channels == 1 || st->stream_channels == 2); + celt_assert(st->downsample > 0); + celt_assert(st->start == 0 || st->start == 17); + celt_assert(st->start < st->end); + celt_assert(st->end <= 21); +#ifdef OPUS_ARCHMASK + celt_assert(st->arch >= 0); + celt_assert(st->arch <= OPUS_ARCHMASK); +#endif + celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX); + celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0); + celt_assert(st->postfilter_period < MAX_PERIOD); + celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0); + celt_assert(st->postfilter_period_old < MAX_PERIOD); + celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0); + celt_assert(st->postfilter_tapset <= 2); + celt_assert(st->postfilter_tapset >= 0); + celt_assert(st->postfilter_tapset_old <= 2); + celt_assert(st->postfilter_tapset_old >= 0); +} +#endif + +int celt_decoder_get_size(int channels) +{ + const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); + return opus_custom_decoder_get_size(mode, channels); +} + +OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels) +{ + int size = sizeof(struct CELTDecoder) + + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig) + + channels*LPC_ORDER*sizeof(opus_val16) + + 4*2*mode->nbEBands*sizeof(opus_val16); + return size; +} + +#ifdef CUSTOM_MODES +CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error) +{ + int ret; + CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels)); + ret = opus_custom_decoder_init(st, mode, channels); + if (ret != OPUS_OK) + { + opus_custom_decoder_destroy(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} +#endif /* CUSTOM_MODES */ + +int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels) +{ + int ret; + ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels); + if (ret != OPUS_OK) + return ret; + st->downsample = resampling_factor(sampling_rate); + if (st->downsample==0) + return OPUS_BAD_ARG; + else + return OPUS_OK; +} + +OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels) +{ + if (channels < 0 || channels > 2) + return OPUS_BAD_ARG; + + if (st==NULL) + return OPUS_ALLOC_FAIL; + + OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels)); + + st->mode = mode; + st->overlap = mode->overlap; + st->stream_channels = st->channels = channels; + + st->downsample = 1; + st->start = 0; + st->end = st->mode->effEBands; + st->signalling = 1; +#ifndef DISABLE_UPDATE_DRAFT + st->disable_inv = channels == 1; +#else + st->disable_inv = 0; +#endif + st->arch = opus_select_arch(); + + opus_custom_decoder_ctl(st, OPUS_RESET_STATE); + + return OPUS_OK; +} + +#ifdef CUSTOM_MODES +void opus_custom_decoder_destroy(CELTDecoder *st) +{ + opus_free(st); +} +#endif /* CUSTOM_MODES */ + +#ifndef CUSTOM_MODES +/* Special case for stereo with no downsampling and no accumulation. This is + quite common and we can make it faster by processing both channels in the + same loop, reducing overhead due to the dependency loop in the IIR filter. */ +static void deemphasis_stereo_simple(celt_sig *in[], opus_val16 *pcm, int N, const opus_val16 coef0, + celt_sig *mem) +{ + celt_sig * OPUS_RESTRICT x0; + celt_sig * OPUS_RESTRICT x1; + celt_sig m0, m1; + int j; + x0=in[0]; + x1=in[1]; + m0 = mem[0]; + m1 = mem[1]; + for (j=0;j1) + { + /* Shortcut for the standard (non-custom modes) case */ + for (j=0;joverlap; + nbEBands = mode->nbEBands; + N = mode->shortMdctSize<shortMdctSize; + shift = mode->maxLM; + } else { + B = 1; + NB = mode->shortMdctSize<maxLM-LM; + } + + if (CC==2&&C==1) + { + /* Copying a mono streams to two channels */ + celt_sig *freq2; + denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, + downsample, silence); + /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */ + freq2 = out_syn[1]+overlap/2; + OPUS_COPY(freq2, freq, N); + for (b=0;bmdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); + for (b=0;bmdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch); + } else if (CC==1&&C==2) + { + /* Downmixing a stereo stream to mono */ + celt_sig *freq2; + freq2 = out_syn[0]+overlap/2; + denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, + downsample, silence); + /* Use the output buffer as temp array before downmixing. */ + denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M, + downsample, silence); + for (i=0;imdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); + } else { + /* Normal case (mono or stereo) */ + c=0; do { + denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M, + downsample, silence); + for (b=0;bmdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch); + } while (++cstorage*8; + tell = ec_tell(dec); + logp = isTransient ? 2 : 4; + tf_select_rsv = LM>0 && tell+logp+1<=budget; + budget -= tf_select_rsv; + tf_changed = curr = 0; + for (i=start;i>1, opus_val16 ); + pitch_downsample(decode_mem, lp_pitch_buf, + DECODE_BUFFER_SIZE, C, arch); + pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, + DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX, + PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch); + pitch_index = PLC_PITCH_LAG_MAX-pitch_index; + RESTORE_STACK; + return pitch_index; +} + +static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) +{ + int c; + int i; + const int C = st->channels; + celt_sig *decode_mem[2]; + celt_sig *out_syn[2]; + opus_val16 *lpc; + opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; + const OpusCustomMode *mode; + int nbEBands; + int overlap; + int start; + int loss_count; + int noise_based; + const opus_int16 *eBands; + SAVE_STACK; + + mode = st->mode; + nbEBands = mode->nbEBands; + overlap = mode->overlap; + eBands = mode->eBands; + + c=0; do { + decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); + out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; + } while (++c_decode_mem+(DECODE_BUFFER_SIZE+overlap)*C); + oldBandE = lpc+C*LPC_ORDER; + oldLogE = oldBandE + 2*nbEBands; + oldLogE2 = oldLogE + 2*nbEBands; + backgroundLogE = oldLogE2 + 2*nbEBands; + + loss_count = st->loss_count; + start = st->start; + noise_based = loss_count >= 5 || start != 0 || st->skip_plc; + if (noise_based) + { + /* Noise-based PLC/CNG */ +#ifdef NORM_ALIASING_HACK + celt_norm *X; +#else + VARDECL(celt_norm, X); +#endif + opus_uint32 seed; + int end; + int effEnd; + opus_val16 decay; + end = st->end; + effEnd = IMAX(start, IMIN(end, mode->effEBands)); + +#ifdef NORM_ALIASING_HACK + /* This is an ugly hack that breaks aliasing rules and would be easily broken, + but it saves almost 4kB of stack. */ + X = (celt_norm*)(out_syn[C-1]+overlap/2); +#else + ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ +#endif + + /* Energy decay */ + decay = loss_count==0 ? QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT); + c=0; do + { + for (i=start;irng; + for (c=0;c>20); + } + renormalise_vector(X+boffs, blen, Q15ONE, st->arch); + } + } + st->rng = seed; + + c=0; do { + OPUS_MOVE(decode_mem[c], decode_mem[c]+N, + DECODE_BUFFER_SIZE-N+(overlap>>1)); + } while (++cdownsample, 0, st->arch); + } else { + int exc_length; + /* Pitch-based PLC */ + const opus_val16 *window; + opus_val16 *exc; + opus_val16 fade = Q15ONE; + int pitch_index; + VARDECL(opus_val32, etmp); + VARDECL(opus_val16, _exc); + VARDECL(opus_val16, fir_tmp); + + if (loss_count == 0) + { + st->last_pitch_index = pitch_index = celt_plc_pitch_search(decode_mem, C, st->arch); + } else { + pitch_index = st->last_pitch_index; + fade = QCONST16(.8f,15); + } + + /* We want the excitation for 2 pitch periods in order to look for a + decaying signal, but we can't get more than MAX_PERIOD. */ + exc_length = IMIN(2*pitch_index, MAX_PERIOD); + + ALLOC(etmp, overlap, opus_val32); + ALLOC(_exc, MAX_PERIOD+LPC_ORDER, opus_val16); + ALLOC(fir_tmp, exc_length, opus_val16); + exc = _exc+LPC_ORDER; + window = mode->window; + c=0; do { + opus_val16 decay; + opus_val16 attenuation; + opus_val32 S1=0; + celt_sig *buf; + int extrapolation_offset; + int extrapolation_len; + int j; + + buf = decode_mem[c]; + for (i=0;iarch); + /* Add a noise floor of -40 dB. */ +#ifdef FIXED_POINT + ac[0] += SHR32(ac[0],13); +#else + ac[0] *= 1.0001f; +#endif + /* Use lag windowing to stabilize the Levinson-Durbin recursion. */ + for (i=1;i<=LPC_ORDER;i++) + { + /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ +#ifdef FIXED_POINT + ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); +#else + ac[i] -= ac[i]*(0.008f*0.008f)*i*i; +#endif + } + _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER); +#ifdef FIXED_POINT + /* For fixed-point, apply bandwidth expansion until we can guarantee that + no overflow can happen in the IIR filter. This means: + 32768*sum(abs(filter)) < 2^31 */ + while (1) { + opus_val16 tmp=Q15ONE; + opus_val32 sum=QCONST16(1., SIG_SHIFT); + for (i=0;iarch); + OPUS_COPY(exc+MAX_PERIOD-exc_length, fir_tmp, exc_length); + } + + /* Check if the waveform is decaying, and if so how fast. + We do this to avoid adding energy when concealing in a segment + with decaying energy. */ + { + opus_val32 E1=1, E2=1; + int decay_length; +#ifdef FIXED_POINT + int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[MAX_PERIOD-exc_length], exc_length))-20); +#endif + decay_length = exc_length>>1; + for (i=0;i= pitch_index) { + j -= pitch_index; + attenuation = MULT16_16_Q15(attenuation, decay); + } + buf[DECODE_BUFFER_SIZE-N+i] = + SHL32(EXTEND32(MULT16_16_Q15(attenuation, + exc[extrapolation_offset+j])), SIG_SHIFT); + /* Compute the energy of the previously decoded signal whose + excitation we're copying. */ + tmp = ROUND16( + buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j], + SIG_SHIFT); + S1 += SHR32(MULT16_16(tmp, tmp), 10); + } + { + opus_val16 lpc_mem[LPC_ORDER]; + /* Copy the last decoded samples (prior to the overlap region) to + synthesis filter memory so we can have a continuous signal. */ + for (i=0;iarch); +#ifdef FIXED_POINT + for (i=0; i < extrapolation_len; i++) + buf[DECODE_BUFFER_SIZE-N+i] = SATURATE(buf[DECODE_BUFFER_SIZE-N+i], SIG_SAT); +#endif + } + + /* Check if the synthesis energy is higher than expected, which can + happen with the signal changes during our window. If so, + attenuate. */ + { + opus_val32 S2=0; + for (i=0;i SHR32(S2,2))) +#else + /* The float test is written this way to catch NaNs in the output + of the IIR filter at the same time. */ + if (!(S1 > 0.2f*S2)) +#endif + { + for (i=0;ipostfilter_period, st->postfilter_period, overlap, + -st->postfilter_gain, -st->postfilter_gain, + st->postfilter_tapset, st->postfilter_tapset, NULL, 0, st->arch); + + /* Simulate TDAC on the concealed audio so that it blends with the + MDCT of the next frame. */ + for (i=0;iloss_count = loss_count+1; + + RESTORE_STACK; +} + +int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, + int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum) +{ + int c, i, N; + int spread_decision; + opus_int32 bits; + ec_dec _dec; +#ifdef NORM_ALIASING_HACK + celt_norm *X; +#else + VARDECL(celt_norm, X); +#endif + VARDECL(int, fine_quant); + VARDECL(int, pulses); + VARDECL(int, cap); + VARDECL(int, offsets); + VARDECL(int, fine_priority); + VARDECL(int, tf_res); + VARDECL(unsigned char, collapse_masks); + celt_sig *decode_mem[2]; + celt_sig *out_syn[2]; + opus_val16 *lpc; + opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; + + int shortBlocks; + int isTransient; + int intra_ener; + const int CC = st->channels; + int LM, M; + int start; + int end; + int effEnd; + int codedBands; + int alloc_trim; + int postfilter_pitch; + opus_val16 postfilter_gain; + int intensity=0; + int dual_stereo=0; + opus_int32 total_bits; + opus_int32 balance; + opus_int32 tell; + int dynalloc_logp; + int postfilter_tapset; + int anti_collapse_rsv; + int anti_collapse_on=0; + int silence; + int C = st->stream_channels; + const OpusCustomMode *mode; + int nbEBands; + int overlap; + const opus_int16 *eBands; + ALLOC_STACK; + + VALIDATE_CELT_DECODER(st); + mode = st->mode; + nbEBands = mode->nbEBands; + overlap = mode->overlap; + eBands = mode->eBands; + start = st->start; + end = st->end; + frame_size *= st->downsample; + + lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC); + oldBandE = lpc+CC*LPC_ORDER; + oldLogE = oldBandE + 2*nbEBands; + oldLogE2 = oldLogE + 2*nbEBands; + backgroundLogE = oldLogE2 + 2*nbEBands; + +#ifdef CUSTOM_MODES + if (st->signalling && data!=NULL) + { + int data0=data[0]; + /* Convert "standard mode" to Opus header */ + if (mode->Fs==48000 && mode->shortMdctSize==120) + { + data0 = fromOpus(data0); + if (data0<0) + return OPUS_INVALID_PACKET; + } + st->end = end = IMAX(1, mode->effEBands-2*(data0>>5)); + LM = (data0>>3)&0x3; + C = 1 + ((data0>>2)&0x1); + data++; + len--; + if (LM>mode->maxLM) + return OPUS_INVALID_PACKET; + if (frame_size < mode->shortMdctSize<shortMdctSize<maxLM;LM++) + if (mode->shortMdctSize<mode->maxLM) + return OPUS_BAD_ARG; + } + M=1<1275 || pcm==NULL) + return OPUS_BAD_ARG; + + N = M*mode->shortMdctSize; + c=0; do { + decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); + out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; + } while (++c mode->effEBands) + effEnd = mode->effEBands; + + if (data == NULL || len<=1) + { + celt_decode_lost(st, N, LM); + deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum); + RESTORE_STACK; + return frame_size/st->downsample; + } + + /* Check if there are at least two packets received consecutively before + * turning on the pitch-based PLC */ + st->skip_plc = st->loss_count != 0; + + if (dec == NULL) + { + ec_dec_init(&_dec,(unsigned char*)data,len); + dec = &_dec; + } + + if (C==1) + { + for (i=0;i= total_bits) + silence = 1; + else if (tell==1) + silence = ec_dec_bit_logp(dec, 15); + else + silence = 0; + if (silence) + { + /* Pretend we've read all the remaining bits */ + tell = len*8; + dec->nbits_total+=tell-ec_tell(dec); + } + + postfilter_gain = 0; + postfilter_pitch = 0; + postfilter_tapset = 0; + if (start==0 && tell+16 <= total_bits) + { + if(ec_dec_bit_logp(dec, 1)) + { + int qg, octave; + octave = ec_dec_uint(dec, 6); + postfilter_pitch = (16< 0 && tell+3 <= total_bits) + { + isTransient = ec_dec_bit_logp(dec, 3); + tell = ec_tell(dec); + } + else + isTransient = 0; + + if (isTransient) + shortBlocks = M; + else + shortBlocks = 0; + + /* Decode the global flags (first symbols in the stream) */ + intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0; + /* Get band energies */ + unquant_coarse_energy(mode, start, end, oldBandE, + intra_ener, dec, C, LM); + + ALLOC(tf_res, nbEBands, int); + tf_decode(start, end, isTransient, tf_res, LM, dec); + + tell = ec_tell(dec); + spread_decision = SPREAD_NORMAL; + if (tell+4 <= total_bits) + spread_decision = ec_dec_icdf(dec, spread_icdf, 5); + + ALLOC(cap, nbEBands, int); + + init_caps(mode,cap,LM,C); + + ALLOC(offsets, nbEBands, int); + + dynalloc_logp = 6; + total_bits<<=BITRES; + tell = ec_tell_frac(dec); + for (i=start;i0) + dynalloc_logp = IMAX(2, dynalloc_logp-1); + } + + ALLOC(fine_quant, nbEBands, int); + alloc_trim = tell+(6<=2&&bits>=((LM+2)<rng, 0, + st->arch, st->disable_inv); + + if (anti_collapse_rsv > 0) + { + anti_collapse_on = ec_dec_bits(dec, 1); + } + + unquant_energy_finalise(mode, start, end, oldBandE, + fine_quant, fine_priority, len*8-ec_tell(dec), dec, C); + + if (anti_collapse_on) + anti_collapse(mode, X, collapse_masks, LM, C, N, + start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, st->arch); + + if (silence) + { + for (i=0;idownsample, silence, st->arch); + + c=0; do { + st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD); + st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD); + comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize, + st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset, + mode->window, overlap, st->arch); + if (LM!=0) + comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize, + st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset, + mode->window, overlap, st->arch); + + } while (++cpostfilter_period_old = st->postfilter_period; + st->postfilter_gain_old = st->postfilter_gain; + st->postfilter_tapset_old = st->postfilter_tapset; + st->postfilter_period = postfilter_pitch; + st->postfilter_gain = postfilter_gain; + st->postfilter_tapset = postfilter_tapset; + if (LM!=0) + { + st->postfilter_period_old = st->postfilter_period; + st->postfilter_gain_old = st->postfilter_gain; + st->postfilter_tapset_old = st->postfilter_tapset; + } + + if (C==1) + OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands); + + /* In case start or end were to change */ + if (!isTransient) + { + opus_val16 max_background_increase; + OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands); + OPUS_COPY(oldLogE, oldBandE, 2*nbEBands); + /* In normal circumstances, we only allow the noise floor to increase by + up to 2.4 dB/second, but when we're in DTX, we allow up to 6 dB + increase for each update.*/ + if (st->loss_count < 10) + max_background_increase = M*QCONST16(0.001f,DB_SHIFT); + else + max_background_increase = QCONST16(1.f,DB_SHIFT); + for (i=0;i<2*nbEBands;i++) + backgroundLogE[i] = MIN16(backgroundLogE[i] + max_background_increase, oldBandE[i]); + } else { + for (i=0;i<2*nbEBands;i++) + oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); + } + c=0; do + { + for (i=0;irng = dec->rng; + + deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum); + st->loss_count = 0; + RESTORE_STACK; + if (ec_tell(dec) > 8*len) + return OPUS_INTERNAL_ERROR; + if(ec_get_error(dec)) + st->error = 1; + return frame_size/st->downsample; +} + + +#ifdef CUSTOM_MODES + +#ifdef FIXED_POINT +int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) +{ + return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0); +} + +#ifndef DISABLE_FLOAT_API +int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size) +{ + int j, ret, C, N; + VARDECL(opus_int16, out); + ALLOC_STACK; + + if (pcm==NULL) + return OPUS_BAD_ARG; + + C = st->channels; + N = frame_size; + + ALLOC(out, C*N, opus_int16); + ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0); + if (ret>0) + for (j=0;jchannels; + N = frame_size; + ALLOC(out, C*N, celt_sig); + + ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0); + + if (ret>0) + for (j=0;j=st->mode->nbEBands) + goto bad_arg; + st->start = value; + } + break; + case CELT_SET_END_BAND_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<1 || value>st->mode->nbEBands) + goto bad_arg; + st->end = value; + } + break; + case CELT_SET_CHANNELS_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<1 || value>2) + goto bad_arg; + st->stream_channels = value; + } + break; + case CELT_GET_AND_CLEAR_ERROR_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (value==NULL) + goto bad_arg; + *value=st->error; + st->error = 0; + } + break; + case OPUS_GET_LOOKAHEAD_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (value==NULL) + goto bad_arg; + *value = st->overlap/st->downsample; + } + break; + case OPUS_RESET_STATE: + { + int i; + opus_val16 *lpc, *oldBandE, *oldLogE, *oldLogE2; + lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*st->channels); + oldBandE = lpc+st->channels*LPC_ORDER; + oldLogE = oldBandE + 2*st->mode->nbEBands; + oldLogE2 = oldLogE + 2*st->mode->nbEBands; + OPUS_CLEAR((char*)&st->DECODER_RESET_START, + opus_custom_decoder_get_size(st->mode, st->channels)- + ((char*)&st->DECODER_RESET_START - (char*)st)); + for (i=0;i<2*st->mode->nbEBands;i++) + oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); + st->skip_plc = 1; + } + break; + case OPUS_GET_PITCH_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (value==NULL) + goto bad_arg; + *value = st->postfilter_period; + } + break; + case CELT_GET_MODE_REQUEST: + { + const CELTMode ** value = va_arg(ap, const CELTMode**); + if (value==0) + goto bad_arg; + *value=st->mode; + } + break; + case CELT_SET_SIGNALLING_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->signalling = value; + } + break; + case OPUS_GET_FINAL_RANGE_REQUEST: + { + opus_uint32 * value = va_arg(ap, opus_uint32 *); + if (value==0) + goto bad_arg; + *value=st->rng; + } + break; + case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + st->disable_inv = value; + } + break; + case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->disable_inv; + } + break; + default: + goto bad_request; + } + va_end(ap); + return OPUS_OK; +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; +bad_request: + va_end(ap); + return OPUS_UNIMPLEMENTED; +} diff --git a/external/opus-1.3.1/celt/celt_encoder.c b/external/opus-1.3.1/celt/celt_encoder.c new file mode 100644 index 00000000..44cb0850 --- /dev/null +++ b/external/opus-1.3.1/celt/celt_encoder.c @@ -0,0 +1,2607 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2010 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define CELT_ENCODER_C + +#include "cpu_support.h" +#include "os_support.h" +#include "mdct.h" +#include +#include "celt.h" +#include "pitch.h" +#include "bands.h" +#include "modes.h" +#include "entcode.h" +#include "quant_bands.h" +#include "rate.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "float_cast.h" +#include +#include "celt_lpc.h" +#include "vq.h" + + +/** Encoder state + @brief Encoder state + */ +struct OpusCustomEncoder { + const OpusCustomMode *mode; /**< Mode used by the encoder */ + int channels; + int stream_channels; + + int force_intra; + int clip; + int disable_pf; + int complexity; + int upsample; + int start, end; + + opus_int32 bitrate; + int vbr; + int signalling; + int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */ + int loss_rate; + int lsb_depth; + int lfe; + int disable_inv; + int arch; + + /* Everything beyond this point gets cleared on a reset */ +#define ENCODER_RESET_START rng + + opus_uint32 rng; + int spread_decision; + opus_val32 delayedIntra; + int tonal_average; + int lastCodedBands; + int hf_average; + int tapset_decision; + + int prefilter_period; + opus_val16 prefilter_gain; + int prefilter_tapset; +#ifdef RESYNTH + int prefilter_period_old; + opus_val16 prefilter_gain_old; + int prefilter_tapset_old; +#endif + int consec_transient; + AnalysisInfo analysis; + SILKInfo silk_info; + + opus_val32 preemph_memE[2]; + opus_val32 preemph_memD[2]; + + /* VBR-related parameters */ + opus_int32 vbr_reservoir; + opus_int32 vbr_drift; + opus_int32 vbr_offset; + opus_int32 vbr_count; + opus_val32 overlap_max; + opus_val16 stereo_saving; + int intensity; + opus_val16 *energy_mask; + opus_val16 spec_avg; + +#ifdef RESYNTH + /* +MAX_PERIOD/2 to make space for overlap */ + celt_sig syn_mem[2][2*MAX_PERIOD+MAX_PERIOD/2]; +#endif + + celt_sig in_mem[1]; /* Size = channels*mode->overlap */ + /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_MAXPERIOD */ + /* opus_val16 oldBandE[], Size = channels*mode->nbEBands */ + /* opus_val16 oldLogE[], Size = channels*mode->nbEBands */ + /* opus_val16 oldLogE2[], Size = channels*mode->nbEBands */ + /* opus_val16 energyError[], Size = channels*mode->nbEBands */ +}; + +int celt_encoder_get_size(int channels) +{ + CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); + return opus_custom_encoder_get_size(mode, channels); +} + +OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels) +{ + int size = sizeof(struct CELTEncoder) + + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[channels*mode->overlap]; */ + + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */ + + 4*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */ + /* opus_val16 oldLogE[channels*mode->nbEBands]; */ + /* opus_val16 oldLogE2[channels*mode->nbEBands]; */ + /* opus_val16 energyError[channels*mode->nbEBands]; */ + return size; +} + +#ifdef CUSTOM_MODES +CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int *error) +{ + int ret; + CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode, channels)); + /* init will handle the NULL case */ + ret = opus_custom_encoder_init(st, mode, channels); + if (ret != OPUS_OK) + { + opus_custom_encoder_destroy(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} +#endif /* CUSTOM_MODES */ + +static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode, + int channels, int arch) +{ + if (channels < 0 || channels > 2) + return OPUS_BAD_ARG; + + if (st==NULL || mode==NULL) + return OPUS_ALLOC_FAIL; + + OPUS_CLEAR((char*)st, opus_custom_encoder_get_size(mode, channels)); + + st->mode = mode; + st->stream_channels = st->channels = channels; + + st->upsample = 1; + st->start = 0; + st->end = st->mode->effEBands; + st->signalling = 1; + st->arch = arch; + + st->constrained_vbr = 1; + st->clip = 1; + + st->bitrate = OPUS_BITRATE_MAX; + st->vbr = 0; + st->force_intra = 0; + st->complexity = 5; + st->lsb_depth=24; + + opus_custom_encoder_ctl(st, OPUS_RESET_STATE); + + return OPUS_OK; +} + +#ifdef CUSTOM_MODES +int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels) +{ + return opus_custom_encoder_init_arch(st, mode, channels, opus_select_arch()); +} +#endif + +int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels, + int arch) +{ + int ret; + ret = opus_custom_encoder_init_arch(st, + opus_custom_mode_create(48000, 960, NULL), channels, arch); + if (ret != OPUS_OK) + return ret; + st->upsample = resampling_factor(sampling_rate); + return OPUS_OK; +} + +#ifdef CUSTOM_MODES +void opus_custom_encoder_destroy(CELTEncoder *st) +{ + opus_free(st); +} +#endif /* CUSTOM_MODES */ + + +static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C, + opus_val16 *tf_estimate, int *tf_chan, int allow_weak_transients, + int *weak_transient) +{ + int i; + VARDECL(opus_val16, tmp); + opus_val32 mem0,mem1; + int is_transient = 0; + opus_int32 mask_metric = 0; + int c; + opus_val16 tf_max; + int len2; + /* Forward masking: 6.7 dB/ms. */ +#ifdef FIXED_POINT + int forward_shift = 4; +#else + opus_val16 forward_decay = QCONST16(.0625f,15); +#endif + /* Table of 6*64/x, trained on real data to minimize the average error */ + static const unsigned char inv_table[128] = { + 255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25, + 23, 22, 21, 20, 19, 18, 17, 16, 16, 15, 15, 14, 13, 13, 12, 12, + 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 9, 8, 8, + 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + }; + SAVE_STACK; + ALLOC(tmp, len, opus_val16); + + *weak_transient = 0; + /* For lower bitrates, let's be more conservative and have a forward masking + decay of 3.3 dB/ms. This avoids having to code transients at very low + bitrate (mostly for hybrid), which can result in unstable energy and/or + partial collapse. */ + if (allow_weak_transients) + { +#ifdef FIXED_POINT + forward_shift = 5; +#else + forward_decay = QCONST16(.03125f,15); +#endif + } + len2=len/2; + for (c=0;c=0;i--) + { + /* Backward masking: 13.9 dB/ms. */ +#ifdef FIXED_POINT + /* FIXME: Use PSHR16() instead */ + tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3); +#else + tmp[i] = mem0 + MULT16_16_P15(QCONST16(0.125f,15),tmp[i]-mem0); +#endif + mem0 = tmp[i]; + maxE = MAX16(maxE, mem0); + } + /*for (i=0;i>1))); +#else + mean = celt_sqrt(mean * maxE*.5*len2); +#endif + /* Inverse of the mean energy in Q15+6 */ + norm = SHL32(EXTEND32(len2),6+14)/ADD32(EPSILON,SHR32(mean,1)); + /* Compute harmonic mean discarding the unreliable boundaries + The data is smooth, so we only take 1/4th of the samples */ + unmask=0; + /* We should never see NaNs here. If we find any, then something really bad happened and we better abort + before it does any damage later on. If these asserts are disabled (no hardening), then the table + lookup a few lines below (id = ...) is likely to crash dur to an out-of-bounds read. DO NOT FIX + that crash on NaN since it could result in a worse issue later on. */ + celt_assert(!celt_isnan(tmp[0])); + celt_assert(!celt_isnan(norm)); + for (i=12;imask_metric) + { + *tf_chan = c; + mask_metric = unmask; + } + } + is_transient = mask_metric>200; + /* For low bitrates, define "weak transients" that need to be + handled differently to avoid partial collapse. */ + if (allow_weak_transients && is_transient && mask_metric<600) { + is_transient = 0; + *weak_transient = 1; + } + /* Arbitrary metric for VBR boost */ + tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42); + /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */ + *tf_estimate = celt_sqrt(MAX32(0, SHL32(MULT16_16(QCONST16(0.0069,14),MIN16(163,tf_max)),14)-QCONST32(0.139,28))); + /*printf("%d %f\n", tf_max, mask_metric);*/ + RESTORE_STACK; +#ifdef FUZZING + is_transient = rand()&0x1; +#endif + /*printf("%d %f %d\n", is_transient, (float)*tf_estimate, tf_max);*/ + return is_transient; +} + +/* Looks for sudden increases of energy to decide whether we need to patch + the transient decision */ +static int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands, + int start, int end, int C) +{ + int i, c; + opus_val32 mean_diff=0; + opus_val16 spread_old[26]; + /* Apply an aggressive (-6 dB/Bark) spreading function to the old frame to + avoid false detection caused by irrelevant bands */ + if (C==1) + { + spread_old[start] = oldE[start]; + for (i=start+1;i=start;i--) + spread_old[i] = MAX16(spread_old[i], spread_old[i+1]-QCONST16(1.0f, DB_SHIFT)); + /* Compute mean increase */ + c=0; do { + for (i=IMAX(2,start);i QCONST16(1.f, DB_SHIFT); +} + +/** Apply window and compute the MDCT for all sub-frames and + all channels in a frame */ +static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * OPUS_RESTRICT in, + celt_sig * OPUS_RESTRICT out, int C, int CC, int LM, int upsample, + int arch) +{ + const int overlap = mode->overlap; + int N; + int B; + int shift; + int i, b, c; + if (shortBlocks) + { + B = shortBlocks; + N = mode->shortMdctSize; + shift = mode->maxLM; + } else { + B = 1; + N = mode->shortMdctSize<maxLM-LM; + } + c=0; do { + for (b=0;bmdct, in+c*(B*N+overlap)+b*N, + &out[b+c*N*B], mode->window, overlap, shift, B, + arch); + } + } while (++ceBands[len]-m->eBands[len-1])<eBands[len]-m->eBands[len-1])<eBands[i+1]-m->eBands[i])<eBands[i+1]-m->eBands[i])==1; + OPUS_COPY(tmp, &X[tf_chan*N0 + (m->eBands[i]<eBands[i]<>LM, 1<>k, 1<=0;i--) + { + if (tf_res[i+1] == 1) + tf_res[i] = path1[i+1]; + else + tf_res[i] = path0[i+1]; + } + /*printf("%d %f\n", *tf_sum, tf_estimate);*/ + RESTORE_STACK; +#ifdef FUZZING + tf_select = rand()&0x1; + tf_res[0] = rand()&0x1; + for (i=1;istorage*8; + tell = ec_tell(enc); + logp = isTransient ? 2 : 4; + /* Reserve space to code the tf_select decision. */ + tf_select_rsv = LM>0 && tell+logp+1 <= budget; + budget -= tf_select_rsv; + curr = tf_changed = 0; + for (i=start;i> 10; + trim = QCONST16(4.f, 8) + QCONST16(1.f/16.f, 8)*frac; + } + if (C==2) + { + opus_val16 sum = 0; /* Q10 */ + opus_val16 minXC; /* Q10 */ + /* Compute inter-channel correlation for low frequencies */ + for (i=0;i<8;i++) + { + opus_val32 partial; + partial = celt_inner_prod(&X[m->eBands[i]<eBands[i]<eBands[i+1]-m->eBands[i])<eBands[i]<eBands[i]<eBands[i+1]-m->eBands[i])<nbEBands]*(opus_int32)(2+2*i-end); + } + } while (++cvalid) + { + trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), + (opus_val16)(QCONST16(2.f, 8)*(analysis->tonality_slope+.05f)))); + } +#else + (void)analysis; +#endif + +#ifdef FIXED_POINT + trim_index = PSHR32(trim, 8); +#else + trim_index = (int)floor(.5f+trim); +#endif + trim_index = IMAX(0, IMIN(10, trim_index)); + /*printf("%d\n", trim_index);*/ +#ifdef FUZZING + trim_index = rand()%11; +#endif + return trim_index; +} + +static int stereo_analysis(const CELTMode *m, const celt_norm *X, + int LM, int N0) +{ + int i; + int thetas; + opus_val32 sumLR = EPSILON, sumMS = EPSILON; + + /* Use the L1 norm to model the entropy of the L/R signal vs the M/S signal */ + for (i=0;i<13;i++) + { + int j; + for (j=m->eBands[i]<eBands[i+1]<eBands[13]<<(LM+1))+thetas, sumMS) + > MULT16_32_Q15(m->eBands[13]<<(LM+1), sumLR); +} + +#define MSWAP(a,b) do {opus_val16 tmp = a;a=b;b=tmp;} while(0) +static opus_val16 median_of_5(const opus_val16 *x) +{ + opus_val16 t0, t1, t2, t3, t4; + t2 = x[2]; + if (x[0] > x[1]) + { + t0 = x[1]; + t1 = x[0]; + } else { + t0 = x[0]; + t1 = x[1]; + } + if (x[3] > x[4]) + { + t3 = x[4]; + t4 = x[3]; + } else { + t3 = x[3]; + t4 = x[4]; + } + if (t0 > t3) + { + MSWAP(t0, t3); + MSWAP(t1, t4); + } + if (t2 > t1) + { + if (t1 < t3) + return MIN16(t2, t3); + else + return MIN16(t4, t1); + } else { + if (t2 < t3) + return MIN16(t1, t3); + else + return MIN16(t2, t4); + } +} + +static opus_val16 median_of_3(const opus_val16 *x) +{ + opus_val16 t0, t1, t2; + if (x[0] > x[1]) + { + t0 = x[1]; + t1 = x[0]; + } else { + t0 = x[0]; + t1 = x[1]; + } + t2 = x[2]; + if (t1 < t2) + return t1; + else if (t0 < t2) + return t2; + else + return t0; +} + +static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2, + int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN, + int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM, + int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc, + AnalysisInfo *analysis, int *importance, int *spread_weight) +{ + int i, c; + opus_int32 tot_boost=0; + opus_val16 maxDepth; + VARDECL(opus_val16, follower); + VARDECL(opus_val16, noise_floor); + SAVE_STACK; + ALLOC(follower, C*nbEBands, opus_val16); + ALLOC(noise_floor, C*nbEBands, opus_val16); + OPUS_CLEAR(offsets, nbEBands); + /* Dynamic allocation code */ + maxDepth=-QCONST16(31.9f, DB_SHIFT); + for (i=0;i=0;i--) + mask[i] = MAX16(mask[i], mask[i+1] - QCONST16(3.f, DB_SHIFT)); + for (i=0;i> shift; + } + /*for (i=0;i 50 && LM>=1 && !lfe) + { + int last=0; + c=0;do + { + opus_val16 offset; + opus_val16 tmp; + opus_val16 *f; + f = &follower[c*nbEBands]; + f[0] = bandLogE2[c*nbEBands]; + for (i=1;i bandLogE2[c*nbEBands+i-1]+QCONST16(.5f,DB_SHIFT)) + last=i; + f[i] = MIN16(f[i-1]+QCONST16(1.5f,DB_SHIFT), bandLogE2[c*nbEBands+i]); + } + for (i=last-1;i>=0;i--) + f[i] = MIN16(f[i], MIN16(f[i+1]+QCONST16(2.f,DB_SHIFT), bandLogE2[c*nbEBands+i])); + + /* Combine with a median filter to avoid dynalloc triggering unnecessarily. + The "offset" value controls how conservative we are -- a higher offset + reduces the impact of the median filter and makes dynalloc use more bits. */ + offset = QCONST16(1.f, DB_SHIFT); + for (i=2;i=12) + follower[i] = HALF16(follower[i]); + } +#ifdef DISABLE_FLOAT_API + (void)analysis; +#else + if (analysis->valid) + { + for (i=start;ileak_boost[i]; + } +#endif + for (i=start;i 48) { + boost = (int)SHR32(EXTEND32(follower[i])*8,DB_SHIFT); + boost_bits = (boost*width<>BITRES>>3 > 2*effectiveBytes/3) + { + opus_int32 cap = ((2*effectiveBytes/3)<mode; + overlap = mode->overlap; + ALLOC(_pre, CC*(N+COMBFILTER_MAXPERIOD), celt_sig); + + pre[0] = _pre; + pre[1] = _pre + (N+COMBFILTER_MAXPERIOD); + + + c=0; do { + OPUS_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD); + OPUS_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+overlap)+overlap, N); + } while (++c>1, opus_val16); + + pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC, st->arch); + /* Don't search for the fir last 1.5 octave of the range because + there's too many false-positives due to short-term correlation */ + pitch_search(pitch_buf+(COMBFILTER_MAXPERIOD>>1), pitch_buf, N, + COMBFILTER_MAXPERIOD-3*COMBFILTER_MINPERIOD, &pitch_index, + st->arch); + pitch_index = COMBFILTER_MAXPERIOD-pitch_index; + + gain1 = remove_doubling(pitch_buf, COMBFILTER_MAXPERIOD, COMBFILTER_MINPERIOD, + N, &pitch_index, st->prefilter_period, st->prefilter_gain, st->arch); + if (pitch_index > COMBFILTER_MAXPERIOD-2) + pitch_index = COMBFILTER_MAXPERIOD-2; + gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1); + /*printf("%d %d %f %f\n", pitch_change, pitch_index, gain1, st->analysis.tonality);*/ + if (st->loss_rate>2) + gain1 = HALF32(gain1); + if (st->loss_rate>4) + gain1 = HALF32(gain1); + if (st->loss_rate>8) + gain1 = 0; + } else { + gain1 = 0; + pitch_index = COMBFILTER_MINPERIOD; + } +#ifndef DISABLE_FLOAT_API + if (analysis->valid) + gain1 = (opus_val16)(gain1 * analysis->max_pitch_ratio); +#else + (void)analysis; +#endif + /* Gain threshold for enabling the prefilter/postfilter */ + pf_threshold = QCONST16(.2f,15); + + /* Adjusting the threshold based on rate and continuity */ + if (abs(pitch_index-st->prefilter_period)*10>pitch_index) + pf_threshold += QCONST16(.2f,15); + if (nbAvailableBytes<25) + pf_threshold += QCONST16(.1f,15); + if (nbAvailableBytes<35) + pf_threshold += QCONST16(.1f,15); + if (st->prefilter_gain > QCONST16(.4f,15)) + pf_threshold -= QCONST16(.1f,15); + if (st->prefilter_gain > QCONST16(.55f,15)) + pf_threshold -= QCONST16(.1f,15); + + /* Hard threshold at 0.2 */ + pf_threshold = MAX16(pf_threshold, QCONST16(.2f,15)); + if (gain1prefilter_gain)prefilter_gain; + +#ifdef FIXED_POINT + qg = ((gain1+1536)>>10)/3-1; +#else + qg = (int)floor(.5f+gain1*32/3)-1; +#endif + qg = IMAX(0, IMIN(7, qg)); + gain1 = QCONST16(0.09375f,15)*(qg+1); + pf_on = 1; + } + /*printf("%d %f\n", pitch_index, gain1);*/ + + c=0; do { + int offset = mode->shortMdctSize-overlap; + st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); + OPUS_COPY(in+c*(N+overlap), st->in_mem+c*(overlap), overlap); + if (offset) + comb_filter(in+c*(N+overlap)+overlap, pre[c]+COMBFILTER_MAXPERIOD, + st->prefilter_period, st->prefilter_period, offset, -st->prefilter_gain, -st->prefilter_gain, + st->prefilter_tapset, st->prefilter_tapset, NULL, 0, st->arch); + + comb_filter(in+c*(N+overlap)+overlap+offset, pre[c]+COMBFILTER_MAXPERIOD+offset, + st->prefilter_period, pitch_index, N-offset, -st->prefilter_gain, -gain1, + st->prefilter_tapset, prefilter_tapset, mode->window, overlap, st->arch); + OPUS_COPY(st->in_mem+c*(overlap), in+c*(N+overlap)+N, overlap); + + if (N>COMBFILTER_MAXPERIOD) + { + OPUS_COPY(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD); + } else { + OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N); + OPUS_COPY(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N); + } + } while (++cnbEBands; + eBands = mode->eBands; + + coded_bands = lastCodedBands ? lastCodedBands : nbEBands; + coded_bins = eBands[coded_bands]<analysis.activity, st->analysis.tonality, tf_estimate, st->stereo_saving, tot_boost, coded_bands);*/ +#ifndef DISABLE_FLOAT_API + if (analysis->valid && analysis->activity<.4) + target -= (opus_int32)((coded_bins<activity)); +#endif + /* Stereo savings */ + if (C==2) + { + int coded_stereo_bands; + int coded_stereo_dof; + opus_val16 max_frac; + coded_stereo_bands = IMIN(intensity, coded_bands); + coded_stereo_dof = (eBands[coded_stereo_bands]<valid && !lfe) + { + opus_int32 tonal_target; + float tonal; + + /* Tonality boost (compensating for the average). */ + tonal = MAX16(0.f,analysis->tonality-.15f)-0.12f; + tonal_target = target + (opus_int32)((coded_bins<tonality, tonal);*/ + target = tonal_target; + } +#else + (void)analysis; + (void)pitch_change; +#endif + + if (has_surround_mask&&!lfe) + { + opus_int32 surround_target = target + (opus_int32)SHR32(MULT16_16(surround_masking,coded_bins<end, st->intensity, surround_target, target, st->bitrate);*/ + target = IMAX(target/4, surround_target); + } + + { + opus_int32 floor_depth; + int bins; + bins = eBands[nbEBands-2]<>2); + target = IMIN(target, floor_depth); + /*printf("%f %d\n", maxDepth, floor_depth);*/ + } + + /* Make VBR less aggressive for constrained VBR because we can't keep a higher bitrate + for long. Needs tuning. */ + if ((!has_surround_mask||lfe) && constrained_vbr) + { + target = base_target + (opus_int32)MULT16_32_Q15(QCONST16(0.67f, 15), target-base_target); + } + + if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14)) + { + opus_val16 amount; + opus_val16 tvbr_factor; + amount = MULT16_16_Q15(QCONST16(.0000031f, 30), IMAX(0, IMIN(32000, 96000-bitrate))); + tvbr_factor = SHR32(MULT16_16(temporal_vbr, amount), DB_SHIFT); + target += (opus_int32)MULT16_32_Q15(tvbr_factor, target); + } + + /* Don't allow more than doubling the rate */ + target = IMIN(2*base_target, target); + + return target; +} + +int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc) +{ + int i, c, N; + opus_int32 bits; + ec_enc _enc; + VARDECL(celt_sig, in); + VARDECL(celt_sig, freq); + VARDECL(celt_norm, X); + VARDECL(celt_ener, bandE); + VARDECL(opus_val16, bandLogE); + VARDECL(opus_val16, bandLogE2); + VARDECL(int, fine_quant); + VARDECL(opus_val16, error); + VARDECL(int, pulses); + VARDECL(int, cap); + VARDECL(int, offsets); + VARDECL(int, importance); + VARDECL(int, spread_weight); + VARDECL(int, fine_priority); + VARDECL(int, tf_res); + VARDECL(unsigned char, collapse_masks); + celt_sig *prefilter_mem; + opus_val16 *oldBandE, *oldLogE, *oldLogE2, *energyError; + int shortBlocks=0; + int isTransient=0; + const int CC = st->channels; + const int C = st->stream_channels; + int LM, M; + int tf_select; + int nbFilledBytes, nbAvailableBytes; + int start; + int end; + int effEnd; + int codedBands; + int alloc_trim; + int pitch_index=COMBFILTER_MINPERIOD; + opus_val16 gain1 = 0; + int dual_stereo=0; + int effectiveBytes; + int dynalloc_logp; + opus_int32 vbr_rate; + opus_int32 total_bits; + opus_int32 total_boost; + opus_int32 balance; + opus_int32 tell; + opus_int32 tell0_frac; + int prefilter_tapset=0; + int pf_on; + int anti_collapse_rsv; + int anti_collapse_on=0; + int silence=0; + int tf_chan = 0; + opus_val16 tf_estimate; + int pitch_change=0; + opus_int32 tot_boost; + opus_val32 sample_max; + opus_val16 maxDepth; + const OpusCustomMode *mode; + int nbEBands; + int overlap; + const opus_int16 *eBands; + int secondMdct; + int signalBandwidth; + int transient_got_disabled=0; + opus_val16 surround_masking=0; + opus_val16 temporal_vbr=0; + opus_val16 surround_trim = 0; + opus_int32 equiv_rate; + int hybrid; + int weak_transient = 0; + int enable_tf_analysis; + VARDECL(opus_val16, surround_dynalloc); + ALLOC_STACK; + + mode = st->mode; + nbEBands = mode->nbEBands; + overlap = mode->overlap; + eBands = mode->eBands; + start = st->start; + end = st->end; + hybrid = start != 0; + tf_estimate = 0; + if (nbCompressedBytes<2 || pcm==NULL) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + + frame_size *= st->upsample; + for (LM=0;LM<=mode->maxLM;LM++) + if (mode->shortMdctSize<mode->maxLM) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + M=1<shortMdctSize; + + prefilter_mem = st->in_mem+CC*(overlap); + oldBandE = (opus_val16*)(st->in_mem+CC*(overlap+COMBFILTER_MAXPERIOD)); + oldLogE = oldBandE + CC*nbEBands; + oldLogE2 = oldLogE + CC*nbEBands; + energyError = oldLogE2 + CC*nbEBands; + + if (enc==NULL) + { + tell0_frac=tell=1; + nbFilledBytes=0; + } else { + tell0_frac=ec_tell_frac(enc); + tell=ec_tell(enc); + nbFilledBytes=(tell+4)>>3; + } + +#ifdef CUSTOM_MODES + if (st->signalling && enc==NULL) + { + int tmp = (mode->effEBands-end)>>1; + end = st->end = IMAX(1, mode->effEBands-tmp); + compressed[0] = tmp<<5; + compressed[0] |= LM<<3; + compressed[0] |= (C==2)<<2; + /* Convert "standard mode" to Opus header */ + if (mode->Fs==48000 && mode->shortMdctSize==120) + { + int c0 = toOpus(compressed[0]); + if (c0<0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + compressed[0] = c0; + } + compressed++; + nbCompressedBytes--; + } +#else + celt_assert(st->signalling==0); +#endif + + /* Can't produce more than 1275 output bytes */ + nbCompressedBytes = IMIN(nbCompressedBytes,1275); + nbAvailableBytes = nbCompressedBytes - nbFilledBytes; + + if (st->vbr && st->bitrate!=OPUS_BITRATE_MAX) + { + opus_int32 den=mode->Fs>>BITRES; + vbr_rate=(st->bitrate*frame_size+(den>>1))/den; +#ifdef CUSTOM_MODES + if (st->signalling) + vbr_rate -= 8<>(3+BITRES); + } else { + opus_int32 tmp; + vbr_rate = 0; + tmp = st->bitrate*frame_size; + if (tell>1) + tmp += tell; + if (st->bitrate!=OPUS_BITRATE_MAX) + nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes, + (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling)); + effectiveBytes = nbCompressedBytes - nbFilledBytes; + } + equiv_rate = ((opus_int32)nbCompressedBytes*8*50 >> (3-LM)) - (40*C+20)*((400>>LM) - 50); + if (st->bitrate != OPUS_BITRATE_MAX) + equiv_rate = IMIN(equiv_rate, st->bitrate - (40*C+20)*((400>>LM) - 50)); + + if (enc==NULL) + { + ec_enc_init(&_enc, compressed, nbCompressedBytes); + enc = &_enc; + } + + if (vbr_rate>0) + { + /* Computes the max bit-rate allowed in VBR mode to avoid violating the + target rate and buffering. + We must do this up front so that bust-prevention logic triggers + correctly if we don't have enough bits. */ + if (st->constrained_vbr) + { + opus_int32 vbr_bound; + opus_int32 max_allowed; + /* We could use any multiple of vbr_rate as bound (depending on the + delay). + This is clamped to ensure we use at least two bytes if the encoder + was entirely empty, but to allow 0 in hybrid mode. */ + vbr_bound = vbr_rate; + max_allowed = IMIN(IMAX(tell==1?2:0, + (vbr_rate+vbr_bound-st->vbr_reservoir)>>(BITRES+3)), + nbAvailableBytes); + if(max_allowed < nbAvailableBytes) + { + nbCompressedBytes = nbFilledBytes+max_allowed; + nbAvailableBytes = max_allowed; + ec_enc_shrink(enc, nbCompressedBytes); + } + } + } + total_bits = nbCompressedBytes*8; + + effEnd = end; + if (effEnd > mode->effEBands) + effEnd = mode->effEBands; + + ALLOC(in, CC*(N+overlap), celt_sig); + + sample_max=MAX32(st->overlap_max, celt_maxabs16(pcm, C*(N-overlap)/st->upsample)); + st->overlap_max=celt_maxabs16(pcm+C*(N-overlap)/st->upsample, C*overlap/st->upsample); + sample_max=MAX32(sample_max, st->overlap_max); +#ifdef FIXED_POINT + silence = (sample_max==0); +#else + silence = (sample_max <= (opus_val16)1/(1<lsb_depth)); +#endif +#ifdef FUZZING + if ((rand()&0x3F)==0) + silence = 1; +#endif + if (tell==1) + ec_enc_bit_logp(enc, silence, 15); + else + silence=0; + if (silence) + { + /*In VBR mode there is no need to send more than the minimum. */ + if (vbr_rate>0) + { + effectiveBytes=nbCompressedBytes=IMIN(nbCompressedBytes, nbFilledBytes+2); + total_bits=nbCompressedBytes*8; + nbAvailableBytes=2; + ec_enc_shrink(enc, nbCompressedBytes); + } + /* Pretend we've filled all the remaining bits with zeros + (that's what the initialiser did anyway) */ + tell = nbCompressedBytes*8; + enc->nbits_total+=tell-ec_tell(enc); + } + c=0; do { + int need_clip=0; +#ifndef FIXED_POINT + need_clip = st->clip && sample_max>65536.f; +#endif + celt_preemphasis(pcm+c, in+c*(N+overlap)+overlap, N, CC, st->upsample, + mode->preemph, st->preemph_memE+c, need_clip); + } while (++clfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && !hybrid && !silence && !st->disable_pf + && st->complexity >= 5; + + prefilter_tapset = st->tapset_decision; + pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes, &st->analysis); + if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3) + && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period)) + pitch_change = 1; + if (pf_on==0) + { + if(!hybrid && tell+16<=total_bits) + ec_enc_bit_logp(enc, 0, 1); + } else { + /*This block is not gated by a total bits check only because + of the nbAvailableBytes check above.*/ + int octave; + ec_enc_bit_logp(enc, 1, 1); + pitch_index += 1; + octave = EC_ILOG(pitch_index)-5; + ec_enc_uint(enc, octave, 6); + ec_enc_bits(enc, pitch_index-(16<complexity >= 1 && !st->lfe) + { + /* Reduces the likelihood of energy instability on fricatives at low bitrate + in hybrid mode. It seems like we still want to have real transients on vowels + though (small SILK quantization offset value). */ + int allow_weak_transients = hybrid && effectiveBytes<15 && st->silk_info.signalType != 2; + isTransient = transient_analysis(in, N+overlap, CC, + &tf_estimate, &tf_chan, allow_weak_transients, &weak_transient); + } + if (LM>0 && ec_tell(enc)+3<=total_bits) + { + if (isTransient) + shortBlocks = M; + } else { + isTransient = 0; + transient_got_disabled=1; + } + + ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */ + ALLOC(bandE,nbEBands*CC, celt_ener); + ALLOC(bandLogE,nbEBands*CC, opus_val16); + + secondMdct = shortBlocks && st->complexity>=8; + ALLOC(bandLogE2, C*nbEBands, opus_val16); + if (secondMdct) + { + compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample, st->arch); + compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); + amp2Log2(mode, effEnd, end, bandE, bandLogE2, C); + for (i=0;iupsample, st->arch); + /* This should catch any NaN in the CELT input. Since we're not supposed to see any (they're filtered + at the Opus layer), just abort. */ + celt_assert(!celt_isnan(freq[0]) && (C==1 || !celt_isnan(freq[N]))); + if (CC==2&&C==1) + tf_chan = 0; + compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); + + if (st->lfe) + { + for (i=2;ienergy_mask&&!st->lfe) + { + int mask_end; + int midband; + int count_dynalloc; + opus_val32 mask_avg=0; + opus_val32 diff=0; + int count=0; + mask_end = IMAX(2,st->lastCodedBands); + for (c=0;cenergy_mask[nbEBands*c+i], + QCONST16(.25f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT)); + if (mask > 0) + mask = HALF16(mask); + mask_avg += MULT16_16(mask, eBands[i+1]-eBands[i]); + count += eBands[i+1]-eBands[i]; + diff += MULT16_16(mask, 1+2*i-mask_end); + } + } + celt_assert(count>0); + mask_avg = DIV32_16(mask_avg,count); + mask_avg += QCONST16(.2f, DB_SHIFT); + diff = diff*6/(C*(mask_end-1)*(mask_end+1)*mask_end); + /* Again, being conservative */ + diff = HALF32(diff); + diff = MAX32(MIN32(diff, QCONST32(.031f, DB_SHIFT)), -QCONST32(.031f, DB_SHIFT)); + /* Find the band that's in the middle of the coded spectrum */ + for (midband=0;eBands[midband+1] < eBands[mask_end]/2;midband++); + count_dynalloc=0; + for(i=0;ienergy_mask[i], st->energy_mask[nbEBands+i]); + else + unmask = st->energy_mask[i]; + unmask = MIN16(unmask, QCONST16(.0f, DB_SHIFT)); + unmask -= lin; + if (unmask > QCONST16(.25f, DB_SHIFT)) + { + surround_dynalloc[i] = unmask - QCONST16(.25f, DB_SHIFT); + count_dynalloc++; + } + } + if (count_dynalloc>=3) + { + /* If we need dynalloc in many bands, it's probably because our + initial masking rate was too low. */ + mask_avg += QCONST16(.25f, DB_SHIFT); + if (mask_avg>0) + { + /* Something went really wrong in the original calculations, + disabling masking. */ + mask_avg = 0; + diff = 0; + OPUS_CLEAR(surround_dynalloc, mask_end); + } else { + for(i=0;ilfe) + { + opus_val16 follow=-QCONST16(10.0f,DB_SHIFT); + opus_val32 frame_avg=0; + opus_val16 offset = shortBlocks?HALF16(SHL16(LM, DB_SHIFT)):0; + for(i=start;ispec_avg); + temporal_vbr = MIN16(QCONST16(3.f, DB_SHIFT), MAX16(-QCONST16(1.5f, DB_SHIFT), temporal_vbr)); + st->spec_avg += MULT16_16_Q15(QCONST16(.02f, 15), temporal_vbr); + } + /*for (i=0;i<21;i++) + printf("%f ", bandLogE[i]); + printf("\n");*/ + + if (!secondMdct) + { + OPUS_COPY(bandLogE2, bandLogE, C*nbEBands); + } + + /* Last chance to catch any transient we might have missed in the + time-domain analysis */ + if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe && !hybrid) + { + if (patch_transient_decision(bandLogE, oldBandE, nbEBands, start, end, C)) + { + isTransient = 1; + shortBlocks = M; + compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample, st->arch); + compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); + amp2Log2(mode, effEnd, end, bandE, bandLogE, C); + /* Compensate for the scaling of short vs long mdcts */ + for (i=0;i0 && ec_tell(enc)+3<=total_bits) + ec_enc_bit_logp(enc, isTransient, 3); + + ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ + + /* Band normalisation */ + normalise_bands(mode, freq, X, bandE, effEnd, C, M); + + enable_tf_analysis = effectiveBytes>=15*C && !hybrid && st->complexity>=2 && !st->lfe; + + ALLOC(offsets, nbEBands, int); + ALLOC(importance, nbEBands, int); + ALLOC(spread_weight, nbEBands, int); + + maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, start, end, C, offsets, + st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr, + eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc, &st->analysis, importance, spread_weight); + + ALLOC(tf_res, nbEBands, int); + /* Disable variable tf resolution for hybrid and at very low bitrate */ + if (enable_tf_analysis) + { + int lambda; + lambda = IMAX(80, 20480/effectiveBytes + 2); + tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, tf_estimate, tf_chan, importance); + for (i=effEnd;isilk_info.signalType != 2) + { + /* For low bitrate hybrid, we force temporal resolution to 5 ms rather than 2.5 ms. */ + for (i=0;iforce_intra, + &st->delayedIntra, st->complexity >= 4, st->loss_rate, st->lfe); + + tf_encode(start, end, isTransient, tf_res, LM, tf_select, enc); + + if (ec_tell(enc)+4<=total_bits) + { + if (st->lfe) + { + st->tapset_decision = 0; + st->spread_decision = SPREAD_NORMAL; + } else if (hybrid) + { + if (st->complexity == 0) + st->spread_decision = SPREAD_NONE; + else if (isTransient) + st->spread_decision = SPREAD_NORMAL; + else + st->spread_decision = SPREAD_AGGRESSIVE; + } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C) + { + if (st->complexity == 0) + st->spread_decision = SPREAD_NONE; + else + st->spread_decision = SPREAD_NORMAL; + } else { + /* Disable new spreading+tapset estimator until we can show it works + better than the old one. So far it seems like spreading_decision() + works best. */ +#if 0 + if (st->analysis.valid) + { + static const opus_val16 spread_thresholds[3] = {-QCONST16(.6f, 15), -QCONST16(.2f, 15), -QCONST16(.07f, 15)}; + static const opus_val16 spread_histeresis[3] = {QCONST16(.15f, 15), QCONST16(.07f, 15), QCONST16(.02f, 15)}; + static const opus_val16 tapset_thresholds[2] = {QCONST16(.0f, 15), QCONST16(.15f, 15)}; + static const opus_val16 tapset_histeresis[2] = {QCONST16(.1f, 15), QCONST16(.05f, 15)}; + st->spread_decision = hysteresis_decision(-st->analysis.tonality, spread_thresholds, spread_histeresis, 3, st->spread_decision); + st->tapset_decision = hysteresis_decision(st->analysis.tonality_slope, tapset_thresholds, tapset_histeresis, 2, st->tapset_decision); + } else +#endif + { + st->spread_decision = spreading_decision(mode, X, + &st->tonal_average, st->spread_decision, &st->hf_average, + &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M, spread_weight); + } + /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/ + /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/ + } + ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5); + } + + /* For LFE, everything interesting is in the first band */ + if (st->lfe) + offsets[0] = IMIN(8, effectiveBytes/3); + ALLOC(cap, nbEBands, int); + init_caps(mode,cap,LM,C); + + dynalloc_logp = 6; + total_bits<<=BITRES; + total_boost = 0; + tell = ec_tell_frac(enc); + for (i=start;iintensity = hysteresis_decision((opus_val16)(equiv_rate/1000), + intensity_thresholds, intensity_histeresis, 21, st->intensity); + st->intensity = IMIN(end,IMAX(start, st->intensity)); + } + + alloc_trim = 5; + if (tell+(6< 0 || st->lfe) + { + st->stereo_saving = 0; + alloc_trim = 5; + } else { + alloc_trim = alloc_trim_analysis(mode, X, bandLogE, + end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, + st->intensity, surround_trim, equiv_rate, st->arch); + } + ec_enc_icdf(enc, alloc_trim, trim_icdf, 7); + tell = ec_tell_frac(enc); + } + + /* Variable bitrate */ + if (vbr_rate>0) + { + opus_val16 alpha; + opus_int32 delta; + /* The target rate in 8th bits per frame */ + opus_int32 target, base_target; + opus_int32 min_allowed; + int lm_diff = mode->maxLM - LM; + + /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms. + The CELT allocator will just not be able to use more than that anyway. */ + nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM)); + if (!hybrid) + { + base_target = vbr_rate - ((40*C+20)<constrained_vbr) + base_target += (st->vbr_offset>>lm_diff); + + if (!hybrid) + { + target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate, + st->lastCodedBands, C, st->intensity, st->constrained_vbr, + st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth, + st->lfe, st->energy_mask!=NULL, surround_masking, + temporal_vbr); + } else { + target = base_target; + /* Tonal frames (offset<100) need more bits than noisy (offset>100) ones. */ + if (st->silk_info.offset < 100) target += 12 << BITRES >> (3-LM); + if (st->silk_info.offset > 100) target -= 18 << BITRES >> (3-LM); + /* Boosting bitrate on transients and vowels with significant temporal + spikes. */ + target += (opus_int32)MULT16_16_Q14(tf_estimate-QCONST16(.25f,14), (50< QCONST16(.7f,14)) + target = IMAX(target, 50<>(BITRES+3)) + 2; + /* Take into account the 37 bits we need to have left in the packet to + signal a redundant frame in hybrid mode. Creating a shorter packet would + create an entropy coder desync. */ + if (hybrid) + min_allowed = IMAX(min_allowed, (tell0_frac+(37<>(BITRES+3)); + + nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3); + nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes); + nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes); + + /* By how much did we "miss" the target on that frame */ + delta = target - vbr_rate; + + target=nbAvailableBytes<<(BITRES+3); + + /*If the frame is silent we don't adjust our drift, otherwise + the encoder will shoot to very high rates after hitting a + span of silence, but we do allow the bitres to refill. + This means that we'll undershoot our target in CVBR/VBR modes + on files with lots of silence. */ + if(silence) + { + nbAvailableBytes = 2; + target = 2*8<vbr_count < 970) + { + st->vbr_count++; + alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+20),16)); + } else + alpha = QCONST16(.001f,15); + /* How many bits have we used in excess of what we're allowed */ + if (st->constrained_vbr) + st->vbr_reservoir += target - vbr_rate; + /*printf ("%d\n", st->vbr_reservoir);*/ + + /* Compute the offset we need to apply in order to reach the target */ + if (st->constrained_vbr) + { + st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,(delta*(1<vbr_offset-st->vbr_drift); + st->vbr_offset = -st->vbr_drift; + } + /*printf ("%d\n", st->vbr_drift);*/ + + if (st->constrained_vbr && st->vbr_reservoir < 0) + { + /* We're under the min value -- increase rate */ + int adjust = (-st->vbr_reservoir)/(8<vbr_reservoir = 0; + /*printf ("+%d\n", adjust);*/ + } + nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes); + /*printf("%d\n", nbCompressedBytes*50*8);*/ + /* This moves the raw bits to take into account the new compressed size */ + ec_enc_shrink(enc, nbCompressedBytes); + } + + /* Bit allocation */ + ALLOC(fine_quant, nbEBands, int); + ALLOC(pulses, nbEBands, int); + ALLOC(fine_priority, nbEBands, int); + + /* bits = packet size - where we are - safety*/ + bits = (((opus_int32)nbCompressedBytes*8)<=2&&bits>=((LM+2)<analysis.valid) + { + int min_bandwidth; + if (equiv_rate < (opus_int32)32000*C) + min_bandwidth = 13; + else if (equiv_rate < (opus_int32)48000*C) + min_bandwidth = 16; + else if (equiv_rate < (opus_int32)60000*C) + min_bandwidth = 18; + else if (equiv_rate < (opus_int32)80000*C) + min_bandwidth = 19; + else + min_bandwidth = 20; + signalBandwidth = IMAX(st->analysis.bandwidth, min_bandwidth); + } +#endif + if (st->lfe) + signalBandwidth = 1; + codedBands = clt_compute_allocation(mode, start, end, offsets, cap, + alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses, + fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth); + if (st->lastCodedBands) + st->lastCodedBands = IMIN(st->lastCodedBands+1,IMAX(st->lastCodedBands-1,codedBands)); + else + st->lastCodedBands = codedBands; + + quant_fine_energy(mode, start, end, oldBandE, error, fine_quant, enc, C); + + /* Residual quantisation */ + ALLOC(collapse_masks, C*nbEBands, unsigned char); + quant_all_bands(1, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks, + bandE, pulses, shortBlocks, st->spread_decision, + dual_stereo, st->intensity, tf_res, nbCompressedBytes*(8<rng, st->complexity, st->arch, st->disable_inv); + + if (anti_collapse_rsv > 0) + { + anti_collapse_on = st->consec_transient<2; +#ifdef FUZZING + anti_collapse_on = rand()&0x1; +#endif + ec_enc_bits(enc, anti_collapse_on, 1); + } + quant_energy_finalise(mode, start, end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C); + OPUS_CLEAR(energyError, nbEBands*CC); + c=0; + do { + for (i=start;irng); + } + + c=0; do { + OPUS_MOVE(st->syn_mem[c], st->syn_mem[c]+N, 2*MAX_PERIOD-N+overlap/2); + } while (++csyn_mem[c]+2*MAX_PERIOD-N; + } while (++cupsample, silence, st->arch); + + c=0; do { + st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); + st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINPERIOD); + comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefilter_period, mode->shortMdctSize, + st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_old, st->prefilter_tapset, + mode->window, overlap); + if (LM!=0) + comb_filter(out_mem[c]+mode->shortMdctSize, out_mem[c]+mode->shortMdctSize, st->prefilter_period, pitch_index, N-mode->shortMdctSize, + st->prefilter_gain, gain1, st->prefilter_tapset, prefilter_tapset, + mode->window, overlap); + } while (++cupsample, mode->preemph, st->preemph_memD); + st->prefilter_period_old = st->prefilter_period; + st->prefilter_gain_old = st->prefilter_gain; + st->prefilter_tapset_old = st->prefilter_tapset; + } +#endif + + st->prefilter_period = pitch_index; + st->prefilter_gain = gain1; + st->prefilter_tapset = prefilter_tapset; +#ifdef RESYNTH + if (LM!=0) + { + st->prefilter_period_old = st->prefilter_period; + st->prefilter_gain_old = st->prefilter_gain; + st->prefilter_tapset_old = st->prefilter_tapset; + } +#endif + + if (CC==2&&C==1) { + OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands); + } + + if (!isTransient) + { + OPUS_COPY(oldLogE2, oldLogE, CC*nbEBands); + OPUS_COPY(oldLogE, oldBandE, CC*nbEBands); + } else { + for (i=0;iconsec_transient++; + else + st->consec_transient=0; + st->rng = enc->rng; + + /* If there's any room left (can only happen for very high rates), + it's already filled with zeros */ + ec_enc_done(enc); + +#ifdef CUSTOM_MODES + if (st->signalling) + nbCompressedBytes++; +#endif + + RESTORE_STACK; + if (ec_get_error(enc)) + return OPUS_INTERNAL_ERROR; + else + return nbCompressedBytes; +} + + +#ifdef CUSTOM_MODES + +#ifdef FIXED_POINT +int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) +{ + return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL); +} + +#ifndef DISABLE_FLOAT_API +int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) +{ + int j, ret, C, N; + VARDECL(opus_int16, in); + ALLOC_STACK; + + if (pcm==NULL) + return OPUS_BAD_ARG; + + C = st->channels; + N = frame_size; + ALLOC(in, C*N, opus_int16); + + for (j=0;jchannels; + N=frame_size; + ALLOC(in, C*N, celt_sig); + for (j=0;j10) + goto bad_arg; + st->complexity = value; + } + break; + case CELT_SET_START_BAND_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<0 || value>=st->mode->nbEBands) + goto bad_arg; + st->start = value; + } + break; + case CELT_SET_END_BAND_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<1 || value>st->mode->nbEBands) + goto bad_arg; + st->end = value; + } + break; + case CELT_SET_PREDICTION_REQUEST: + { + int value = va_arg(ap, opus_int32); + if (value<0 || value>2) + goto bad_arg; + st->disable_pf = value<=1; + st->force_intra = value==0; + } + break; + case OPUS_SET_PACKET_LOSS_PERC_REQUEST: + { + int value = va_arg(ap, opus_int32); + if (value<0 || value>100) + goto bad_arg; + st->loss_rate = value; + } + break; + case OPUS_SET_VBR_CONSTRAINT_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->constrained_vbr = value; + } + break; + case OPUS_SET_VBR_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->vbr = value; + } + break; + case OPUS_SET_BITRATE_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<=500 && value!=OPUS_BITRATE_MAX) + goto bad_arg; + value = IMIN(value, 260000*st->channels); + st->bitrate = value; + } + break; + case CELT_SET_CHANNELS_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<1 || value>2) + goto bad_arg; + st->stream_channels = value; + } + break; + case OPUS_SET_LSB_DEPTH_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<8 || value>24) + goto bad_arg; + st->lsb_depth=value; + } + break; + case OPUS_GET_LSB_DEPTH_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + *value=st->lsb_depth; + } + break; + case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + st->disable_inv = value; + } + break; + case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->disable_inv; + } + break; + case OPUS_RESET_STATE: + { + int i; + opus_val16 *oldBandE, *oldLogE, *oldLogE2; + oldBandE = (opus_val16*)(st->in_mem+st->channels*(st->mode->overlap+COMBFILTER_MAXPERIOD)); + oldLogE = oldBandE + st->channels*st->mode->nbEBands; + oldLogE2 = oldLogE + st->channels*st->mode->nbEBands; + OPUS_CLEAR((char*)&st->ENCODER_RESET_START, + opus_custom_encoder_get_size(st->mode, st->channels)- + ((char*)&st->ENCODER_RESET_START - (char*)st)); + for (i=0;ichannels*st->mode->nbEBands;i++) + oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); + st->vbr_offset = 0; + st->delayedIntra = 1; + st->spread_decision = SPREAD_NORMAL; + st->tonal_average = 256; + st->hf_average = 0; + st->tapset_decision = 0; + } + break; +#ifdef CUSTOM_MODES + case CELT_SET_INPUT_CLIPPING_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->clip = value; + } + break; +#endif + case CELT_SET_SIGNALLING_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->signalling = value; + } + break; + case CELT_SET_ANALYSIS_REQUEST: + { + AnalysisInfo *info = va_arg(ap, AnalysisInfo *); + if (info) + OPUS_COPY(&st->analysis, info, 1); + } + break; + case CELT_SET_SILK_INFO_REQUEST: + { + SILKInfo *info = va_arg(ap, SILKInfo *); + if (info) + OPUS_COPY(&st->silk_info, info, 1); + } + break; + case CELT_GET_MODE_REQUEST: + { + const CELTMode ** value = va_arg(ap, const CELTMode**); + if (value==0) + goto bad_arg; + *value=st->mode; + } + break; + case OPUS_GET_FINAL_RANGE_REQUEST: + { + opus_uint32 * value = va_arg(ap, opus_uint32 *); + if (value==0) + goto bad_arg; + *value=st->rng; + } + break; + case OPUS_SET_LFE_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->lfe = value; + } + break; + case OPUS_SET_ENERGY_MASK_REQUEST: + { + opus_val16 *value = va_arg(ap, opus_val16*); + st->energy_mask = value; + } + break; + default: + goto bad_request; + } + va_end(ap); + return OPUS_OK; +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; +bad_request: + va_end(ap); + return OPUS_UNIMPLEMENTED; +} diff --git a/external/opus-1.3.1/celt/celt_lpc.c b/external/opus-1.3.1/celt/celt_lpc.c new file mode 100644 index 00000000..8ecb693e --- /dev/null +++ b/external/opus-1.3.1/celt/celt_lpc.c @@ -0,0 +1,296 @@ +/* Copyright (c) 2009-2010 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "celt_lpc.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "pitch.h" + +void _celt_lpc( + opus_val16 *_lpc, /* out: [0...p-1] LPC coefficients */ +const opus_val32 *ac, /* in: [0...p] autocorrelation values */ +int p +) +{ + int i, j; + opus_val32 r; + opus_val32 error = ac[0]; +#ifdef FIXED_POINT + opus_val32 lpc[LPC_ORDER]; +#else + float *lpc = _lpc; +#endif + + OPUS_CLEAR(lpc, p); + if (ac[0] != 0) + { + for (i = 0; i < p; i++) { + /* Sum up this iteration's reflection coefficient */ + opus_val32 rr = 0; + for (j = 0; j < i; j++) + rr += MULT32_32_Q31(lpc[j],ac[i - j]); + rr += SHR32(ac[i + 1],3); + r = -frac_div32(SHL32(rr,3), error); + /* Update LPC coefficients and total error */ + lpc[i] = SHR32(r,3); + for (j = 0; j < (i+1)>>1; j++) + { + opus_val32 tmp1, tmp2; + tmp1 = lpc[j]; + tmp2 = lpc[i-1-j]; + lpc[j] = tmp1 + MULT32_32_Q31(r,tmp2); + lpc[i-1-j] = tmp2 + MULT32_32_Q31(r,tmp1); + } + + error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error); + /* Bail out once we get 30 dB gain */ +#ifdef FIXED_POINT + if (error=1;j--) + { + mem[j]=mem[j-1]; + } + mem[0] = SROUND16(sum, SIG_SHIFT); + _y[i] = sum; + } +#else + int i,j; + VARDECL(opus_val16, rden); + VARDECL(opus_val16, y); + SAVE_STACK; + + celt_assert((ord&3)==0); + ALLOC(rden, ord, opus_val16); + ALLOC(y, N+ord, opus_val16); + for(i=0;i0); + celt_assert(overlap>=0); + if (overlap == 0) + { + xptr = x; + } else { + for (i=0;i0) + { + for(i=0;i= 536870912) + { + int shift2=1; + if (ac[0] >= 1073741824) + shift2++; + for (i=0;i<=lag;i++) + ac[i] = SHR32(ac[i], shift2); + shift += shift2; + } +#endif + + RESTORE_STACK; + return shift; +} diff --git a/external/opus-1.0.3/celt/celt_lpc.h b/external/opus-1.3.1/celt/celt_lpc.h similarity index 78% rename from external/opus-1.0.3/celt/celt_lpc.h rename to external/opus-1.3.1/celt/celt_lpc.h index 2baa77ed..a4c5fd6e 100644 --- a/external/opus-1.0.3/celt/celt_lpc.h +++ b/external/opus-1.3.1/celt/celt_lpc.h @@ -29,25 +29,38 @@ #define PLC_H #include "arch.h" +#include "cpu_support.h" + +#if defined(OPUS_X86_MAY_HAVE_SSE4_1) +#include "x86/celt_lpc_sse.h" +#endif #define LPC_ORDER 24 void _celt_lpc(opus_val16 *_lpc, const opus_val32 *ac, int p); -void celt_fir(const opus_val16 *x, +void celt_fir_c( + const opus_val16 *x, const opus_val16 *num, opus_val16 *y, int N, int ord, - opus_val16 *mem); + int arch); + +#if !defined(OVERRIDE_CELT_FIR) +#define celt_fir(x, num, y, N, ord, arch) \ + (celt_fir_c(x, num, y, N, ord, arch)) +#endif void celt_iir(const opus_val32 *x, const opus_val16 *den, opus_val32 *y, int N, int ord, - opus_val16 *mem); + opus_val16 *mem, + int arch); -void _celt_autocorr(const opus_val16 *x, opus_val32 *ac, const opus_val16 *window, int overlap, int lag, int n); +int _celt_autocorr(const opus_val16 *x, opus_val32 *ac, + const opus_val16 *window, int overlap, int lag, int n, int arch); #endif /* PLC_H */ diff --git a/external/opus-1.3.1/celt/cpu_support.h b/external/opus-1.3.1/celt/cpu_support.h new file mode 100644 index 00000000..68fc6067 --- /dev/null +++ b/external/opus-1.3.1/celt/cpu_support.h @@ -0,0 +1,70 @@ +/* Copyright (c) 2010 Xiph.Org Foundation + * Copyright (c) 2013 Parrot */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CPU_SUPPORT_H +#define CPU_SUPPORT_H + +#include "opus_types.h" +#include "opus_defines.h" + +#if defined(OPUS_HAVE_RTCD) && \ + (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#include "arm/armcpu.h" + +/* We currently support 4 ARM variants: + * arch[0] -> ARMv4 + * arch[1] -> ARMv5E + * arch[2] -> ARMv6 + * arch[3] -> NEON + */ +#define OPUS_ARCHMASK 3 + +#elif (defined(OPUS_X86_MAY_HAVE_SSE) && !defined(OPUS_X86_PRESUME_SSE)) || \ + (defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(OPUS_X86_PRESUME_SSE2)) || \ + (defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1)) || \ + (defined(OPUS_X86_MAY_HAVE_AVX) && !defined(OPUS_X86_PRESUME_AVX)) + +#include "x86/x86cpu.h" +/* We currently support 5 x86 variants: + * arch[0] -> non-sse + * arch[1] -> sse + * arch[2] -> sse2 + * arch[3] -> sse4.1 + * arch[4] -> avx + */ +#define OPUS_ARCHMASK 7 +int opus_select_arch(void); + +#else +#define OPUS_ARCHMASK 0 + +static OPUS_INLINE int opus_select_arch(void) +{ + return 0; +} +#endif +#endif diff --git a/external/opus-1.3.1/celt/cwrs.c b/external/opus-1.3.1/celt/cwrs.c new file mode 100644 index 00000000..a552e4f0 --- /dev/null +++ b/external/opus-1.3.1/celt/cwrs.c @@ -0,0 +1,715 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2007-2009 Timothy B. Terriberry + Written by Timothy B. Terriberry and Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "os_support.h" +#include "cwrs.h" +#include "mathops.h" +#include "arch.h" + +#ifdef CUSTOM_MODES + +/*Guaranteed to return a conservatively large estimate of the binary logarithm + with frac bits of fractional precision. + Tested for all possible 32-bit inputs with frac=4, where the maximum + overestimation is 0.06254243 bits.*/ +int log2_frac(opus_uint32 val, int frac) +{ + int l; + l=EC_ILOG(val); + if(val&(val-1)){ + /*This is (val>>l-16), but guaranteed to round up, even if adding a bias + before the shift would cause overflow (e.g., for 0xFFFFxxxx). + Doesn't work for val=0, but that case fails the test above.*/ + if(l>16)val=((val-1)>>(l-16))+1; + else val<<=16-l; + l=(l-1)<>16); + l+=b<>b; + val=(val*val+0x7FFF)>>15; + } + while(frac-->0); + /*If val is not exactly 0x8000, then we have to round up the remainder.*/ + return l+(val>0x8000); + } + /*Exact powers of two require no rounding.*/ + else return (l-1)<0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1, + where choose() is the binomial function. + A table of values for N<10 and K<10 looks like: + V[10][10] = { + {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {1, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {1, 4, 8, 12, 16, 20, 24, 28, 32, 36}, + {1, 6, 18, 38, 66, 102, 146, 198, 258, 326}, + {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, + {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, + {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, + {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, + {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, + {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146} + }; + + U(N,K) = the number of such combinations wherein N-1 objects are taken at + most K-1 at a time. + This is given by + U(N,K) = sum(k=0...K-1,V(N-1,k)) + = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0. + The latter expression also makes clear that U(N,K) is half the number of such + combinations wherein the first object is taken at least once. + Although it may not be clear from either of these definitions, U(N,K) is the + natural function to work with when enumerating the pulse vector codebooks, + not V(N,K). + U(N,K) is not well-defined for N=0, but with the extension + U(0,K) = K>0 ? 0 : 1, + the function becomes symmetric: U(N,K) = U(K,N), with a similar table: + U[10][10] = { + {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 1, 3, 5, 7, 9, 11, 13, 15, 17}, + {0, 1, 5, 13, 25, 41, 61, 85, 113, 145}, + {0, 1, 7, 25, 63, 129, 231, 377, 575, 833}, + {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649}, + {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073}, + {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081}, + {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545}, + {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729} + }; + + With this extension, V(N,K) may be written in terms of U(N,K): + V(N,K) = U(N,K) + U(N,K+1) + for all N>=0, K>=0. + Thus U(N,K+1) represents the number of combinations where the first element + is positive or zero, and U(N,K) represents the number of combinations where + it is negative. + With a large enough table of U(N,K) values, we could write O(N) encoding + and O(min(N*log(K),N+K)) decoding routines, but such a table would be + prohibitively large for small embedded devices (K may be as large as 32767 + for small N, and N may be as large as 200). + + Both functions obey the same recurrence relation: + V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), + U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1), + for all N>0, K>0, with different initial conditions at N=0 or K=0. + This allows us to construct a row of one of the tables above given the + previous row or the next row. + Thus we can derive O(NK) encoding and decoding routines with O(K) memory + using only addition and subtraction. + + When encoding, we build up from the U(2,K) row and work our way forwards. + When decoding, we need to start at the U(N,K) row and work our way backwards, + which requires a means of computing U(N,K). + U(N,K) may be computed from two previous values with the same N: + U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2) + for all N>1, and since U(N,K) is symmetric, a similar relation holds for two + previous values with the same K: + U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K) + for all K>1. + This allows us to construct an arbitrary row of the U(N,K) table by starting + with the first two values, which are constants. + This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K) + multiplications. + Similar relations can be derived for V(N,K), but are not used here. + + For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree + polynomial for fixed N. + The first few are + U(1,K) = 1, + U(2,K) = 2*K-1, + U(3,K) = (2*K-2)*K+1, + U(4,K) = (((4*K-6)*K+8)*K-3)/3, + U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3, + and + V(1,K) = 2, + V(2,K) = 4*K, + V(3,K) = 4*K*K+2, + V(4,K) = 8*(K*K+2)*K/3, + V(5,K) = ((4*K*K+20)*K*K+6)/3, + for all K>0. + This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for + small N (and indeed decoding is also O(N) for N<3). + + @ARTICLE{Fis86, + author="Thomas R. Fischer", + title="A Pyramid Vector Quantizer", + journal="IEEE Transactions on Information Theory", + volume="IT-32", + number=4, + pages="568--583", + month=Jul, + year=1986 + }*/ + +#if !defined(SMALL_FOOTPRINT) + +/*U(N,K) = U(K,N) := N>0?K>0?U(N-1,K)+U(N,K-1)+U(N-1,K-1):0:K>0?1:0*/ +# define CELT_PVQ_U(_n,_k) (CELT_PVQ_U_ROW[IMIN(_n,_k)][IMAX(_n,_k)]) +/*V(N,K) := U(N,K)+U(N,K+1) = the number of PVQ codewords for a band of size N + with K pulses allocated to it.*/ +# define CELT_PVQ_V(_n,_k) (CELT_PVQ_U(_n,_k)+CELT_PVQ_U(_n,(_k)+1)) + +/*For each V(N,K) supported, we will access element U(min(N,K+1),max(N,K+1)). + Thus, the number of entries in row I is the larger of the maximum number of + pulses we will ever allocate for a given N=I (K=128, or however many fit in + 32 bits, whichever is smaller), plus one, and the maximum N for which + K=I-1 pulses fit in 32 bits. + The largest band size in an Opus Custom mode is 208. + Otherwise, we can limit things to the set of N which can be achieved by + splitting a band from a standard Opus mode: 176, 144, 96, 88, 72, 64, 48, + 44, 36, 32, 24, 22, 18, 16, 8, 4, 2).*/ +#if defined(CUSTOM_MODES) +static const opus_uint32 CELT_PVQ_U_DATA[1488]={ +#else +static const opus_uint32 CELT_PVQ_U_DATA[1272]={ +#endif + /*N=0, K=0...176:*/ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +#if defined(CUSTOM_MODES) + /*...208:*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +#endif + /*N=1, K=1...176:*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +#if defined(CUSTOM_MODES) + /*...208:*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, +#endif + /*N=2, K=2...176:*/ + 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, + 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, + 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, + 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, + 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, + 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, + 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, + 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, + 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293, + 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 317, 319, 321, 323, + 325, 327, 329, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, +#if defined(CUSTOM_MODES) + /*...208:*/ + 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381, + 383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411, + 413, 415, +#endif + /*N=3, K=3...176:*/ + 13, 25, 41, 61, 85, 113, 145, 181, 221, 265, 313, 365, 421, 481, 545, 613, + 685, 761, 841, 925, 1013, 1105, 1201, 1301, 1405, 1513, 1625, 1741, 1861, + 1985, 2113, 2245, 2381, 2521, 2665, 2813, 2965, 3121, 3281, 3445, 3613, 3785, + 3961, 4141, 4325, 4513, 4705, 4901, 5101, 5305, 5513, 5725, 5941, 6161, 6385, + 6613, 6845, 7081, 7321, 7565, 7813, 8065, 8321, 8581, 8845, 9113, 9385, 9661, + 9941, 10225, 10513, 10805, 11101, 11401, 11705, 12013, 12325, 12641, 12961, + 13285, 13613, 13945, 14281, 14621, 14965, 15313, 15665, 16021, 16381, 16745, + 17113, 17485, 17861, 18241, 18625, 19013, 19405, 19801, 20201, 20605, 21013, + 21425, 21841, 22261, 22685, 23113, 23545, 23981, 24421, 24865, 25313, 25765, + 26221, 26681, 27145, 27613, 28085, 28561, 29041, 29525, 30013, 30505, 31001, + 31501, 32005, 32513, 33025, 33541, 34061, 34585, 35113, 35645, 36181, 36721, + 37265, 37813, 38365, 38921, 39481, 40045, 40613, 41185, 41761, 42341, 42925, + 43513, 44105, 44701, 45301, 45905, 46513, 47125, 47741, 48361, 48985, 49613, + 50245, 50881, 51521, 52165, 52813, 53465, 54121, 54781, 55445, 56113, 56785, + 57461, 58141, 58825, 59513, 60205, 60901, 61601, +#if defined(CUSTOM_MODES) + /*...208:*/ + 62305, 63013, 63725, 64441, 65161, 65885, 66613, 67345, 68081, 68821, 69565, + 70313, 71065, 71821, 72581, 73345, 74113, 74885, 75661, 76441, 77225, 78013, + 78805, 79601, 80401, 81205, 82013, 82825, 83641, 84461, 85285, 86113, +#endif + /*N=4, K=4...176:*/ + 63, 129, 231, 377, 575, 833, 1159, 1561, 2047, 2625, 3303, 4089, 4991, 6017, + 7175, 8473, 9919, 11521, 13287, 15225, 17343, 19649, 22151, 24857, 27775, + 30913, 34279, 37881, 41727, 45825, 50183, 54809, 59711, 64897, 70375, 76153, + 82239, 88641, 95367, 102425, 109823, 117569, 125671, 134137, 142975, 152193, + 161799, 171801, 182207, 193025, 204263, 215929, 228031, 240577, 253575, + 267033, 280959, 295361, 310247, 325625, 341503, 357889, 374791, 392217, + 410175, 428673, 447719, 467321, 487487, 508225, 529543, 551449, 573951, + 597057, 620775, 645113, 670079, 695681, 721927, 748825, 776383, 804609, + 833511, 863097, 893375, 924353, 956039, 988441, 1021567, 1055425, 1090023, + 1125369, 1161471, 1198337, 1235975, 1274393, 1313599, 1353601, 1394407, + 1436025, 1478463, 1521729, 1565831, 1610777, 1656575, 1703233, 1750759, + 1799161, 1848447, 1898625, 1949703, 2001689, 2054591, 2108417, 2163175, + 2218873, 2275519, 2333121, 2391687, 2451225, 2511743, 2573249, 2635751, + 2699257, 2763775, 2829313, 2895879, 2963481, 3032127, 3101825, 3172583, + 3244409, 3317311, 3391297, 3466375, 3542553, 3619839, 3698241, 3777767, + 3858425, 3940223, 4023169, 4107271, 4192537, 4278975, 4366593, 4455399, + 4545401, 4636607, 4729025, 4822663, 4917529, 5013631, 5110977, 5209575, + 5309433, 5410559, 5512961, 5616647, 5721625, 5827903, 5935489, 6044391, + 6154617, 6266175, 6379073, 6493319, 6608921, 6725887, 6844225, 6963943, + 7085049, 7207551, +#if defined(CUSTOM_MODES) + /*...208:*/ + 7331457, 7456775, 7583513, 7711679, 7841281, 7972327, 8104825, 8238783, + 8374209, 8511111, 8649497, 8789375, 8930753, 9073639, 9218041, 9363967, + 9511425, 9660423, 9810969, 9963071, 10116737, 10271975, 10428793, 10587199, + 10747201, 10908807, 11072025, 11236863, 11403329, 11571431, 11741177, + 11912575, +#endif + /*N=5, K=5...176:*/ + 321, 681, 1289, 2241, 3649, 5641, 8361, 11969, 16641, 22569, 29961, 39041, + 50049, 63241, 78889, 97281, 118721, 143529, 172041, 204609, 241601, 283401, + 330409, 383041, 441729, 506921, 579081, 658689, 746241, 842249, 947241, + 1061761, 1186369, 1321641, 1468169, 1626561, 1797441, 1981449, 2179241, + 2391489, 2618881, 2862121, 3121929, 3399041, 3694209, 4008201, 4341801, + 4695809, 5071041, 5468329, 5888521, 6332481, 6801089, 7295241, 7815849, + 8363841, 8940161, 9545769, 10181641, 10848769, 11548161, 12280841, 13047849, + 13850241, 14689089, 15565481, 16480521, 17435329, 18431041, 19468809, + 20549801, 21675201, 22846209, 24064041, 25329929, 26645121, 28010881, + 29428489, 30899241, 32424449, 34005441, 35643561, 37340169, 39096641, + 40914369, 42794761, 44739241, 46749249, 48826241, 50971689, 53187081, + 55473921, 57833729, 60268041, 62778409, 65366401, 68033601, 70781609, + 73612041, 76526529, 79526721, 82614281, 85790889, 89058241, 92418049, + 95872041, 99421961, 103069569, 106816641, 110664969, 114616361, 118672641, + 122835649, 127107241, 131489289, 135983681, 140592321, 145317129, 150160041, + 155123009, 160208001, 165417001, 170752009, 176215041, 181808129, 187533321, + 193392681, 199388289, 205522241, 211796649, 218213641, 224775361, 231483969, + 238341641, 245350569, 252512961, 259831041, 267307049, 274943241, 282741889, + 290705281, 298835721, 307135529, 315607041, 324252609, 333074601, 342075401, + 351257409, 360623041, 370174729, 379914921, 389846081, 399970689, 410291241, + 420810249, 431530241, 442453761, 453583369, 464921641, 476471169, 488234561, + 500214441, 512413449, 524834241, 537479489, 550351881, 563454121, 576788929, + 590359041, 604167209, 618216201, 632508801, +#if defined(CUSTOM_MODES) + /*...208:*/ + 647047809, 661836041, 676876329, 692171521, 707724481, 723538089, 739615241, + 755958849, 772571841, 789457161, 806617769, 824056641, 841776769, 859781161, + 878072841, 896654849, 915530241, 934702089, 954173481, 973947521, 994027329, + 1014416041, 1035116809, 1056132801, 1077467201, 1099123209, 1121104041, + 1143412929, 1166053121, 1189027881, 1212340489, 1235994241, +#endif + /*N=6, K=6...96:*/ + 1683, 3653, 7183, 13073, 22363, 36365, 56695, 85305, 124515, 177045, 246047, + 335137, 448427, 590557, 766727, 982729, 1244979, 1560549, 1937199, 2383409, + 2908411, 3522221, 4235671, 5060441, 6009091, 7095093, 8332863, 9737793, + 11326283, 13115773, 15124775, 17372905, 19880915, 22670725, 25765455, + 29189457, 32968347, 37129037, 41699767, 46710137, 52191139, 58175189, + 64696159, 71789409, 79491819, 87841821, 96879431, 106646281, 117185651, + 128542501, 140763503, 153897073, 167993403, 183104493, 199284183, 216588185, + 235074115, 254801525, 275831935, 298228865, 322057867, 347386557, 374284647, + 402823977, 433078547, 465124549, 499040399, 534906769, 572806619, 612825229, + 655050231, 699571641, 746481891, 795875861, 847850911, 902506913, 959946283, + 1020274013, 1083597703, 1150027593, 1219676595, 1292660325, 1369097135, + 1449108145, 1532817275, 1620351277, 1711839767, 1807415257, 1907213187, + 2011371957, 2120032959, +#if defined(CUSTOM_MODES) + /*...109:*/ + 2233340609U, 2351442379U, 2474488829U, 2602633639U, 2736033641U, 2874848851U, + 3019242501U, 3169381071U, 3325434321U, 3487575323U, 3655980493U, 3830829623U, + 4012305913U, +#endif + /*N=7, K=7...54*/ + 8989, 19825, 40081, 75517, 134245, 227305, 369305, 579125, 880685, 1303777, + 1884961, 2668525, 3707509, 5064793, 6814249, 9041957, 11847485, 15345233, + 19665841, 24957661, 31388293, 39146185, 48442297, 59511829, 72616013, + 88043969, 106114625, 127178701, 151620757, 179861305, 212358985, 249612805, + 292164445, 340600625, 395555537, 457713341, 527810725, 606639529, 695049433, + 793950709, 904317037, 1027188385, 1163673953, 1314955181, 1482288821, + 1667010073, 1870535785, 2094367717, +#if defined(CUSTOM_MODES) + /*...60:*/ + 2340095869U, 2609401873U, 2904062449U, 3225952925U, 3577050821U, 3959439497U, +#endif + /*N=8, K=8...37*/ + 48639, 108545, 224143, 433905, 795455, 1392065, 2340495, 3800305, 5984767, + 9173505, 13726991, 20103025, 28875327, 40754369, 56610575, 77500017, + 104692735, 139703809, 184327311, 240673265, 311207743, 398796225, 506750351, + 638878193, 799538175, 993696769, 1226990095, 1505789553, 1837271615, + 2229491905U, +#if defined(CUSTOM_MODES) + /*...40:*/ + 2691463695U, 3233240945U, 3866006015U, +#endif + /*N=9, K=9...28:*/ + 265729, 598417, 1256465, 2485825, 4673345, 8405905, 14546705, 24331777, + 39490049, 62390545, 96220561, 145198913, 214828609, 312193553, 446304145, + 628496897, 872893441, 1196924561, 1621925137, 2173806145U, +#if defined(CUSTOM_MODES) + /*...29:*/ + 2883810113U, +#endif + /*N=10, K=10...24:*/ + 1462563, 3317445, 7059735, 14218905, 27298155, 50250765, 89129247, 152951073, + 254831667, 413442773, 654862247, 1014889769, 1541911931, 2300409629U, + 3375210671U, + /*N=11, K=11...19:*/ + 8097453, 18474633, 39753273, 81270333, 158819253, 298199265, 540279585, + 948062325, 1616336765, +#if defined(CUSTOM_MODES) + /*...20:*/ + 2684641785U, +#endif + /*N=12, K=12...18:*/ + 45046719, 103274625, 224298231, 464387817, 921406335, 1759885185, + 3248227095U, + /*N=13, K=13...16:*/ + 251595969, 579168825, 1267854873, 2653649025U, + /*N=14, K=14:*/ + 1409933619 +}; + +#if defined(CUSTOM_MODES) +static const opus_uint32 *const CELT_PVQ_U_ROW[15]={ + CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 208,CELT_PVQ_U_DATA+ 415, + CELT_PVQ_U_DATA+ 621,CELT_PVQ_U_DATA+ 826,CELT_PVQ_U_DATA+1030, + CELT_PVQ_U_DATA+1233,CELT_PVQ_U_DATA+1336,CELT_PVQ_U_DATA+1389, + CELT_PVQ_U_DATA+1421,CELT_PVQ_U_DATA+1441,CELT_PVQ_U_DATA+1455, + CELT_PVQ_U_DATA+1464,CELT_PVQ_U_DATA+1470,CELT_PVQ_U_DATA+1473 +}; +#else +static const opus_uint32 *const CELT_PVQ_U_ROW[15]={ + CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 176,CELT_PVQ_U_DATA+ 351, + CELT_PVQ_U_DATA+ 525,CELT_PVQ_U_DATA+ 698,CELT_PVQ_U_DATA+ 870, + CELT_PVQ_U_DATA+1041,CELT_PVQ_U_DATA+1131,CELT_PVQ_U_DATA+1178, + CELT_PVQ_U_DATA+1207,CELT_PVQ_U_DATA+1226,CELT_PVQ_U_DATA+1240, + CELT_PVQ_U_DATA+1248,CELT_PVQ_U_DATA+1254,CELT_PVQ_U_DATA+1257 +}; +#endif + +#if defined(CUSTOM_MODES) +void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ + int k; + /*_maxk==0 => there's nothing to do.*/ + celt_assert(_maxk>0); + _bits[0]=0; + for(k=1;k<=_maxk;k++)_bits[k]=log2_frac(CELT_PVQ_V(_n,k),_frac); +} +#endif + +static opus_uint32 icwrs(int _n,const int *_y){ + opus_uint32 i; + int j; + int k; + celt_assert(_n>=2); + j=_n-1; + i=_y[j]<0; + k=abs(_y[j]); + do{ + j--; + i+=CELT_PVQ_U(_n-j,k); + k+=abs(_y[j]); + if(_y[j]<0)i+=CELT_PVQ_U(_n-j,k+1); + } + while(j>0); + return i; +} + +void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ + celt_assert(_k>0); + ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k)); +} + +static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ + opus_uint32 p; + int s; + int k0; + opus_int16 val; + opus_val32 yy=0; + celt_assert(_k>0); + celt_assert(_n>1); + while(_n>2){ + opus_uint32 q; + /*Lots of pulses case:*/ + if(_k>=_n){ + const opus_uint32 *row; + row=CELT_PVQ_U_ROW[_n]; + /*Are the pulses in this dimension negative?*/ + p=row[_k+1]; + s=-(_i>=p); + _i-=p&s; + /*Count how many pulses were placed in this dimension.*/ + k0=_k; + q=row[_n]; + if(q>_i){ + celt_sig_assert(p>q); + _k=_n; + do p=CELT_PVQ_U_ROW[--_k][_n]; + while(p>_i); + } + else for(p=row[_k];p>_i;p=row[_k])_k--; + _i-=p; + val=(k0-_k+s)^s; + *_y++=val; + yy=MAC16_16(yy,val,val); + } + /*Lots of dimensions case:*/ + else{ + /*Are there any pulses in this dimension at all?*/ + p=CELT_PVQ_U_ROW[_k][_n]; + q=CELT_PVQ_U_ROW[_k+1][_n]; + if(p<=_i&&_i=q); + _i-=q&s; + /*Count how many pulses were placed in this dimension.*/ + k0=_k; + do p=CELT_PVQ_U_ROW[--_k][_n]; + while(p>_i); + _i-=p; + val=(k0-_k+s)^s; + *_y++=val; + yy=MAC16_16(yy,val,val); + } + } + _n--; + } + /*_n==2*/ + p=2*_k+1; + s=-(_i>=p); + _i-=p&s; + k0=_k; + _k=(_i+1)>>1; + if(_k)_i-=2*_k-1; + val=(k0-_k+s)^s; + *_y++=val; + yy=MAC16_16(yy,val,val); + /*_n==1*/ + s=-(int)_i; + val=(_k+s)^s; + *_y=val; + yy=MAC16_16(yy,val,val); + return yy; +} + +opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ + return cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y); +} + +#else /* SMALL_FOOTPRINT */ + +/*Computes the next row/column of any recurrence that obeys the relation + u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. + _ui0 is the base case for the new row/column.*/ +static OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ + opus_uint32 ui1; + unsigned j; + /*This do-while will overrun the array if we don't have storage for at least + 2 values.*/ + j=1; do { + ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0); + _ui[j-1]=_ui0; + _ui0=ui1; + } while (++j<_len); + _ui[j-1]=_ui0; +} + +/*Computes the previous row/column of any recurrence that obeys the relation + u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1]. + _ui0 is the base case for the new row/column.*/ +static OPUS_INLINE void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){ + opus_uint32 ui1; + unsigned j; + /*This do-while will overrun the array if we don't have storage for at least + 2 values.*/ + j=1; do { + ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0); + _ui[j-1]=_ui0; + _ui0=ui1; + } while (++j<_n); + _ui[j-1]=_ui0; +} + +/*Compute V(_n,_k), as well as U(_n,0..._k+1). + _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ +static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){ + opus_uint32 um2; + unsigned len; + unsigned k; + len=_k+2; + /*We require storage at least 3 values (e.g., _k>0).*/ + celt_assert(len>=3); + _u[0]=0; + _u[1]=um2=1; + /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ + /*If _n==1, _u[i] should be 1 for i>1.*/ + celt_assert(_n>=2); + /*If _k==0, the following do-while loop will overflow the buffer.*/ + celt_assert(_k>0); + k=2; + do _u[k]=(k<<1)-1; + while(++k0); + j=0; + do{ + opus_uint32 p; + int s; + int yj; + p=_u[_k+1]; + s=-(_i>=p); + _i-=p&s; + yj=_k; + p=_u[_k]; + while(p>_i)p=_u[--_k]; + _i-=p; + yj-=_k; + val=(yj+s)^s; + _y[j]=val; + yy=MAC16_16(yy,val,val); + uprev(_u,_k+2,0); + } + while(++j<_n); + return yy; +} + +/*Returns the index of the given combination of K elements chosen from a set + of size 1 with associated sign bits. + _y: The vector of pulses, whose sum of absolute values is K. + _k: Returns K.*/ +static OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){ + *_k=abs(_y[0]); + return _y[0]<0; +} + +/*Returns the index of the given combination of K elements chosen from a set + of size _n with associated sign bits. + _y: The vector of pulses, whose sum of absolute values must be _k. + _nc: Returns V(_n,_k).*/ +static OPUS_INLINE opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y, + opus_uint32 *_u){ + opus_uint32 i; + int j; + int k; + /*We can't unroll the first two iterations of the loop unless _n>=2.*/ + celt_assert(_n>=2); + _u[0]=0; + for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; + i=icwrs1(_y+_n-1,&k); + j=_n-2; + i+=_u[k]; + k+=abs(_y[j]); + if(_y[j]<0)i+=_u[k+1]; + while(j-->0){ + unext(_u,_k+2,0); + i+=_u[k]; + k+=abs(_y[j]); + if(_y[j]<0)i+=_u[k+1]; + } + *_nc=_u[k]+_u[k+1]; + return i; +} + +#ifdef CUSTOM_MODES +void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ + int k; + /*_maxk==0 => there's nothing to do.*/ + celt_assert(_maxk>0); + _bits[0]=0; + if (_n==1) + { + for (k=1;k<=_maxk;k++) + _bits[k] = 1<<_frac; + } + else { + VARDECL(opus_uint32,u); + SAVE_STACK; + ALLOC(u,_maxk+2U,opus_uint32); + ncwrs_urow(_n,_maxk,u); + for(k=1;k<=_maxk;k++) + _bits[k]=log2_frac(u[k]+u[k+1],_frac); + RESTORE_STACK; + } +} +#endif /* CUSTOM_MODES */ + +void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ + opus_uint32 i; + VARDECL(opus_uint32,u); + opus_uint32 nc; + SAVE_STACK; + celt_assert(_k>0); + ALLOC(u,_k+2U,opus_uint32); + i=icwrs(_n,_k,&nc,_y,u); + ec_enc_uint(_enc,i,nc); + RESTORE_STACK; +} + +opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ + VARDECL(opus_uint32,u); + int ret; + SAVE_STACK; + celt_assert(_k>0); + ALLOC(u,_k+2U,opus_uint32); + ret = cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); + RESTORE_STACK; + return ret; +} + +#endif /* SMALL_FOOTPRINT */ diff --git a/external/opus-1.0.3/celt/cwrs.h b/external/opus-1.3.1/celt/cwrs.h similarity index 96% rename from external/opus-1.0.3/celt/cwrs.h rename to external/opus-1.3.1/celt/cwrs.h index 7dfbd076..7cd47174 100644 --- a/external/opus-1.0.3/celt/cwrs.h +++ b/external/opus-1.3.1/celt/cwrs.h @@ -43,6 +43,6 @@ void get_required_bits(opus_int16 *bits, int N, int K, int frac); void encode_pulses(const int *_y, int N, int K, ec_enc *enc); -void decode_pulses(int *_y, int N, int K, ec_dec *dec); +opus_val32 decode_pulses(int *_y, int N, int K, ec_dec *dec); #endif /* CWRS_H */ diff --git a/external/opus-1.0.3/celt/ecintrin.h b/external/opus-1.3.1/celt/ecintrin.h similarity index 97% rename from external/opus-1.0.3/celt/ecintrin.h rename to external/opus-1.3.1/celt/ecintrin.h index be57dd40..2263cff6 100644 --- a/external/opus-1.0.3/celt/ecintrin.h +++ b/external/opus-1.3.1/celt/ecintrin.h @@ -33,7 +33,7 @@ #if !defined(_ecintrin_H) # define _ecintrin_H (1) -/*Some specific platforms may have optimized intrinsic or inline assembly +/*Some specific platforms may have optimized intrinsic or OPUS_INLINE assembly versions of these functions which can substantially improve performance. We define macros for them to allow easy incorporation of these non-ANSI features.*/ diff --git a/external/opus-1.0.3/celt/entcode.c b/external/opus-1.3.1/celt/entcode.c similarity index 58% rename from external/opus-1.0.3/celt/entcode.c rename to external/opus-1.3.1/celt/entcode.c index fa5d7c7c..70f32016 100644 --- a/external/opus-1.0.3/celt/entcode.c +++ b/external/opus-1.3.1/celt/entcode.c @@ -62,6 +62,27 @@ int ec_ilog(opus_uint32 _v){ } #endif +#if 1 +/* This is a faster version of ec_tell_frac() that takes advantage + of the low (1/8 bit) resolution to use just a linear function + followed by a lookup to determine the exact transition thresholds. */ +opus_uint32 ec_tell_frac(ec_ctx *_this){ + static const unsigned correction[8] = + {35733, 38967, 42495, 46340, + 50535, 55109, 60097, 65535}; + opus_uint32 nbits; + opus_uint32 r; + int l; + unsigned b; + nbits=_this->nbits_total<rng); + r=_this->rng>>(l-16); + b = (r>>12)-8; + b += r>correction[b]; + l = (l<<3)+b; + return nbits-l; +} +#else opus_uint32 ec_tell_frac(ec_ctx *_this){ opus_uint32 nbits; opus_uint32 r; @@ -91,3 +112,42 @@ opus_uint32 ec_tell_frac(ec_ctx *_this){ } return nbits-l; } +#endif + +#ifdef USE_SMALL_DIV_TABLE +/* Result of 2^32/(2*i+1), except for i=0. */ +const opus_uint32 SMALL_DIV_TABLE[129] = { + 0xFFFFFFFF, 0x55555555, 0x33333333, 0x24924924, + 0x1C71C71C, 0x1745D174, 0x13B13B13, 0x11111111, + 0x0F0F0F0F, 0x0D79435E, 0x0C30C30C, 0x0B21642C, + 0x0A3D70A3, 0x097B425E, 0x08D3DCB0, 0x08421084, + 0x07C1F07C, 0x07507507, 0x06EB3E45, 0x06906906, + 0x063E7063, 0x05F417D0, 0x05B05B05, 0x0572620A, + 0x05397829, 0x05050505, 0x04D4873E, 0x04A7904A, + 0x047DC11F, 0x0456C797, 0x04325C53, 0x04104104, + 0x03F03F03, 0x03D22635, 0x03B5CC0E, 0x039B0AD1, + 0x0381C0E0, 0x0369D036, 0x03531DEC, 0x033D91D2, + 0x0329161F, 0x03159721, 0x03030303, 0x02F14990, + 0x02E05C0B, 0x02D02D02, 0x02C0B02C, 0x02B1DA46, + 0x02A3A0FD, 0x0295FAD4, 0x0288DF0C, 0x027C4597, + 0x02702702, 0x02647C69, 0x02593F69, 0x024E6A17, + 0x0243F6F0, 0x0239E0D5, 0x02302302, 0x0226B902, + 0x021D9EAD, 0x0214D021, 0x020C49BA, 0x02040810, + 0x01FC07F0, 0x01F44659, 0x01ECC07B, 0x01E573AC, + 0x01DE5D6E, 0x01D77B65, 0x01D0CB58, 0x01CA4B30, + 0x01C3F8F0, 0x01BDD2B8, 0x01B7D6C3, 0x01B20364, + 0x01AC5701, 0x01A6D01A, 0x01A16D3F, 0x019C2D14, + 0x01970E4F, 0x01920FB4, 0x018D3018, 0x01886E5F, + 0x0183C977, 0x017F405F, 0x017AD220, 0x01767DCE, + 0x01724287, 0x016E1F76, 0x016A13CD, 0x01661EC6, + 0x01623FA7, 0x015E75BB, 0x015AC056, 0x01571ED3, + 0x01539094, 0x01501501, 0x014CAB88, 0x0149539E, + 0x01460CBC, 0x0142D662, 0x013FB013, 0x013C995A, + 0x013991C2, 0x013698DF, 0x0133AE45, 0x0130D190, + 0x012E025C, 0x012B404A, 0x01288B01, 0x0125E227, + 0x01234567, 0x0120B470, 0x011E2EF3, 0x011BB4A4, + 0x01194538, 0x0116E068, 0x011485F0, 0x0112358E, + 0x010FEF01, 0x010DB20A, 0x010B7E6E, 0x010953F3, + 0x01073260, 0x0105197F, 0x0103091B, 0x01010101 +}; +#endif diff --git a/external/opus-1.0.3/celt/entcode.h b/external/opus-1.3.1/celt/entcode.h similarity index 81% rename from external/opus-1.0.3/celt/entcode.h rename to external/opus-1.3.1/celt/entcode.h index aebecc06..3763e3f2 100644 --- a/external/opus-1.0.3/celt/entcode.h +++ b/external/opus-1.3.1/celt/entcode.h @@ -26,6 +26,7 @@ */ #include "opus_types.h" +#include "opus_defines.h" #if !defined(_entcode_H) # define _entcode_H (1) @@ -33,6 +34,12 @@ # include # include "ecintrin.h" +extern const opus_uint32 SMALL_DIV_TABLE[129]; + +#ifdef OPUS_ARM_ASM +#define USE_SMALL_DIV_TABLE +#endif + /*OPT: ec_window must be at least 32 bits, but if you have fast arithmetic on a larger type, you can speed up the decoder by using it here.*/ typedef opus_uint32 ec_window; @@ -83,15 +90,15 @@ struct ec_ctx{ int error; }; -static inline opus_uint32 ec_range_bytes(ec_ctx *_this){ +static OPUS_INLINE opus_uint32 ec_range_bytes(ec_ctx *_this){ return _this->offs; } -static inline unsigned char *ec_get_buffer(ec_ctx *_this){ +static OPUS_INLINE unsigned char *ec_get_buffer(ec_ctx *_this){ return _this->buf; } -static inline int ec_get_error(ec_ctx *_this){ +static OPUS_INLINE int ec_get_error(ec_ctx *_this){ return _this->error; } @@ -101,7 +108,7 @@ static inline int ec_get_error(ec_ctx *_this){ Return: The number of bits. This will always be slightly larger than the exact value (e.g., all rounding error is in the positive direction).*/ -static inline int ec_tell(ec_ctx *_this){ +static OPUS_INLINE int ec_tell(ec_ctx *_this){ return _this->nbits_total-EC_ILOG(_this->rng); } @@ -113,4 +120,33 @@ static inline int ec_tell(ec_ctx *_this){ rounding error is in the positive direction).*/ opus_uint32 ec_tell_frac(ec_ctx *_this); +/* Tested exhaustively for all n and for 1<=d<=256 */ +static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { + celt_sig_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (d>256) + return n/d; + else { + opus_uint32 t, q; + t = EC_ILOG(d&-d); + q = (opus_uint64)SMALL_DIV_TABLE[d>>t]*(n>>(t-1))>>32; + return q+(n-q*d >= d); + } +#else + return n/d; +#endif +} + +static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { + celt_sig_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (n<0) + return -(opus_int32)celt_udiv(-n, d); + else + return celt_udiv(n, d); +#else + return n/d; +#endif +} + #endif diff --git a/external/opus-1.0.3/celt/entdec.c b/external/opus-1.3.1/celt/entdec.c similarity index 98% rename from external/opus-1.0.3/celt/entdec.c rename to external/opus-1.3.1/celt/entdec.c index 75e3e45a..0b3433ed 100644 --- a/external/opus-1.0.3/celt/entdec.c +++ b/external/opus-1.3.1/celt/entdec.c @@ -85,7 +85,7 @@ number=3, pages="256--294", month=Jul, - URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf" + URL="http://www.stanford.edu/class/ee398a/handouts/papers/Moffat98ArithmCoding.pdf" }*/ static int ec_read_byte(ec_dec *_this){ @@ -138,7 +138,7 @@ void ec_dec_init(ec_dec *_this,unsigned char *_buf,opus_uint32 _storage){ unsigned ec_decode(ec_dec *_this,unsigned _ft){ unsigned s; - _this->ext=_this->rng/_ft; + _this->ext=celt_udiv(_this->rng,_ft); s=(unsigned)(_this->val/_this->ext); return _ft-EC_MINI(s+1,_ft); } diff --git a/external/opus-1.0.3/celt/entdec.h b/external/opus-1.3.1/celt/entdec.h similarity index 98% rename from external/opus-1.0.3/celt/entdec.h rename to external/opus-1.3.1/celt/entdec.h index d8ab3187..025fc187 100644 --- a/external/opus-1.0.3/celt/entdec.h +++ b/external/opus-1.3.1/celt/entdec.h @@ -85,7 +85,7 @@ int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb); The bits must have been encoded with ec_enc_uint(). No call to ec_dec_update() is necessary after this call. _ft: The number of integers that can be decoded (one more than the max). - This must be at least one, and no more than 2**32-1. + This must be at least 2, and no more than 2**32-1. Return: The decoded bits.*/ opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft); diff --git a/external/opus-1.0.3/celt/entenc.c b/external/opus-1.3.1/celt/entenc.c similarity index 99% rename from external/opus-1.0.3/celt/entenc.c rename to external/opus-1.3.1/celt/entenc.c index a7e34ece..f1750d25 100644 --- a/external/opus-1.0.3/celt/entenc.c +++ b/external/opus-1.3.1/celt/entenc.c @@ -98,7 +98,7 @@ static void ec_enc_carry_out(ec_enc *_this,int _c){ else _this->ext++; } -static void ec_enc_normalize(ec_enc *_this){ +static OPUS_INLINE void ec_enc_normalize(ec_enc *_this){ /*If the range is too small, output some bits and rescale it.*/ while(_this->rng<=EC_CODE_BOT){ ec_enc_carry_out(_this,(int)(_this->val>>EC_CODE_SHIFT)); @@ -127,7 +127,7 @@ void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size){ void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){ opus_uint32 r; - r=_this->rng/_ft; + r=celt_udiv(_this->rng,_ft); if(_fl>0){ _this->val+=_this->rng-IMUL32(r,(_ft-_fl)); _this->rng=IMUL32(r,(_fh-_fl)); diff --git a/external/opus-1.0.3/celt/entenc.h b/external/opus-1.3.1/celt/entenc.h similarity index 98% rename from external/opus-1.0.3/celt/entenc.h rename to external/opus-1.3.1/celt/entenc.h index 796bc4d5..f502eaf6 100644 --- a/external/opus-1.0.3/celt/entenc.h +++ b/external/opus-1.3.1/celt/entenc.h @@ -67,7 +67,7 @@ void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb); /*Encodes a raw unsigned integer in the stream. _fl: The integer to encode. _ft: The number of integers that can be encoded (one more than the max). - This must be at least one, and no more than 2**32-1.*/ + This must be at least 2, and no more than 2**32-1.*/ void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft); /*Encodes a sequence of raw bits in the stream. diff --git a/external/opus-1.0.3/celt/fixed_debug.h b/external/opus-1.3.1/celt/fixed_debug.h similarity index 86% rename from external/opus-1.0.3/celt/fixed_debug.h rename to external/opus-1.3.1/celt/fixed_debug.h index f11d890d..f4352952 100644 --- a/external/opus-1.0.3/celt/fixed_debug.h +++ b/external/opus-1.3.1/celt/fixed_debug.h @@ -33,9 +33,9 @@ #define FIXED_DEBUG_H #include +#include "opus_defines.h" #ifdef CELT_C -#include "opus_defines.h" OPUS_EXPORT opus_int64 celt_mips=0; #else extern opus_int64 celt_mips; @@ -59,7 +59,15 @@ extern opus_int64 celt_mips; #define SHR(a,b) SHR32(a,b) #define PSHR(a,b) PSHR32(a,b) -static inline short NEG16(int x) +/** Add two 32-bit values, ignore any overflows */ +#define ADD32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) +/** Subtract two 32-bit values, ignore any overflows */ +#define SUB32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) +/* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ +/** Negate 32-bit value, ignore any overflows */ +#define NEG32_ovflw(a) (celt_mips+=2,(opus_val32)(0-(opus_uint32)(a))) + +static OPUS_INLINE short NEG16(int x) { int res; if (!VERIFY_SHORT(x)) @@ -80,7 +88,7 @@ static inline short NEG16(int x) celt_mips++; return res; } -static inline int NEG32(opus_int64 x) +static OPUS_INLINE int NEG32(opus_int64 x) { opus_int64 res; if (!VERIFY_INT(x)) @@ -103,7 +111,7 @@ static inline int NEG32(opus_int64 x) } #define EXTRACT16(x) EXTRACT16_(x, __FILE__, __LINE__) -static inline short EXTRACT16_(int x, char *file, int line) +static OPUS_INLINE short EXTRACT16_(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) @@ -119,7 +127,7 @@ static inline short EXTRACT16_(int x, char *file, int line) } #define EXTEND32(x) EXTEND32_(x, __FILE__, __LINE__) -static inline int EXTEND32_(int x, char *file, int line) +static OPUS_INLINE int EXTEND32_(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) @@ -135,7 +143,7 @@ static inline int EXTEND32_(int x, char *file, int line) } #define SHR16(a, shift) SHR16_(a, shift, __FILE__, __LINE__) -static inline short SHR16_(int a, int shift, char *file, int line) +static OPUS_INLINE short SHR16_(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) @@ -157,7 +165,7 @@ static inline short SHR16_(int a, int shift, char *file, int line) return res; } #define SHL16(a, shift) SHL16_(a, shift, __FILE__, __LINE__) -static inline short SHL16_(int a, int shift, char *file, int line) +static OPUS_INLINE short SHL16_(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) @@ -179,7 +187,7 @@ static inline short SHL16_(int a, int shift, char *file, int line) return res; } -static inline int SHR32(opus_int64 a, int shift) +static OPUS_INLINE int SHR32(opus_int64 a, int shift) { opus_int64 res; if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) @@ -201,7 +209,7 @@ static inline int SHR32(opus_int64 a, int shift) return res; } #define SHL32(a, shift) SHL32_(a, shift, __FILE__, __LINE__) -static inline int SHL32_(opus_int64 a, int shift, char *file, int line) +static OPUS_INLINE int SHL32_(opus_int64 a, int shift, char *file, int line) { opus_int64 res; if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) @@ -227,14 +235,13 @@ static inline int SHL32_(opus_int64 a, int shift, char *file, int line) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a)))) +#define SROUND16(x,a) (celt_mips--,EXTRACT16(SATURATE(PSHR32(x,a), 32767))); + #define HALF16(x) (SHR16(x,1)) #define HALF32(x) (SHR32(x,1)) -//#define SHR(a,shift) ((a) >> (shift)) -//#define SHL(a,shift) ((a) << (shift)) - #define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__) -static inline short ADD16_(int a, int b, char *file, int line) +static OPUS_INLINE short ADD16_(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -257,7 +264,7 @@ static inline short ADD16_(int a, int b, char *file, int line) } #define SUB16(a, b) SUB16_(a, b, __FILE__, __LINE__) -static inline short SUB16_(int a, int b, char *file, int line) +static OPUS_INLINE short SUB16_(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -280,7 +287,7 @@ static inline short SUB16_(int a, int b, char *file, int line) } #define ADD32(a, b) ADD32_(a, b, __FILE__, __LINE__) -static inline int ADD32_(opus_int64 a, opus_int64 b, char *file, int line) +static OPUS_INLINE int ADD32_(opus_int64 a, opus_int64 b, char *file, int line) { opus_int64 res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) @@ -303,7 +310,7 @@ static inline int ADD32_(opus_int64 a, opus_int64 b, char *file, int line) } #define SUB32(a, b) SUB32_(a, b, __FILE__, __LINE__) -static inline int SUB32_(opus_int64 a, opus_int64 b, char *file, int line) +static OPUS_INLINE int SUB32_(opus_int64 a, opus_int64 b, char *file, int line) { opus_int64 res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) @@ -327,7 +334,7 @@ static inline int SUB32_(opus_int64 a, opus_int64 b, char *file, int line) #undef UADD32 #define UADD32(a, b) UADD32_(a, b, __FILE__, __LINE__) -static inline unsigned int UADD32_(opus_uint64 a, opus_uint64 b, char *file, int line) +static OPUS_INLINE unsigned int UADD32_(opus_uint64 a, opus_uint64 b, char *file, int line) { opus_uint64 res; if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) @@ -351,7 +358,7 @@ static inline unsigned int UADD32_(opus_uint64 a, opus_uint64 b, char *file, int #undef USUB32 #define USUB32(a, b) USUB32_(a, b, __FILE__, __LINE__) -static inline unsigned int USUB32_(opus_uint64 a, opus_uint64 b, char *file, int line) +static OPUS_INLINE unsigned int USUB32_(opus_uint64 a, opus_uint64 b, char *file, int line) { opus_uint64 res; if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) @@ -381,7 +388,7 @@ static inline unsigned int USUB32_(opus_uint64 a, opus_uint64 b, char *file, int } /* result fits in 16 bits */ -static inline short MULT16_16_16(int a, int b) +static OPUS_INLINE short MULT16_16_16(int a, int b) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -404,7 +411,7 @@ static inline short MULT16_16_16(int a, int b) } #define MULT16_16(a, b) MULT16_16_(a, b, __FILE__, __LINE__) -static inline int MULT16_16_(int a, int b, char *file, int line) +static OPUS_INLINE int MULT16_16_(int a, int b, char *file, int line) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -429,7 +436,7 @@ static inline int MULT16_16_(int a, int b, char *file, int line) #define MAC16_16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_16((a),(b)))) #define MULT16_32_QX(a, b, Q) MULT16_32_QX_(a, b, Q, __FILE__, __LINE__) -static inline int MULT16_32_QX_(int a, opus_int64 b, int Q, char *file, int line) +static OPUS_INLINE int MULT16_32_QX_(int a, opus_int64 b, int Q, char *file, int line) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) @@ -462,7 +469,7 @@ static inline int MULT16_32_QX_(int a, opus_int64 b, int Q, char *file, int line } #define MULT16_32_PX(a, b, Q) MULT16_32_PX_(a, b, Q, __FILE__, __LINE__) -static inline int MULT16_32_PX_(int a, opus_int64 b, int Q, char *file, int line) +static OPUS_INLINE int MULT16_32_PX_(int a, opus_int64 b, int Q, char *file, int line) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) @@ -496,8 +503,9 @@ static inline int MULT16_32_PX_(int a, opus_int64 b, int Q, char *file, int line #define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15) #define MAC16_32_Q15(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q15((a),(b)))) +#define MAC16_32_Q16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q16((a),(b)))) -static inline int SATURATE(int a, int b) +static OPUS_INLINE int SATURATE(int a, int b) { if (a>b) a=b; @@ -507,7 +515,17 @@ static inline int SATURATE(int a, int b) return a; } -static inline int MULT16_16_Q11_32(int a, int b) +static OPUS_INLINE opus_int16 SATURATE16(opus_int32 a) +{ + celt_mips+=3; + if (a>32767) + return 32767; + else if (a<-32768) + return -32768; + else return a; +} + +static OPUS_INLINE int MULT16_16_Q11_32(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -529,7 +547,7 @@ static inline int MULT16_16_Q11_32(int a, int b) celt_mips+=3; return res; } -static inline short MULT16_16_Q13(int a, int b) +static OPUS_INLINE short MULT16_16_Q13(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -551,7 +569,7 @@ static inline short MULT16_16_Q13(int a, int b) celt_mips+=3; return res; } -static inline short MULT16_16_Q14(int a, int b) +static OPUS_INLINE short MULT16_16_Q14(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -575,7 +593,7 @@ static inline short MULT16_16_Q14(int a, int b) } #define MULT16_16_Q15(a, b) MULT16_16_Q15_(a, b, __FILE__, __LINE__) -static inline short MULT16_16_Q15_(int a, int b, char *file, int line) +static OPUS_INLINE short MULT16_16_Q15_(int a, int b, char *file, int line) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -598,7 +616,7 @@ static inline short MULT16_16_Q15_(int a, int b, char *file, int line) return res; } -static inline short MULT16_16_P13(int a, int b) +static OPUS_INLINE short MULT16_16_P13(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -628,7 +646,7 @@ static inline short MULT16_16_P13(int a, int b) celt_mips+=4; return res; } -static inline short MULT16_16_P14(int a, int b) +static OPUS_INLINE short MULT16_16_P14(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -658,7 +676,7 @@ static inline short MULT16_16_P14(int a, int b) celt_mips+=4; return res; } -static inline short MULT16_16_P15(int a, int b) +static OPUS_INLINE short MULT16_16_P15(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) @@ -691,7 +709,7 @@ static inline short MULT16_16_P15(int a, int b) #define DIV32_16(a, b) DIV32_16_(a, b, __FILE__, __LINE__) -static inline int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line) +static OPUS_INLINE int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line) { opus_int64 res; if (b==0) @@ -726,7 +744,7 @@ static inline int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line) } #define DIV32(a, b) DIV32_(a, b, __FILE__, __LINE__) -static inline int DIV32_(opus_int64 a, opus_int64 b, char *file, int line) +static OPUS_INLINE int DIV32_(opus_int64 a, opus_int64 b, char *file, int line) { opus_int64 res; if (b==0) @@ -757,6 +775,16 @@ static inline int DIV32_(opus_int64 a, opus_int64 b, char *file, int line) return res; } +static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) +{ + x = PSHR32(x, SIG_SHIFT); + x = MAX32(x, -32768); + x = MIN32(x, 32767); + return EXTRACT16(x); +} +#define SIG2WORD16(x) (SIG2WORD16_generic(x)) + + #undef PRINT_MIPS #define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", celt_mips);} while (0); diff --git a/external/opus-1.0.3/celt/fixed_generic.h b/external/opus-1.3.1/celt/fixed_generic.h similarity index 75% rename from external/opus-1.0.3/celt/fixed_generic.h rename to external/opus-1.3.1/celt/fixed_generic.h index 71e28d62..5f4abda7 100644 --- a/external/opus-1.0.3/celt/fixed_generic.h +++ b/external/opus-1.3.1/celt/fixed_generic.h @@ -37,16 +37,32 @@ #define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b)) /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ +#if OPUS_FAST_INT64 +#define MULT16_32_Q16(a,b) ((opus_val32)SHR((opus_int64)((opus_val16)(a))*(b),16)) +#else #define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) +#endif /** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */ -#define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16((a),((b)&0x0000ffff)),16)) +#if OPUS_FAST_INT64 +#define MULT16_32_P16(a,b) ((opus_val32)PSHR((opus_int64)((opus_val16)(a))*(b),16)) +#else +#define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) +#endif /** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ +#if OPUS_FAST_INT64 +#define MULT16_32_Q15(a,b) ((opus_val32)SHR((opus_int64)((opus_val16)(a))*(b),15)) +#else #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15)) +#endif /** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ +#if OPUS_FAST_INT64 +#define MULT32_32_Q31(a,b) ((opus_val32)SHR((opus_int64)(a)*(opus_int64)(b),31)) +#else #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15)) +#endif /** Compile-time conversion of float constant to 16-bit value */ #define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) @@ -84,8 +100,13 @@ #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) +#define SATURATE16(x) (EXTRACT16((x)>32767 ? 32767 : (x)<-32768 ? -32768 : (x))) + /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ #define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) +/** Shift by a and round-to-neareast 32-bit value. Result is a saturated 16-bit value */ +#define SROUND16(x,a) EXTRACT16(SATURATE(PSHR32(x,a), 32767)); + /** Divide by two */ #define HALF16(x) (SHR16(x,1)) #define HALF32(x) (SHR32(x,1)) @@ -99,6 +120,14 @@ /** Subtract two 32-bit values */ #define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b)) +/** Add two 32-bit values, ignore any overflows */ +#define ADD32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) +/** Subtract two 32-bit values, ignore any overflows */ +#define SUB32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) +/* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ +/** Negate 32-bit value, ignore any overflows */ +#define NEG32_ovflw(a) ((opus_val32)(0-(opus_uint32)(a))) + /** 16x16 multiplication where the result fits in 16 bits */ #define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b)))) @@ -108,10 +137,17 @@ /** 16x16 multiply-add where the result fits in 32 bits */ #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) -/** 16x32 multiply-add, followed by a 15-bit shift right. Results fits in 32 bits */ -#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) +/** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. + b must fit in 31 bits. + Result fits in 32 bits. */ +#define MAC16_32_Q15(c,a,b) ADD32((c),ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) + +/** 16x32 multiplication, followed by a 16-bit shift right and 32-bit add. + Results fits in 32 bits */ +#define MAC16_32_Q16(c,a,b) ADD32((c),ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16))) #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) +#define MULT16_16_Q11(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) #define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) @@ -126,4 +162,17 @@ /** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */ #define DIV32(a,b) (((opus_val32)(a))/((opus_val32)(b))) +#if defined(MIPSr1_ASM) +#include "mips/fixed_generic_mipsr1.h" +#endif + +static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) +{ + x = PSHR32(x, SIG_SHIFT); + x = MAX32(x, -32768); + x = MIN32(x, 32767); + return EXTRACT16(x); +} +#define SIG2WORD16(x) (SIG2WORD16_generic(x)) + #endif diff --git a/external/opus-1.0.3/celt/float_cast.h b/external/opus-1.3.1/celt/float_cast.h similarity index 88% rename from external/opus-1.0.3/celt/float_cast.h rename to external/opus-1.3.1/celt/float_cast.h index 3b58af7f..889dae96 100644 --- a/external/opus-1.0.3/celt/float_cast.h +++ b/external/opus-1.3.1/celt/float_cast.h @@ -61,14 +61,13 @@ ** the config.h file. */ -#if (defined(__GNUC__) && defined(_WIN64)) - #include - static __inline long int float2int(float value) - { - return _mm_cvtss_si32(_mm_load_ss(&value)); - } +/* With GCC, when SSE is available, the fastest conversion is cvtss2si. */ +#if defined(__GNUC__) && defined(__SSE__) + +#include +static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_ss(x));} -#elif (HAVE_LRINTF) +#elif defined(HAVE_LRINTF) /* These defines enable functionality introduced with the 1999 ISO C ** standard. They must be defined before the inclusion of math.h to @@ -97,21 +96,21 @@ #include #define float2int(x) lrint(x) -#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN64) || defined (_WIN64)) +#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1)) #include - __inline long int float2int(float value) + static __inline long int float2int(float value) { return _mm_cvtss_si32(_mm_load_ss(&value)); } -#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN32) || defined (_WIN32)) +#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && defined (_M_IX86) #include /* Win32 doesn't seem to have these functions. - ** Therefore implement inline versions of these functions here. + ** Therefore implement OPUS_INLINE versions of these functions here. */ - __inline long int + static __inline long int float2int (float flt) { int intgr; @@ -135,7 +134,7 @@ #endif #ifndef DISABLE_FLOAT_API -static inline opus_int16 FLOAT2INT16(float x) +static OPUS_INLINE opus_int16 FLOAT2INT16(float x) { x = x*CELT_SIG_SCALE; x = MAX32(x, -32768); diff --git a/external/opus-1.3.1/celt/kiss_fft.c b/external/opus-1.3.1/celt/kiss_fft.c new file mode 100644 index 00000000..83775165 --- /dev/null +++ b/external/opus-1.3.1/celt/kiss_fft.c @@ -0,0 +1,604 @@ +/*Copyright (c) 2003-2004, Mark Borgerding + Lots of modifications by Jean-Marc Valin + Copyright (c) 2005-2007, Xiph.Org Foundation + Copyright (c) 2008, Xiph.Org Foundation, CSIRO + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE.*/ + +/* This code is originally from Mark Borgerding's KISS-FFT but has been + heavily modified to better suit Opus */ + +#ifndef SKIP_CONFIG_H +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif +#endif + +#include "_kiss_fft_guts.h" +#include "arch.h" +#include "os_support.h" +#include "mathops.h" +#include "stack_alloc.h" + +/* The guts header contains all the multiplication and addition macros that are defined for + complex numbers. It also delares the kf_ internal functions. +*/ + +static void kf_bfly2( + kiss_fft_cpx * Fout, + int m, + int N + ) +{ + kiss_fft_cpx * Fout2; + int i; + (void)m; +#ifdef CUSTOM_MODES + if (m==1) + { + celt_assert(m==1); + for (i=0;itwiddles; + /* m is guaranteed to be a multiple of 4. */ + for (j=0;jtwiddles[fstride*m]; +#endif + for (i=0;itwiddles; + /* For non-custom modes, m is guaranteed to be a multiple of 4. */ + k=m; + do { + + C_MUL(scratch[1],Fout[m] , *tw1); + C_MUL(scratch[2],Fout[m2] , *tw2); + + C_ADD(scratch[3],scratch[1],scratch[2]); + C_SUB(scratch[0],scratch[1],scratch[2]); + tw1 += fstride; + tw2 += fstride*2; + + Fout[m].r = SUB32_ovflw(Fout->r, HALF_OF(scratch[3].r)); + Fout[m].i = SUB32_ovflw(Fout->i, HALF_OF(scratch[3].i)); + + C_MULBYSCALAR( scratch[0] , epi3.i ); + + C_ADDTO(*Fout,scratch[3]); + + Fout[m2].r = ADD32_ovflw(Fout[m].r, scratch[0].i); + Fout[m2].i = SUB32_ovflw(Fout[m].i, scratch[0].r); + + Fout[m].r = SUB32_ovflw(Fout[m].r, scratch[0].i); + Fout[m].i = ADD32_ovflw(Fout[m].i, scratch[0].r); + + ++Fout; + } while(--k); + } +} + + +#ifndef OVERRIDE_kf_bfly5 +static void kf_bfly5( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_state *st, + int m, + int N, + int mm + ) +{ + kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; + int i, u; + kiss_fft_cpx scratch[13]; + const kiss_twiddle_cpx *tw; + kiss_twiddle_cpx ya,yb; + kiss_fft_cpx * Fout_beg = Fout; + +#ifdef FIXED_POINT + ya.r = 10126; + ya.i = -31164; + yb.r = -26510; + yb.i = -19261; +#else + ya = st->twiddles[fstride*m]; + yb = st->twiddles[fstride*2*m]; +#endif + tw=st->twiddles; + + for (i=0;ir = ADD32_ovflw(Fout0->r, ADD32_ovflw(scratch[7].r, scratch[8].r)); + Fout0->i = ADD32_ovflw(Fout0->i, ADD32_ovflw(scratch[7].i, scratch[8].i)); + + scratch[5].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,ya.r), S_MUL(scratch[8].r,yb.r))); + scratch[5].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,ya.r), S_MUL(scratch[8].i,yb.r))); + + scratch[6].r = ADD32_ovflw(S_MUL(scratch[10].i,ya.i), S_MUL(scratch[9].i,yb.i)); + scratch[6].i = NEG32_ovflw(ADD32_ovflw(S_MUL(scratch[10].r,ya.i), S_MUL(scratch[9].r,yb.i))); + + C_SUB(*Fout1,scratch[5],scratch[6]); + C_ADD(*Fout4,scratch[5],scratch[6]); + + scratch[11].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,yb.r), S_MUL(scratch[8].r,ya.r))); + scratch[11].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,yb.r), S_MUL(scratch[8].i,ya.r))); + scratch[12].r = SUB32_ovflw(S_MUL(scratch[9].i,ya.i), S_MUL(scratch[10].i,yb.i)); + scratch[12].i = SUB32_ovflw(S_MUL(scratch[10].r,yb.i), S_MUL(scratch[9].r,ya.i)); + + C_ADD(*Fout2,scratch[11],scratch[12]); + C_SUB(*Fout3,scratch[11],scratch[12]); + + ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; + } + } +} +#endif /* OVERRIDE_kf_bfly5 */ + + +#endif + + +#ifdef CUSTOM_MODES + +static +void compute_bitrev_table( + int Fout, + opus_int16 *f, + const size_t fstride, + int in_stride, + opus_int16 * factors, + const kiss_fft_state *st + ) +{ + const int p=*factors++; /* the radix */ + const int m=*factors++; /* stage's fft length/p */ + + /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ + if (m==1) + { + int j; + for (j=0;j32000 || (opus_int32)p*(opus_int32)p > n) + p = n; /* no more factors, skip to end */ + } + n /= p; +#ifdef RADIX_TWO_ONLY + if (p!=2 && p != 4) +#else + if (p>5) +#endif + { + return 0; + } + facbuf[2*stages] = p; + if (p==2 && stages > 1) + { + facbuf[2*stages] = 4; + facbuf[2] = 2; + } + stages++; + } while (n > 1); + n = nbak; + /* Reverse the order to get the radix 4 at the end, so we can use the + fast degenerate case. It turns out that reversing the order also + improves the noise behaviour. */ + for (i=0;i= memneeded) + st = (kiss_fft_state*)mem; + *lenmem = memneeded; + } + if (st) { + opus_int16 *bitrev; + kiss_twiddle_cpx *twiddles; + + st->nfft=nfft; +#ifdef FIXED_POINT + st->scale_shift = celt_ilog2(st->nfft); + if (st->nfft == 1<scale_shift) + st->scale = Q15ONE; + else + st->scale = (1073741824+st->nfft/2)/st->nfft>>(15-st->scale_shift); +#else + st->scale = 1.f/nfft; +#endif + if (base != NULL) + { + st->twiddles = base->twiddles; + st->shift = 0; + while (st->shift < 32 && nfft<shift != base->nfft) + st->shift++; + if (st->shift>=32) + goto fail; + } else { + st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft); + compute_twiddles(twiddles, nfft); + st->shift = -1; + } + if (!kf_factor(nfft,st->factors)) + { + goto fail; + } + + /* bitrev */ + st->bitrev = bitrev = (opus_int16*)KISS_FFT_MALLOC(sizeof(opus_int16)*nfft); + if (st->bitrev==NULL) + goto fail; + compute_bitrev_table(0, bitrev, 1,1, st->factors,st); + + /* Initialize architecture specific fft parameters */ + if (opus_fft_alloc_arch(st, arch)) + goto fail; + } + return st; +fail: + opus_fft_free(st, arch); + return NULL; +} + +kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch) +{ + return opus_fft_alloc_twiddles(nfft, mem, lenmem, NULL, arch); +} + +void opus_fft_free_arch_c(kiss_fft_state *st) { + (void)st; +} + +void opus_fft_free(const kiss_fft_state *cfg, int arch) +{ + if (cfg) + { + opus_fft_free_arch((kiss_fft_state *)cfg, arch); + opus_free((opus_int16*)cfg->bitrev); + if (cfg->shift < 0) + opus_free((kiss_twiddle_cpx*)cfg->twiddles); + opus_free((kiss_fft_state*)cfg); + } +} + +#endif /* CUSTOM_MODES */ + +void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout) +{ + int m2, m; + int p; + int L; + int fstride[MAXFACTORS]; + int i; + int shift; + + /* st->shift can be -1 */ + shift = st->shift>0 ? st->shift : 0; + + fstride[0] = 1; + L=0; + do { + p = st->factors[2*L]; + m = st->factors[2*L+1]; + fstride[L+1] = fstride[L]*p; + L++; + } while(m!=1); + m = st->factors[2*L-1]; + for (i=L-1;i>=0;i--) + { + if (i!=0) + m2 = st->factors[2*i-1]; + else + m2 = 1; + switch (st->factors[2*i]) + { + case 2: + kf_bfly2(fout, m, fstride[i]); + break; + case 4: + kf_bfly4(fout,fstride[i]<scale_shift-1; +#endif + scale = st->scale; + + celt_assert2 (fin != fout, "In-place FFT not supported"); + /* Bit-reverse the input */ + for (i=0;infft;i++) + { + kiss_fft_cpx x = fin[i]; + fout[st->bitrev[i]].r = SHR32(MULT16_32_Q16(scale, x.r), scale_shift); + fout[st->bitrev[i]].i = SHR32(MULT16_32_Q16(scale, x.i), scale_shift); + } + opus_fft_impl(st, fout); +} + + +void opus_ifft_c(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) +{ + int i; + celt_assert2 (fin != fout, "In-place FFT not supported"); + /* Bit-reverse the input */ + for (i=0;infft;i++) + fout[st->bitrev[i]] = fin[i]; + for (i=0;infft;i++) + fout[i].i = -fout[i].i; + opus_fft_impl(st, fout); + for (i=0;infft;i++) + fout[i].i = -fout[i].i; +} diff --git a/external/opus-1.0.3/celt/kiss_fft.h b/external/opus-1.3.1/celt/kiss_fft.h similarity index 62% rename from external/opus-1.0.3/celt/kiss_fft.h rename to external/opus-1.3.1/celt/kiss_fft.h index 66332e3b..bffa2bfa 100644 --- a/external/opus-1.0.3/celt/kiss_fft.h +++ b/external/opus-1.3.1/celt/kiss_fft.h @@ -32,6 +32,7 @@ #include #include #include "arch.h" +#include "cpu_support.h" #ifdef __cplusplus extern "C" { @@ -77,17 +78,28 @@ typedef struct { 4*4*4*2 */ +typedef struct arch_fft_state{ + int is_supported; + void *priv; +} arch_fft_state; + typedef struct kiss_fft_state{ int nfft; -#ifndef FIXED_POINT - kiss_fft_scalar scale; + opus_val16 scale; +#ifdef FIXED_POINT + int scale_shift; #endif int shift; opus_int16 factors[2*MAXFACTORS]; const opus_int16 *bitrev; const kiss_twiddle_cpx *twiddles; + arch_fft_state *arch_fft; } kiss_fft_state; +#if defined(HAVE_ARM_NE10) +#include "arm/fft_arm.h" +#endif + /*typedef struct kiss_fft_state* kiss_fft_cfg;*/ /** @@ -113,9 +125,9 @@ typedef struct kiss_fft_state{ * buffer size in *lenmem. * */ -kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base); +kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base, int arch); -kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem); +kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch); /** * opus_fft(cfg,in_out_buf) @@ -127,10 +139,59 @@ kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem); * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ -void opus_fft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); -void opus_ifft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); +void opus_fft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); +void opus_ifft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); + +void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); +void opus_ifft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); + +void opus_fft_free(const kiss_fft_state *cfg, int arch); + + +void opus_fft_free_arch_c(kiss_fft_state *st); +int opus_fft_alloc_arch_c(kiss_fft_state *st); + +#if !defined(OVERRIDE_OPUS_FFT) +/* Is run-time CPU detection enabled on this platform? */ +#if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) + +extern int (*const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])( + kiss_fft_state *st); + +#define opus_fft_alloc_arch(_st, arch) \ + ((*OPUS_FFT_ALLOC_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st)) + +extern void (*const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])( + kiss_fft_state *st); +#define opus_fft_free_arch(_st, arch) \ + ((*OPUS_FFT_FREE_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st)) + +extern void (*const OPUS_FFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, + const kiss_fft_cpx *fin, kiss_fft_cpx *fout); +#define opus_fft(_cfg, _fin, _fout, arch) \ + ((*OPUS_FFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout)) + +extern void (*const OPUS_IFFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, + const kiss_fft_cpx *fin, kiss_fft_cpx *fout); +#define opus_ifft(_cfg, _fin, _fout, arch) \ + ((*OPUS_IFFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout)) + +#else /* else for if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */ + +#define opus_fft_alloc_arch(_st, arch) \ + ((void)(arch), opus_fft_alloc_arch_c(_st)) + +#define opus_fft_free_arch(_st, arch) \ + ((void)(arch), opus_fft_free_arch_c(_st)) + +#define opus_fft(_cfg, _fin, _fout, arch) \ + ((void)(arch), opus_fft_c(_cfg, _fin, _fout)) + +#define opus_ifft(_cfg, _fin, _fout, arch) \ + ((void)(arch), opus_ifft_c(_cfg, _fin, _fout)) -void opus_fft_free(const kiss_fft_state *cfg); +#endif /* end if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */ +#endif /* end if !defined(OVERRIDE_OPUS_FFT) */ #ifdef __cplusplus } diff --git a/external/opus-1.0.3/celt/laplace.c b/external/opus-1.3.1/celt/laplace.c similarity index 98% rename from external/opus-1.0.3/celt/laplace.c rename to external/opus-1.3.1/celt/laplace.c index 1e57d013..a7bca874 100644 --- a/external/opus-1.0.3/celt/laplace.c +++ b/external/opus-1.3.1/celt/laplace.c @@ -48,7 +48,6 @@ static unsigned ec_laplace_get_freq1(unsigned fs0, int decay) return ft*(opus_int32)(16384-decay)>>15; } -#ifdef OPUS_ENABLE_ENCODER void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay) { unsigned fl; @@ -91,7 +90,6 @@ void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay) } ec_encode_bin(enc, fl, fl+fs, 15); } -#endif /* OPUS_ENABLE_ENCODER */ int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay) { diff --git a/external/opus-1.0.3/celt/laplace.h b/external/opus-1.3.1/celt/laplace.h similarity index 100% rename from external/opus-1.0.3/celt/laplace.h rename to external/opus-1.3.1/celt/laplace.h diff --git a/external/opus-1.0.3/celt/mathops.c b/external/opus-1.3.1/celt/mathops.c similarity index 95% rename from external/opus-1.0.3/celt/mathops.c rename to external/opus-1.3.1/celt/mathops.c index ce472c9f..6ee9b9e1 100644 --- a/external/opus-1.0.3/celt/mathops.c +++ b/external/opus-1.3.1/celt/mathops.c @@ -38,7 +38,8 @@ #include "mathops.h" /*Compute floor(sqrt(_val)) with exact arithmetic. - This has been tested on all possible 32-bit inputs.*/ + _val must be greater than 0. + This has been tested on all possible 32-bit inputs greater than 0.*/ unsigned isqrt32(opus_uint32 _val){ unsigned b; unsigned g; @@ -123,6 +124,8 @@ opus_val32 celt_sqrt(opus_val32 x) static const opus_val16 C[5] = {23175, 11561, -3011, 1699, -664}; if (x==0) return 0; + else if (x>=1073741824) + return 32767; k = (celt_ilog2(x)>>1)-7; x = VSHR32(x, 2*k); n = x-32768; @@ -137,7 +140,7 @@ opus_val32 celt_sqrt(opus_val32 x) #define L3 8277 #define L4 -626 -static inline opus_val16 _celt_cos_pi_2(opus_val16 x) +static OPUS_INLINE opus_val16 _celt_cos_pi_2(opus_val16 x) { opus_val16 x2; @@ -162,7 +165,7 @@ opus_val16 celt_cos_norm(opus_val32 x) { return _celt_cos_pi_2(EXTRACT16(x)); } else { - return NEG32(_celt_cos_pi_2(EXTRACT16(65536-x))); + return NEG16(_celt_cos_pi_2(EXTRACT16(65536-x))); } } else { if (x&0x0000ffff) @@ -180,7 +183,7 @@ opus_val32 celt_rcp(opus_val32 x) int i; opus_val16 n; opus_val16 r; - celt_assert2(x>0, "celt_rcp() only defined for positive values"); + celt_sig_assert(x>0); i = celt_ilog2(x); /* n is Q15 with range [0,1). */ n = VSHR32(x,i-15)-32768; diff --git a/external/opus-1.0.3/celt/mathops.h b/external/opus-1.3.1/celt/mathops.h similarity index 76% rename from external/opus-1.0.3/celt/mathops.h rename to external/opus-1.3.1/celt/mathops.h index cb2f5d01..5e86ff0d 100644 --- a/external/opus-1.0.3/celt/mathops.h +++ b/external/opus-1.3.1/celt/mathops.h @@ -38,14 +38,81 @@ #include "entcode.h" #include "os_support.h" +#define PI 3.141592653f + /* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */ #define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15) unsigned isqrt32(opus_uint32 _val); +/* CELT doesn't need it for fixed-point, by analysis.c does. */ +#if !defined(FIXED_POINT) || defined(ANALYSIS_C) +#define cA 0.43157974f +#define cB 0.67848403f +#define cC 0.08595542f +#define cE ((float)PI/2) +static OPUS_INLINE float fast_atan2f(float y, float x) { + float x2, y2; + x2 = x*x; + y2 = y*y; + /* For very small values, we don't care about the answer, so + we can just return 0. */ + if (x2 + y2 < 1e-18f) + { + return 0; + } + if(x20, "celt_ilog2() only defined for strictly positive numbers"); + celt_sig_assert(x>0); return EC_ILOG(x)-1; } #endif -#ifndef OVERRIDE_CELT_MAXABS16 -static inline opus_val32 celt_maxabs16(const opus_val16 *x, int len) -{ - int i; - opus_val16 maxval = 0; - opus_val16 minval = 0; - for (i=0;i>1; -#endif l->n = N; - N4 = N>>2; l->maxshift = maxshift; for (i=0;i<=maxshift;i++) { if (i==0) - l->kfft[i] = opus_fft_alloc(N>>2>>i, 0, 0); + l->kfft[i] = opus_fft_alloc(N>>2>>i, 0, 0, arch); else - l->kfft[i] = opus_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0]); + l->kfft[i] = opus_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0], arch); #ifndef ENABLE_TI_DSPLIB55 if (l->kfft[i]==NULL) return 0; #endif } - l->trig = trig = (kiss_twiddle_scalar*)opus_alloc((N4+1)*sizeof(kiss_twiddle_scalar)); + l->trig = trig = (kiss_twiddle_scalar*)opus_alloc((N-(N2>>maxshift))*sizeof(kiss_twiddle_scalar)); if (l->trig==NULL) return 0; - /* We have enough points that sine isn't necessary */ + for (shift=0;shift<=maxshift;shift++) + { + /* We have enough points that sine isn't necessary */ #if defined(FIXED_POINT) - for (i=0;i<=N4;i++) - trig[i] = TRIG_UPSCALE*celt_cos_norm(DIV32(ADD32(SHL32(EXTEND32(i),17),N2),N)); +#if 1 + for (i=0;i>= 1; + N >>= 1; + } return 1; } -void clt_mdct_clear(mdct_lookup *l) +void clt_mdct_clear(mdct_lookup *l, int arch) { int i; for (i=0;i<=l->maxshift;i++) - opus_fft_free(l->kfft[i]); + opus_fft_free(l->kfft[i], arch); opus_free((kiss_twiddle_scalar*)l->trig); } #endif /* CUSTOM_MODES */ /* Forward MDCT trashes the input array */ -void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, - const opus_val16 *window, int overlap, int shift, int stride) +#ifndef OVERRIDE_clt_mdct_forward +void clt_mdct_forward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, int overlap, int shift, int stride, int arch) { int i; int N, N2, N4; - kiss_twiddle_scalar sine; VARDECL(kiss_fft_scalar, f); + VARDECL(kiss_fft_cpx, f2); + const kiss_fft_state *st = l->kfft[shift]; + const kiss_twiddle_scalar *trig; + opus_val16 scale; +#ifdef FIXED_POINT + /* Allows us to scale with MULT16_32_Q16(), which is faster than + MULT16_32_Q15() on ARM. */ + int scale_shift = st->scale_shift-1; +#endif SAVE_STACK; + (void)arch; + scale = st->scale; + N = l->n; - N >>= shift; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } N2 = N>>1; N4 = N>>2; + ALLOC(f, N2, kiss_fft_scalar); - /* sin(x) ~= x here */ -#ifdef FIXED_POINT - sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N; -#else - sine = (kiss_twiddle_scalar)2*PI*(.125f)/N; -#endif + ALLOC(f2, N4, kiss_fft_cpx); /* Consider the input to be composed of four blocks: [a, b, c, d] */ /* Window, shuffle, fold */ @@ -131,7 +157,7 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar kiss_fft_scalar * OPUS_RESTRICT yp = f; const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1); const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1; - for(i=0;i<(overlap>>2);i++) + for(i=0;i<((overlap+3)>>2);i++) { /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2); @@ -143,7 +169,7 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar } wp1 = window; wp2 = window+overlap-1; - for(;i>2);i++) + for(;i>2);i++) { /* Real part arranged as a-bR, Imag part arranged as -c-dR */ *yp++ = *xp2; @@ -165,168 +191,153 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar /* Pre-rotation */ { kiss_fft_scalar * OPUS_RESTRICT yp = f; - const kiss_twiddle_scalar *t = &l->trig[0]; + const kiss_twiddle_scalar *t = &trig[0]; for(i=0;ibitrev[i]] = yc; } } - /* N/4 complex FFT, down-scales by 4/N */ - opus_fft(l->kfft[shift], (kiss_fft_cpx *)f, (kiss_fft_cpx *)in); + /* N/4 complex FFT, does not downscale anymore */ + opus_fft_impl(st, f2); /* Post-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ - const kiss_fft_scalar * OPUS_RESTRICT fp = in; + const kiss_fft_cpx * OPUS_RESTRICT fp = f2; kiss_fft_scalar * OPUS_RESTRICT yp1 = out; kiss_fft_scalar * OPUS_RESTRICT yp2 = out+stride*(N2-1); - const kiss_twiddle_scalar *t = &l->trig[0]; + const kiss_twiddle_scalar *t = &trig[0]; /* Temp pointers to make it really clear to the compiler what we're doing */ for(i=0;ii,t[N4+i]) - S_MUL(fp->r,t[i]); + yi = S_MUL(fp->r,t[N4+i]) + S_MUL(fp->i,t[i]); + *yp1 = yr; + *yp2 = yi; + fp++; yp1 += 2*stride; yp2 -= 2*stride; } } RESTORE_STACK; } +#endif /* OVERRIDE_clt_mdct_forward */ -void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, - const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride) +#ifndef OVERRIDE_clt_mdct_backward +void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride, int arch) { int i; int N, N2, N4; - kiss_twiddle_scalar sine; - VARDECL(kiss_fft_scalar, f); - VARDECL(kiss_fft_scalar, f2); - SAVE_STACK; + const kiss_twiddle_scalar *trig; + (void) arch; + N = l->n; - N >>= shift; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } N2 = N>>1; N4 = N>>2; - ALLOC(f, N2, kiss_fft_scalar); - ALLOC(f2, N2, kiss_fft_scalar); - /* sin(x) ~= x here */ -#ifdef FIXED_POINT - sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N; -#else - sine = (kiss_twiddle_scalar)2*PI*(.125f)/N; -#endif /* Pre-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * OPUS_RESTRICT xp1 = in; const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1); - kiss_fft_scalar * OPUS_RESTRICT yp = f2; - const kiss_twiddle_scalar *t = &l->trig[0]; + kiss_fft_scalar * OPUS_RESTRICT yp = out+(overlap>>1); + const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0]; + const opus_int16 * OPUS_RESTRICT bitrev = l->kfft[shift]->bitrev; for(i=0;ikfft[shift], (kiss_fft_cpx *)f2, (kiss_fft_cpx *)f); + opus_fft_impl(l->kfft[shift], (kiss_fft_cpx*)(out+(overlap>>1))); - /* Post-rotate */ + /* Post-rotate and de-shuffle from both ends of the buffer at once to make + it in-place. */ { - kiss_fft_scalar * OPUS_RESTRICT fp = f; - const kiss_twiddle_scalar *t = &l->trig[0]; - - for(i=0;i>1); + kiss_fft_scalar * yp1 = out+(overlap>>1)+N2-2; + const kiss_twiddle_scalar *t = &trig[0]; + /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the + middle pair will be computed twice. */ + for(i=0;i<(N4+1)>>1;i++) { kiss_fft_scalar re, im, yr, yi; - re = fp[0]; - im = fp[1]; + kiss_twiddle_scalar t0, t1; + /* We swap real and imag because we're using an FFT instead of an IFFT. */ + re = yp0[1]; + im = yp0[0]; + t0 = t[i]; + t1 = t[N4+i]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ - yr = S_MUL(re,t[i<>1; + /* Mirror on both sides for TDAC */ { - kiss_fft_scalar * OPUS_RESTRICT fp1 = f2+N4-1; - kiss_fft_scalar * OPUS_RESTRICT xp1 = out+N2-1; - kiss_fft_scalar * OPUS_RESTRICT yp1 = out+N4-overlap/2; - const opus_val16 * OPUS_RESTRICT wp1 = window; - const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1; - for(i = 0; i< N4-overlap/2; i++) - { - *xp1 = *fp1; - xp1--; - fp1--; - } - for(; i < N4; i++) - { - kiss_fft_scalar x1; - x1 = *fp1--; - *yp1++ +=-MULT16_32_Q15(*wp1, x1); - *xp1-- += MULT16_32_Q15(*wp2, x1); - wp1++; - wp2--; - } - } - { - kiss_fft_scalar * OPUS_RESTRICT fp2 = f2+N4; - kiss_fft_scalar * OPUS_RESTRICT xp2 = out+N2; - kiss_fft_scalar * OPUS_RESTRICT yp2 = out+N-1-(N4-overlap/2); + kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1; + kiss_fft_scalar * OPUS_RESTRICT yp1 = out; const opus_val16 * OPUS_RESTRICT wp1 = window; const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1; - for(i = 0; i< N4-overlap/2; i++) - { - *xp2 = *fp2; - xp2++; - fp2++; - } - for(; i < N4; i++) + + for(i = 0; i < overlap/2; i++) { - kiss_fft_scalar x2; - x2 = *fp2++; - *yp2-- = MULT16_32_Q15(*wp1, x2); - *xp2++ = MULT16_32_Q15(*wp2, x2); + kiss_fft_scalar x1, x2; + x1 = *xp1; + x2 = *yp1; + *yp1++ = SUB32_ovflw(MULT16_32_Q15(*wp2, x2), MULT16_32_Q15(*wp1, x1)); + *xp1-- = ADD32_ovflw(MULT16_32_Q15(*wp1, x2), MULT16_32_Q15(*wp2, x1)); wp1++; wp2--; } } - RESTORE_STACK; } +#endif /* OVERRIDE_clt_mdct_backward */ diff --git a/external/opus-1.0.3/celt/mdct.h b/external/opus-1.3.1/celt/mdct.h similarity index 50% rename from external/opus-1.0.3/celt/mdct.h rename to external/opus-1.3.1/celt/mdct.h index d7218213..160ae4e0 100644 --- a/external/opus-1.0.3/celt/mdct.h +++ b/external/opus-1.3.1/celt/mdct.h @@ -53,18 +53,60 @@ typedef struct { const kiss_twiddle_scalar * OPUS_RESTRICT trig; } mdct_lookup; -int clt_mdct_init(mdct_lookup *l,int N, int maxshift); -void clt_mdct_clear(mdct_lookup *l); +#if defined(HAVE_ARM_NE10) +#include "arm/mdct_arm.h" +#endif + + +int clt_mdct_init(mdct_lookup *l,int N, int maxshift, int arch); +void clt_mdct_clear(mdct_lookup *l, int arch); /** Compute a forward MDCT and scale by 4/N, trashes the input array */ -void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, - kiss_fft_scalar * OPUS_RESTRICT out, - const opus_val16 *window, int overlap, int shift, int stride); +void clt_mdct_forward_c(const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, int overlap, + int shift, int stride, int arch); /** Compute a backward MDCT (no scaling) and performs weighted overlap-add (scales implicitly by 1/2) */ -void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, +void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, - const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride); + const opus_val16 * OPUS_RESTRICT window, + int overlap, int shift, int stride, int arch); + +#if !defined(OVERRIDE_OPUS_MDCT) +/* Is run-time CPU detection enabled on this platform? */ +#if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) + +extern void (*const CLT_MDCT_FORWARD_IMPL[OPUS_ARCHMASK+1])( + const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, + int overlap, int shift, int stride, int arch); + +#define clt_mdct_forward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ + ((*CLT_MDCT_FORWARD_IMPL[(arch)&OPUS_ARCHMASK])(_l, _in, _out, \ + _window, _overlap, _shift, \ + _stride, _arch)) + +extern void (*const CLT_MDCT_BACKWARD_IMPL[OPUS_ARCHMASK+1])( + const mdct_lookup *l, kiss_fft_scalar *in, + kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, + int overlap, int shift, int stride, int arch); + +#define clt_mdct_backward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ + (*CLT_MDCT_BACKWARD_IMPL[(arch)&OPUS_ARCHMASK])(_l, _in, _out, \ + _window, _overlap, _shift, \ + _stride, _arch) + +#else /* if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) */ + +#define clt_mdct_forward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ + clt_mdct_forward_c(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) + +#define clt_mdct_backward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ + clt_mdct_backward_c(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) + +#endif /* end if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) && !defined(FIXED_POINT) */ +#endif /* end if !defined(OVERRIDE_OPUS_MDCT) */ #endif diff --git a/external/opus-1.0.3/celt/mfrngcod.h b/external/opus-1.3.1/celt/mfrngcod.h similarity index 100% rename from external/opus-1.0.3/celt/mfrngcod.h rename to external/opus-1.3.1/celt/mfrngcod.h diff --git a/external/opus-1.3.1/celt/mips/celt_mipsr1.h b/external/opus-1.3.1/celt/mips/celt_mipsr1.h new file mode 100644 index 00000000..c332fe04 --- /dev/null +++ b/external/opus-1.3.1/celt/mips/celt_mipsr1.h @@ -0,0 +1,152 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2010 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __CELT_MIPSR1_H__ +#define __CELT_MIPSR1_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define CELT_C + +#include "os_support.h" +#include "mdct.h" +#include +#include "celt.h" +#include "pitch.h" +#include "bands.h" +#include "modes.h" +#include "entcode.h" +#include "quant_bands.h" +#include "rate.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "float_cast.h" +#include +#include "celt_lpc.h" +#include "vq.h" + +#define OVERRIDE_COMB_FILTER_CONST +#define OVERRIDE_comb_filter +void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, + opus_val16 g0, opus_val16 g1, int tapset0, int tapset1, + const opus_val16 *window, int overlap, int arch) +{ + int i; + opus_val32 x0, x1, x2, x3, x4; + + (void)arch; + + /* printf ("%d %d %f %f\n", T0, T1, g0, g1); */ + opus_val16 g00, g01, g02, g10, g11, g12; + static const opus_val16 gains[3][3] = { + {QCONST16(0.3066406250f, 15), QCONST16(0.2170410156f, 15), QCONST16(0.1296386719f, 15)}, + {QCONST16(0.4638671875f, 15), QCONST16(0.2680664062f, 15), QCONST16(0.f, 15)}, + {QCONST16(0.7998046875f, 15), QCONST16(0.1000976562f, 15), QCONST16(0.f, 15)}}; + + if (g0==0 && g1==0) + { + /* OPT: Happens to work without the OPUS_MOVE(), but only because the current encoder already copies x to y */ + if (x!=y) + OPUS_MOVE(y, x, N); + return; + } + + g00 = MULT16_16_P15(g0, gains[tapset0][0]); + g01 = MULT16_16_P15(g0, gains[tapset0][1]); + g02 = MULT16_16_P15(g0, gains[tapset0][2]); + g10 = MULT16_16_P15(g1, gains[tapset1][0]); + g11 = MULT16_16_P15(g1, gains[tapset1][1]); + g12 = MULT16_16_P15(g1, gains[tapset1][2]); + x1 = x[-T1+1]; + x2 = x[-T1 ]; + x3 = x[-T1-1]; + x4 = x[-T1-2]; + /* If the filter didn't change, we don't need the overlap */ + if (g0==g1 && T0==T1 && tapset0==tapset1) + overlap=0; + + for (i=0;itwiddles[fstride*m]; + yb = st->twiddles[fstride*2*m]; +#endif + + tw=st->twiddles; + + for (i=0;ir += scratch[7].r + scratch[8].r; + Fout0->i += scratch[7].i + scratch[8].i; + scratch[5].r = scratch[0].r + S_MUL_ADD(scratch[7].r,ya.r,scratch[8].r,yb.r); + scratch[5].i = scratch[0].i + S_MUL_ADD(scratch[7].i,ya.r,scratch[8].i,yb.r); + + scratch[6].r = S_MUL_ADD(scratch[10].i,ya.i,scratch[9].i,yb.i); + scratch[6].i = -S_MUL_ADD(scratch[10].r,ya.i,scratch[9].r,yb.i); + + C_SUB(*Fout1,scratch[5],scratch[6]); + C_ADD(*Fout4,scratch[5],scratch[6]); + + scratch[11].r = scratch[0].r + S_MUL_ADD(scratch[7].r,yb.r,scratch[8].r,ya.r); + scratch[11].i = scratch[0].i + S_MUL_ADD(scratch[7].i,yb.r,scratch[8].i,ya.r); + + scratch[12].r = S_MUL_SUB(scratch[9].i,ya.i,scratch[10].i,yb.i); + scratch[12].i = S_MUL_SUB(scratch[10].r,yb.i,scratch[9].r,ya.i); + + C_ADD(*Fout2,scratch[11],scratch[12]); + C_SUB(*Fout3,scratch[11],scratch[12]); + + ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; + } + } +} + + +#endif /* KISS_FFT_MIPSR1_H */ diff --git a/external/opus-1.3.1/celt/mips/mdct_mipsr1.h b/external/opus-1.3.1/celt/mips/mdct_mipsr1.h new file mode 100644 index 00000000..2934dab7 --- /dev/null +++ b/external/opus-1.3.1/celt/mips/mdct_mipsr1.h @@ -0,0 +1,288 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2008 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This is a simple MDCT implementation that uses a N/4 complex FFT + to do most of the work. It should be relatively straightforward to + plug in pretty much and FFT here. + + This replaces the Vorbis FFT (and uses the exact same API), which + was a bit too messy and that was ending up duplicating code + (might as well use the same FFT everywhere). + + The algorithm is similar to (and inspired from) Fabrice Bellard's + MDCT implementation in FFMPEG, but has differences in signs, ordering + and scaling in many places. +*/ +#ifndef __MDCT_MIPSR1_H__ +#define __MDCT_MIPSR1_H__ + +#ifndef SKIP_CONFIG_H +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#endif + +#include "mdct.h" +#include "kiss_fft.h" +#include "_kiss_fft_guts.h" +#include +#include "os_support.h" +#include "mathops.h" +#include "stack_alloc.h" + +/* Forward MDCT trashes the input array */ +#define OVERRIDE_clt_mdct_forward +void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 *window, int overlap, int shift, int stride, int arch) +{ + int i; + int N, N2, N4; + VARDECL(kiss_fft_scalar, f); + VARDECL(kiss_fft_cpx, f2); + const kiss_fft_state *st = l->kfft[shift]; + const kiss_twiddle_scalar *trig; + opus_val16 scale; +#ifdef FIXED_POINT + /* Allows us to scale with MULT16_32_Q16(), which is faster than + MULT16_32_Q15() on ARM. */ + int scale_shift = st->scale_shift-1; +#endif + + (void)arch; + + SAVE_STACK; + scale = st->scale; + + N = l->n; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } + N2 = N>>1; + N4 = N>>2; + + ALLOC(f, N2, kiss_fft_scalar); + ALLOC(f2, N4, kiss_fft_cpx); + + /* Consider the input to be composed of four blocks: [a, b, c, d] */ + /* Window, shuffle, fold */ + { + /* Temp pointers to make it really clear to the compiler what we're doing */ + const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1); + const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1); + kiss_fft_scalar * OPUS_RESTRICT yp = f; + const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1); + const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1; + for(i=0;i<((overlap+3)>>2);i++) + { + /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ + *yp++ = S_MUL_ADD(*wp2, xp1[N2],*wp1,*xp2); + *yp++ = S_MUL_SUB(*wp1, *xp1,*wp2, xp2[-N2]); + xp1+=2; + xp2-=2; + wp1+=2; + wp2-=2; + } + wp1 = window; + wp2 = window+overlap-1; + for(;i>2);i++) + { + /* Real part arranged as a-bR, Imag part arranged as -c-dR */ + *yp++ = *xp2; + *yp++ = *xp1; + xp1+=2; + xp2-=2; + } + for(;ibitrev[i]] = yc; + } + } + + /* N/4 complex FFT, does not downscale anymore */ + opus_fft_impl(st, f2); + + /* Post-rotate */ + { + /* Temp pointers to make it really clear to the compiler what we're doing */ + const kiss_fft_cpx * OPUS_RESTRICT fp = f2; + kiss_fft_scalar * OPUS_RESTRICT yp1 = out; + kiss_fft_scalar * OPUS_RESTRICT yp2 = out+stride*(N2-1); + const kiss_twiddle_scalar *t = &trig[0]; + /* Temp pointers to make it really clear to the compiler what we're doing */ + for(i=0;ii,t[N4+i] , fp->r,t[i]); + yi = S_MUL_ADD(fp->r,t[N4+i] ,fp->i,t[i]); + *yp1 = yr; + *yp2 = yi; + fp++; + yp1 += 2*stride; + yp2 -= 2*stride; + } + } + RESTORE_STACK; +} + +#define OVERRIDE_clt_mdct_backward +void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, + const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride, int arch) +{ + int i; + int N, N2, N4; + const kiss_twiddle_scalar *trig; + + (void)arch; + + N = l->n; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } + N2 = N>>1; + N4 = N>>2; + + /* Pre-rotate */ + { + /* Temp pointers to make it really clear to the compiler what we're doing */ + const kiss_fft_scalar * OPUS_RESTRICT xp1 = in; + const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1); + kiss_fft_scalar * OPUS_RESTRICT yp = out+(overlap>>1); + const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0]; + const opus_int16 * OPUS_RESTRICT bitrev = l->kfft[shift]->bitrev; + for(i=0;ikfft[shift], (kiss_fft_cpx*)(out+(overlap>>1))); + + /* Post-rotate and de-shuffle from both ends of the buffer at once to make + it in-place. */ + { + kiss_fft_scalar * OPUS_RESTRICT yp0 = out+(overlap>>1); + kiss_fft_scalar * OPUS_RESTRICT yp1 = out+(overlap>>1)+N2-2; + const kiss_twiddle_scalar *t = &trig[0]; + /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the + middle pair will be computed twice. */ + for(i=0;i<(N4+1)>>1;i++) + { + kiss_fft_scalar re, im, yr, yi; + kiss_twiddle_scalar t0, t1; + /* We swap real and imag because we're using an FFT instead of an IFFT. */ + re = yp0[1]; + im = yp0[0]; + t0 = t[i]; + t1 = t[N4+i]; + /* We'd scale up by 2 here, but instead it's done when mixing the windows */ + yr = S_MUL_ADD(re,t0 , im,t1); + yi = S_MUL_SUB(re,t1 , im,t0); + /* We swap real and imag because we're using an FFT instead of an IFFT. */ + re = yp1[1]; + im = yp1[0]; + yp0[0] = yr; + yp1[1] = yi; + + t0 = t[(N4-i-1)]; + t1 = t[(N2-i-1)]; + /* We'd scale up by 2 here, but instead it's done when mixing the windows */ + yr = S_MUL_ADD(re,t0,im,t1); + yi = S_MUL_SUB(re,t1,im,t0); + yp1[0] = yr; + yp0[1] = yi; + yp0 += 2; + yp1 -= 2; + } + } + + /* Mirror on both sides for TDAC */ + { + kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1; + kiss_fft_scalar * OPUS_RESTRICT yp1 = out; + const opus_val16 * OPUS_RESTRICT wp1 = window; + const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1; + + for(i = 0; i < overlap/2; i++) + { + kiss_fft_scalar x1, x2; + x1 = *xp1; + x2 = *yp1; + *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1); + *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1); + wp1++; + wp2--; + } + } +} +#endif /* __MDCT_MIPSR1_H__ */ diff --git a/external/opus-1.3.1/celt/mips/pitch_mipsr1.h b/external/opus-1.3.1/celt/mips/pitch_mipsr1.h new file mode 100644 index 00000000..a9500aff --- /dev/null +++ b/external/opus-1.3.1/celt/mips/pitch_mipsr1.h @@ -0,0 +1,161 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/** + @file pitch.h + @brief Pitch analysis + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef PITCH_MIPSR1_H +#define PITCH_MIPSR1_H + +#define OVERRIDE_DUAL_INNER_PROD +static inline void dual_inner_prod(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, + int N, opus_val32 *xy1, opus_val32 *xy2, int arch) +{ + int j; + opus_val32 xy01=0; + opus_val32 xy02=0; + + (void)arch; + + asm volatile("MULT $ac1, $0, $0"); + asm volatile("MULT $ac2, $0, $0"); + /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */ + for (j=0;j=0;i--) + { + celt_norm x1, x2; + x1 = Xptr[0]; + x2 = Xptr[stride]; + Xptr[stride] = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x2), s, x1), 15)); + *Xptr-- = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x1), ms, x2), 15)); + } +} + +#define OVERRIDE_renormalise_vector +void renormalise_vector(celt_norm *X, int N, opus_val16 gain, int arch) +{ + int i; +#ifdef FIXED_POINT + int k; +#endif + opus_val32 E = EPSILON; + opus_val16 g; + opus_val32 t; + celt_norm *xptr = X; + int X0, X1; + + (void)arch; + + asm volatile("mult $ac1, $0, $0"); + asm volatile("MTLO %0, $ac1" : :"r" (E)); + /*if(N %4) + printf("error");*/ + for (i=0;i>1; +#endif + t = VSHR32(E, 2*(k-7)); + g = MULT16_16_P15(celt_rsqrt_norm(t),gain); + + xptr = X; + for (i=0;ieBands = compute_ebands(Fs, mode->shortMdctSize, res, &mode->nbEBands); if (mode->eBands==NULL) goto failure; +#if !defined(SMALL_FOOTPRINT) + /* Make sure we don't allocate a band larger than our PVQ table. + 208 should be enough, but let's be paranoid. */ + if ((mode->eBands[mode->nbEBands] - mode->eBands[mode->nbEBands-1])< + 208) { + goto failure; + } +#endif mode->effEBands = mode->nbEBands; while (mode->eBands[mode->effEBands] > mode->shortMdctSize) @@ -381,7 +391,7 @@ CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error) compute_pulse_cache(mode, mode->maxLM); if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts, - mode->maxLM) == 0) + mode->maxLM, arch) == 0) goto failure; if (error) @@ -400,6 +410,8 @@ CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error) #ifdef CUSTOM_MODES void opus_custom_mode_destroy(CELTMode *mode) { + int arch = opus_select_arch(); + if (mode == NULL) return; #ifndef CUSTOM_MODES_ONLY @@ -415,7 +427,7 @@ void opus_custom_mode_destroy(CELTMode *mode) } #endif /* CUSTOM_MODES_ONLY */ opus_free((opus_int16*)mode->eBands); - opus_free((opus_int16*)mode->allocVectors); + opus_free((unsigned char*)mode->allocVectors); opus_free((opus_val16*)mode->window); opus_free((opus_int16*)mode->logN); @@ -423,7 +435,7 @@ void opus_custom_mode_destroy(CELTMode *mode) opus_free((opus_int16*)mode->cache.index); opus_free((unsigned char*)mode->cache.bits); opus_free((unsigned char*)mode->cache.caps); - clt_mdct_clear(&mode->mdct); + clt_mdct_clear(&mode->mdct, arch); opus_free((CELTMode *)mode); } diff --git a/external/opus-1.0.3/celt/modes.h b/external/opus-1.3.1/celt/modes.h similarity index 94% rename from external/opus-1.0.3/celt/modes.h rename to external/opus-1.3.1/celt/modes.h index c8340f98..be813ccc 100644 --- a/external/opus-1.0.3/celt/modes.h +++ b/external/opus-1.3.1/celt/modes.h @@ -39,14 +39,6 @@ #define MAX_PERIOD 1024 -#ifndef OVERLAP -#define OVERLAP(mode) ((mode)->overlap) -#endif - -#ifndef FRAMESIZE -#define FRAMESIZE(mode) ((mode)->mdctSize) -#endif - typedef struct { int size; const opus_int16 *index; diff --git a/external/opus-1.0.3/celt/opus_custom_demo.c b/external/opus-1.3.1/celt/opus_custom_demo.c similarity index 100% rename from external/opus-1.0.3/celt/opus_custom_demo.c rename to external/opus-1.3.1/celt/opus_custom_demo.c diff --git a/external/opus-1.0.3/celt/os_support.h b/external/opus-1.3.1/celt/os_support.h similarity index 87% rename from external/opus-1.0.3/celt/os_support.h rename to external/opus-1.3.1/celt/os_support.h index 2484f0b2..a2171971 100644 --- a/external/opus-1.0.3/celt/os_support.h +++ b/external/opus-1.3.1/celt/os_support.h @@ -35,13 +35,16 @@ # include "custom_support.h" #endif +#include "opus_types.h" +#include "opus_defines.h" + #include #include #include /** Opus wrapper for malloc(). To do your own dynamic allocation, all you need to do is replace this function and opus_free */ #ifndef OVERRIDE_OPUS_ALLOC -static inline void *opus_alloc (size_t size) +static OPUS_INLINE void *opus_alloc (size_t size) { return malloc(size); } @@ -49,7 +52,7 @@ static inline void *opus_alloc (size_t size) /** Same as celt_alloc(), except that the area is only needed inside a CELT call (might cause problem with wideband though) */ #ifndef OVERRIDE_OPUS_ALLOC_SCRATCH -static inline void *opus_alloc_scratch (size_t size) +static OPUS_INLINE void *opus_alloc_scratch (size_t size) { /* Scratch space doesn't need to be cleared */ return opus_alloc(size); @@ -58,24 +61,24 @@ static inline void *opus_alloc_scratch (size_t size) /** Opus wrapper for free(). To do your own dynamic allocation, all you need to do is replace this function and opus_alloc */ #ifndef OVERRIDE_OPUS_FREE -static inline void opus_free (void *ptr) +static OPUS_INLINE void opus_free (void *ptr) { free(ptr); } #endif -/** Copy n bytes of memory from src to dst. The 0* term provides compile-time type checking */ +/** Copy n elements from src to dst. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_OPUS_COPY #define OPUS_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif -/** Copy n bytes of memory from src to dst, allowing overlapping regions. The 0* term +/** Copy n elements from src to dst, allowing overlapping regions. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_OPUS_MOVE #define OPUS_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif -/** Set n elements of dst to zero, starting at address s */ +/** Set n elements of dst to zero */ #ifndef OVERRIDE_OPUS_CLEAR #define OPUS_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst)))) #endif diff --git a/external/opus-1.0.3/celt/pitch.c b/external/opus-1.3.1/celt/pitch.c similarity index 63% rename from external/opus-1.0.3/celt/pitch.c rename to external/opus-1.3.1/celt/pitch.c index bcbcfc28..872582a4 100644 --- a/external/opus-1.0.3/celt/pitch.c +++ b/external/opus-1.3.1/celt/pitch.c @@ -102,13 +102,50 @@ static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len, } } +static void celt_fir5(opus_val16 *x, + const opus_val16 *num, + int N) +{ + int i; + opus_val16 num0, num1, num2, num3, num4; + opus_val32 mem0, mem1, mem2, mem3, mem4; + num0=num[0]; + num1=num[1]; + num2=num[2]; + num3=num[3]; + num4=num[4]; + mem0=0; + mem1=0; + mem2=0; + mem3=0; + mem4=0; + for (i=0;i>1); + 4, len>>1, arch); /* Noise floor -40 dB */ #ifdef FIXED_POINT @@ -161,16 +198,91 @@ void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp); lpc[i] = MULT16_16_Q15(lpc[i], tmp); } - celt_fir(x_lp, lpc, x_lp, len>>1, 4, mem); + /* Add a zero */ + lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT); + lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]); + lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]); + lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]); + lpc2[4] = MULT16_16_Q15(c1,lpc[3]); + celt_fir5(x_lp, lpc2, len>>1); +} - mem[0]=0; - lpc[0]=QCONST16(.8f,12); - celt_fir(x_lp, lpc, x_lp, len>>1, 1, mem); +/* Pure C implementation. */ +#ifdef FIXED_POINT +opus_val32 +#else +void +#endif +celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, + opus_val32 *xcorr, int len, int max_pitch, int arch) +{ +#if 0 /* This is a simple version of the pitch correlation that should work + well on DSPs like Blackfin and TI C5x/C6x */ + int i, j; +#ifdef FIXED_POINT + opus_val32 maxcorr=1; +#endif +#if !defined(OVERRIDE_PITCH_XCORR) + (void)arch; +#endif + for (i=0;i0); + celt_sig_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); + for (i=0;i>2;i++) - { - opus_val32 sum = 0; - for (j=0;j>2;j++) - sum = MAC16_16(sum, x_lp4[j],y_lp4[i+j]); - xcorr[i] = MAX32(-1, sum); #ifdef FIXED_POINT - maxcorr = MAX32(maxcorr, sum); + maxcorr = #endif - } + celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2, arch); + find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch #ifdef FIXED_POINT , 0, maxcorr @@ -242,12 +349,17 @@ void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR #endif for (i=0;i>1;i++) { - opus_val32 sum=0; + opus_val32 sum; xcorr[i] = 0; if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2) continue; +#ifdef FIXED_POINT + sum = 0; for (j=0;j>1;j++) sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); +#else + sum = celt_inner_prod(x_lp, y+i, len>>1, arch); +#endif xcorr[i] = MAX32(-1, sum); #ifdef FIXED_POINT maxcorr = MAX32(maxcorr, sum); @@ -280,18 +392,55 @@ void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR RESTORE_STACK; } +#ifdef FIXED_POINT +static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy) +{ + opus_val32 x2y2; + int sx, sy, shift; + opus_val32 g; + opus_val16 den; + if (xy == 0 || xx == 0 || yy == 0) + return 0; + sx = celt_ilog2(xx)-14; + sy = celt_ilog2(yy)-14; + shift = sx + sy; + x2y2 = SHR32(MULT16_16(VSHR32(xx, sx), VSHR32(yy, sy)), 14); + if (shift & 1) { + if (x2y2 < 32768) + { + x2y2 <<= 1; + shift--; + } else { + x2y2 >>= 1; + shift++; + } + } + den = celt_rsqrt_norm(x2y2); + g = MULT16_32_Q15(den, xy); + g = VSHR32(g, (shift>>1)-1); + return EXTRACT16(MIN32(g, Q15ONE)); +} +#else +static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy) +{ + return xy/celt_sqrt(1+xx*yy); +} +#endif + static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2}; opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, - int N, int *T0_, int prev_period, opus_val16 prev_gain) + int N, int *T0_, int prev_period, opus_val16 prev_gain, int arch) { int k, i, T, T0; opus_val16 g, g0; opus_val16 pg; - opus_val32 xy,xx,yy; + opus_val32 xy,xx,yy,xy2; opus_val32 xcorr[3]; opus_val32 best_xy, best_yy; int offset; int minperiod0; + VARDECL(opus_val32, yy_lookup); + SAVE_STACK; minperiod0 = minperiod; maxperiod /= 2; @@ -304,34 +453,27 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, *T0_=maxperiod-1; T = T0 = *T0_; - xx=xy=yy=0; - for (i=0;i>1; - t = VSHR32(x2y2, 2*(sh-7)); - g = g0 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1); - } -#else - g = g0 = xy/celt_sqrt(1+xx*yy); -#endif + g = g0 = compute_pitch_gain(xy, xx, yy); /* Look for any pitch at T/k */ for (k=2;k<=15;k++) { int T1, T1b; opus_val16 g1; opus_val16 cont=0; - T1 = (2*T0+k)/(2*k); + opus_val16 thresh; + T1 = celt_udiv(2*T0+k, 2*k); if (T1 < minperiod) break; /* Look for another strong correlation at T1b */ @@ -343,36 +485,26 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, T1b = T0+T1; } else { - T1b = (2*second_check[k]*T0+k)/(2*k); + T1b = celt_udiv(2*second_check[k]*T0+k, 2*k); } - xy=yy=0; - for (i=0;i>1; - t = VSHR32(x2y2, 2*(sh-7)); - g1 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1); - } -#else - g1 = xy/celt_sqrt(1+2.f*xx*1.f*yy); -#endif + dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2, arch); + xy = HALF32(xy + xy2); + yy = HALF32(yy_lookup[T1] + yy_lookup[T1b]); + g1 = compute_pitch_gain(xy, xx, yy); if (abs(T1-prev_period)<=1) cont = prev_gain; else if (abs(T1-prev_period)<=2 && 5*k*k < T0) - cont = HALF32(prev_gain); + cont = HALF16(prev_gain); else cont = 0; - if (g1 > QCONST16(.3f,15) + MULT16_16_Q15(QCONST16(.4f,15),g0)-cont) + thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont); + /* Bias against very high pitch (very short period) to avoid false-positives + due to short-term correlation */ + if (T1<3*minperiod) + thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont); + else if (T1<2*minperiod) + thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont); + if (g1 > thresh) { best_xy = xy; best_yy = yy; @@ -387,13 +519,7 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, pg = SHR32(frac_div32(best_xy,best_yy+1),16); for (k=0;k<3;k++) - { - int T1 = T+k-1; - xy = 0; - for (i=0;i MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0])) offset = 1; else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2])) @@ -406,5 +532,6 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, if (*T0_=3); + y_3=0; /* gcc doesn't realize that y_3 can't be used uninitialized */ + y_0=*y++; + y_1=*y++; + y_2=*y++; + for (j=0;j=2) + qi = IMIN(qi, 0); if (budget-tell >= 15) { int pi; @@ -254,13 +255,13 @@ static int quant_coarse_energy_impl(const CELTMode *m, int start, int end, prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); } while (++c < C); } - return badness; + return lfe ? 0 : badness; } void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes, - int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate) + int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate, int lfe) { int intra; opus_val16 max_decay; @@ -281,9 +282,6 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, if (tell+3 > budget) two_pass = intra = 0; - /* Encode the global flags using a simple probability model - (first symbols in the stream) */ - max_decay = QCONST16(16.f,DB_SHIFT); if (end-start>10) { @@ -293,6 +291,8 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, max_decay = MIN32(max_decay, .125f*nbAvailableBytes); #endif } + if (lfe) + max_decay = QCONST16(3.f,DB_SHIFT); enc_start_state = *enc; ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16); @@ -302,7 +302,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, if (two_pass || intra) { badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget, - tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay); + tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay, lfe); } if (!intra) @@ -312,6 +312,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, opus_int32 tell_intra; opus_uint32 nstart_bytes; opus_uint32 nintra_bytes; + opus_uint32 save_bytes; int badness2; VARDECL(unsigned char, intra_bits); @@ -322,14 +323,17 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, nstart_bytes = ec_range_bytes(&enc_start_state); nintra_bytes = ec_range_bytes(&enc_intra_state); intra_buf = ec_get_buffer(&enc_intra_state) + nstart_bytes; - ALLOC(intra_bits, nintra_bytes-nstart_bytes, unsigned char); + save_bytes = nintra_bytes-nstart_bytes; + if (save_bytes == 0) + save_bytes = ALLOC_NONE; + ALLOC(intra_bits, save_bytes, unsigned char); /* Copy bits from intra bit-stream */ OPUS_COPY(intra_bits, intra_buf, nintra_bytes - nstart_bytes); *enc = enc_start_state; badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget, - tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay); + tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay, lfe); if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra))) { @@ -414,12 +418,12 @@ void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *ol offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); #endif oldEBands[i+c*m->nbEBands] += offset; + error[i+c*m->nbEBands] -= offset; bits_left--; } while (++c < C); } } } -#endif /* OPUS_ENABLE_ENCODER */ void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM) { @@ -453,7 +457,7 @@ void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *ol /* It would be better to express this invariant as a test on C at function entry, but that isn't enough to make the static analyzer happy. */ - celt_assert(c<2); + celt_sig_assert(c<2); tell = ec_tell(dec); if(budget-tell>=15) { @@ -537,25 +541,6 @@ void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 * } } -void log2Amp(const CELTMode *m, int start, int end, - celt_ener *eBands, const opus_val16 *oldEBands, int C) -{ - int c, i; - c=0; - do { - for (i=0;inbEBands] = 0; - for (;inbEBands], - SHL16((opus_val16)eMeans[i],6)); - eBands[i+c*m->nbEBands] = PSHR32(celt_exp2(lg),4); - } - for (;inbEBands;i++) - eBands[i+c*m->nbEBands] = 0; - } while (++c < C); -} - void amp2Log2(const CELTMode *m, int effEnd, int end, celt_ener *bandE, opus_val16 *bandLogE, int C) { @@ -563,9 +548,15 @@ void amp2Log2(const CELTMode *m, int effEnd, int end, c=0; do { for (i=0;inbEBands] = - celt_log2(SHL32(bandE[i+c*m->nbEBands],2)) + celt_log2(bandE[i+c*m->nbEBands]) - SHL16((opus_val16)eMeans[i],6); +#ifdef FIXED_POINT + /* Compensate for bandE[] being Q12 but celt_log2() taking a Q14 input. */ + bandLogE[i+c*m->nbEBands] += QCONST16(2.f, DB_SHIFT); +#endif + } for (i=effEnd;inbEBands+i] = -QCONST16(14.f,DB_SHIFT); } while (++c < C); diff --git a/external/opus-1.0.3/celt/quant_bands.h b/external/opus-1.3.1/celt/quant_bands.h similarity index 94% rename from external/opus-1.0.3/celt/quant_bands.h rename to external/opus-1.3.1/celt/quant_bands.h index bec2855c..0490bca4 100644 --- a/external/opus-1.0.3/celt/quant_bands.h +++ b/external/opus-1.3.1/celt/quant_bands.h @@ -35,6 +35,12 @@ #include "entdec.h" #include "mathops.h" +#ifdef FIXED_POINT +extern const signed char eMeans[25]; +#else +extern const opus_val16 eMeans[25]; +#endif + void amp2Log2(const CELTMode *m, int effEnd, int end, celt_ener *bandE, opus_val16 *bandLogE, int C); @@ -45,7 +51,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes, int force_intra, opus_val32 *delayedIntra, - int two_pass, int loss_rate); + int two_pass, int loss_rate, int lfe); void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C); diff --git a/external/opus-1.0.3/celt/rate.c b/external/opus-1.3.1/celt/rate.c similarity index 94% rename from external/opus-1.0.3/celt/rate.c rename to external/opus-1.3.1/celt/rate.c index 97e54f71..465e1ba2 100644 --- a/external/opus-1.0.3/celt/rate.c +++ b/external/opus-1.3.1/celt/rate.c @@ -131,7 +131,7 @@ void compute_pulse_cache(CELTMode *m, int LM) for (i=0;istart;) { - int tmp = bits1[j] + (lo*bits2[j]>>ALLOC_STEPS); + int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS); if (tmp < thresh[j] && !done) { if (tmp >= alloc_floor) @@ -333,7 +333,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int /*Figure out how many left-over bits we would be adding to this band. This can include bits we've stolen back from higher, skipped bands.*/ left = total-psum; - percoeff = left/(m->eBands[codedBands]-m->eBands[start]); + percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0); band_width = m->eBands[codedBands]-m->eBands[j]; @@ -343,27 +343,29 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int This ensures that we have enough bits to code the skip flag.*/ if (band_bits >= IMAX(thresh[j], alloc_floor+(1< 17) + depth_threshold = j ((j>4) + if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<>4 && j<=signalBandwidth)) #endif { ec_enc_bit_logp(ec, 1, 1); break; } ec_enc_bit_logp(ec, 0, 1); - } else - #endif /* OPUS_ENABLE_ENCODER */ - if (ec_dec_bit_logp(ec, 1)) { + } else if (ec_dec_bit_logp(ec, 1)) { break; } /*We used a bit to skip this band.*/ @@ -390,14 +392,12 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int /* Code the intensity and dual stereo parameters. */ if (intensity_rsv > 0) { - #ifdef OPUS_ENABLE_ENCODER if (encode) { *intensity = IMIN(*intensity, codedBands); ec_enc_uint(ec, *intensity-start, codedBands+1-start); } else - #endif *intensity = start+ec_dec_uint(ec, codedBands+1-start); } else @@ -409,11 +409,9 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int } if (dual_stereo_rsv > 0) { - #ifdef OPUS_ENABLE_ENCODER if (encode) ec_enc_bit_logp(ec, *dual_stereo, 1); else - #endif *dual_stereo = ec_dec_bit_logp(ec, 1); } else @@ -421,7 +419,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int /* Allocate the remaining bits */ left = total-psum; - percoeff = left/(m->eBands[codedBands]-m->eBands[start]); + percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; for (j=start;jeBands[j+1]-m->eBands[j])); @@ -472,7 +470,8 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int offset += NClogN>>3; /* Divide with rounding */ - ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))) / (den<>BITRES; /* Make sure not to bust */ if (C*ebits[j] > (bits[j]>>BITRES)) @@ -530,8 +529,8 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int return codedBands; } -int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, - opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev) +int clt_compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, + opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) { int lo, hi, len, j; int codedBands; @@ -638,7 +637,7 @@ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets } codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap, total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, - pulses, ebits, fine_priority, C, LM, ec, encode, prev); + pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth); RESTORE_STACK; return codedBands; } diff --git a/external/opus-1.0.3/celt/rate.h b/external/opus-1.3.1/celt/rate.h similarity index 87% rename from external/opus-1.0.3/celt/rate.h rename to external/opus-1.3.1/celt/rate.h index e0d50223..fad5e412 100644 --- a/external/opus-1.0.3/celt/rate.h +++ b/external/opus-1.3.1/celt/rate.h @@ -32,7 +32,7 @@ #define MAX_PSEUDO 40 #define LOG_MAX_PSEUDO 6 -#define MAX_PULSES 128 +#define CELT_MAX_PULSES 128 #define MAX_FINE_BITS 8 @@ -45,12 +45,12 @@ void compute_pulse_cache(CELTMode *m, int LM); -static inline int get_pulses(int i) +static OPUS_INLINE int get_pulses(int i) { return i<8 ? i : (8 + (i&7)) << ((i>>3)-1); } -static inline int bits2pulses(const CELTMode *m, int band, int LM, int bits) +static OPUS_INLINE int bits2pulses(const CELTMode *m, int band, int LM, int bits) { int i; int lo, hi; @@ -77,7 +77,7 @@ static inline int bits2pulses(const CELTMode *m, int band, int LM, int bits) return hi; } -static inline int pulses2bits(const CELTMode *m, int band, int LM, int pulses) +static OPUS_INLINE int pulses2bits(const CELTMode *m, int band, int LM, int pulses) { const unsigned char *cache; @@ -95,7 +95,7 @@ static inline int pulses2bits(const CELTMode *m, int band, int LM, int pulses) @param pulses Number of pulses per band (returned) @return Total number of bits allocated */ -int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stero, - opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev); +int clt_compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, + opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth); #endif diff --git a/external/opus-1.0.3/celt/stack_alloc.h b/external/opus-1.3.1/celt/stack_alloc.h similarity index 78% rename from external/opus-1.0.3/celt/stack_alloc.h rename to external/opus-1.3.1/celt/stack_alloc.h index a6f06d22..ae40e2a1 100644 --- a/external/opus-1.0.3/celt/stack_alloc.h +++ b/external/opus-1.3.1/celt/stack_alloc.h @@ -32,12 +32,15 @@ #ifndef STACK_ALLOC_H #define STACK_ALLOC_H +#include "opus_types.h" +#include "opus_defines.h" + #if (!defined (VAR_ARRAYS) && !defined (USE_ALLOCA) && !defined (NONTHREADSAFE_PSEUDOSTACK)) #error "Opus requires one of VAR_ARRAYS, USE_ALLOCA, or NONTHREADSAFE_PSEUDOSTACK be defined to select the temporary allocation mode." #endif #ifdef USE_ALLOCA -# ifdef WIN32 +# ifdef _WIN32 # include # else # ifdef HAVE_ALLOCA_H @@ -92,12 +95,14 @@ #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK +/* C99 does not allow VLAs of size zero */ +#define ALLOC_NONE 1 #elif defined(USE_ALLOCA) #define VARDECL(type, var) type *var -# ifdef WIN32 +# ifdef _WIN32 # define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) # else # define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) @@ -106,13 +111,16 @@ #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK +#define ALLOC_NONE 0 #else #ifdef CELT_C +char *scratch_ptr=0; char *global_stack=0; #else extern char *global_stack; +extern char *scratch_ptr; #endif /* CELT_C */ #ifdef ENABLE_VALGRIND @@ -134,8 +142,12 @@ extern char *global_stack_top; #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/sizeof(char)),(stack)+=(size)*(sizeof(type)/sizeof(char)),(type*)((stack)-(size)*(sizeof(type)/sizeof(char)))) +#if 0 /* Set this to 1 to instrument pseudostack usage */ +#define RESTORE_STACK (printf("%ld %s:%d\n", global_stack-scratch_ptr, __FILE__, __LINE__),global_stack = _saved_stack) +#else #define RESTORE_STACK (global_stack = _saved_stack) -#define ALLOC_STACK char *_saved_stack; (global_stack = (global_stack==0) ? opus_alloc_scratch(GLOBAL_STACK_SIZE) : global_stack); _saved_stack = global_stack; +#endif +#define ALLOC_STACK char *_saved_stack; (global_stack = (global_stack==0) ? (scratch_ptr=opus_alloc_scratch(GLOBAL_STACK_SIZE)) : global_stack); _saved_stack = global_stack; #endif /* ENABLE_VALGRIND */ @@ -143,7 +155,30 @@ extern char *global_stack_top; #define VARDECL(type, var) type *var #define ALLOC(var, size, type) var = PUSH(global_stack, size, type) #define SAVE_STACK char *_saved_stack = global_stack; +#define ALLOC_NONE 0 #endif /* VAR_ARRAYS */ + +#ifdef ENABLE_VALGRIND + +#include +#define OPUS_CHECK_ARRAY(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof(*ptr)) +#define OPUS_CHECK_VALUE(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) +#define OPUS_CHECK_ARRAY_COND(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof(*ptr)) +#define OPUS_CHECK_VALUE_COND(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) +#define OPUS_PRINT_INT(value) do {fprintf(stderr, #value " = %d at %s:%d\n", value, __FILE__, __LINE__);}while(0) +#define OPUS_FPRINTF fprintf + +#else + +static OPUS_INLINE int _opus_false(void) {return 0;} +#define OPUS_CHECK_ARRAY(ptr, len) _opus_false() +#define OPUS_CHECK_VALUE(value) _opus_false() +#define OPUS_PRINT_INT(value) do{}while(0) +#define OPUS_FPRINTF (void) + +#endif + + #endif /* STACK_ALLOC_H */ diff --git a/external/opus-1.3.1/celt/static_modes_fixed.h b/external/opus-1.3.1/celt/static_modes_fixed.h new file mode 100644 index 00000000..8717d626 --- /dev/null +++ b/external/opus-1.3.1/celt/static_modes_fixed.h @@ -0,0 +1,892 @@ +/* The contents of this file was automatically generated by dump_modes.c + with arguments: 48000 960 + It contains static definitions for some pre-defined modes. */ +#include "modes.h" +#include "rate.h" + +#ifdef HAVE_ARM_NE10 +#define OVERRIDE_FFT 1 +#include "static_modes_fixed_arm_ne10.h" +#endif + +#ifndef DEF_WINDOW120 +#define DEF_WINDOW120 +static const opus_val16 window120[120] = { +2, 20, 55, 108, 178, +266, 372, 494, 635, 792, +966, 1157, 1365, 1590, 1831, +2089, 2362, 2651, 2956, 3276, +3611, 3961, 4325, 4703, 5094, +5499, 5916, 6346, 6788, 7241, +7705, 8179, 8663, 9156, 9657, +10167, 10684, 11207, 11736, 12271, +12810, 13353, 13899, 14447, 14997, +15547, 16098, 16648, 17197, 17744, +18287, 18827, 19363, 19893, 20418, +20936, 21447, 21950, 22445, 22931, +23407, 23874, 24330, 24774, 25208, +25629, 26039, 26435, 26819, 27190, +27548, 27893, 28224, 28541, 28845, +29135, 29411, 29674, 29924, 30160, +30384, 30594, 30792, 30977, 31151, +31313, 31463, 31602, 31731, 31849, +31958, 32057, 32148, 32229, 32303, +32370, 32429, 32481, 32528, 32568, +32604, 32634, 32661, 32683, 32701, +32717, 32729, 32740, 32748, 32754, +32758, 32762, 32764, 32766, 32767, +32767, 32767, 32767, 32767, 32767, +}; +#endif + +#ifndef DEF_LOGN400 +#define DEF_LOGN400 +static const opus_int16 logN400[21] = { +0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, }; +#endif + +#ifndef DEF_PULSE_CACHE50 +#define DEF_PULSE_CACHE50 +static const opus_int16 cache_index50[105] = { +-1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, +82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, +41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, +41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, +318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, +305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, +240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, +}; +static const unsigned char cache_bits50[392] = { +40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, +31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, +51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, +66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, +64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, +94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, +124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, +97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, +142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, +28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, +153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, +229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, +166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, +86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, +25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, +185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, +110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, +74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, +163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, +228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, +90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, +87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, +106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, +224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, +182, 234, }; +static const unsigned char cache_caps50[168] = { +224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185, +178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240, +240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160, +160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172, +138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207, +204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185, +185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39, +207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201, +188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204, +204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175, +140, 66, 40, }; +#endif + +#ifndef FFT_TWIDDLES48000_960 +#define FFT_TWIDDLES48000_960 +static const kiss_twiddle_cpx fft_twiddles48000_960[480] = { +{32767, 0}, {32766, -429}, +{32757, -858}, {32743, -1287}, +{32724, -1715}, {32698, -2143}, +{32667, -2570}, {32631, -2998}, +{32588, -3425}, {32541, -3851}, +{32488, -4277}, {32429, -4701}, +{32364, -5125}, {32295, -5548}, +{32219, -5971}, {32138, -6393}, +{32051, -6813}, {31960, -7231}, +{31863, -7650}, {31760, -8067}, +{31652, -8481}, {31539, -8895}, +{31419, -9306}, {31294, -9716}, +{31165, -10126}, {31030, -10532}, +{30889, -10937}, {30743, -11340}, +{30592, -11741}, {30436, -12141}, +{30274, -12540}, {30107, -12935}, +{29936, -13328}, {29758, -13718}, +{29577, -14107}, {29390, -14493}, +{29197, -14875}, {29000, -15257}, +{28797, -15635}, {28590, -16010}, +{28379, -16384}, {28162, -16753}, +{27940, -17119}, {27714, -17484}, +{27482, -17845}, {27246, -18205}, +{27006, -18560}, {26760, -18911}, +{26510, -19260}, {26257, -19606}, +{25997, -19947}, {25734, -20286}, +{25466, -20621}, {25194, -20952}, +{24918, -21281}, {24637, -21605}, +{24353, -21926}, {24063, -22242}, +{23770, -22555}, {23473, -22865}, +{23171, -23171}, {22866, -23472}, +{22557, -23769}, {22244, -24063}, +{21927, -24352}, {21606, -24636}, +{21282, -24917}, {20954, -25194}, +{20622, -25465}, {20288, -25733}, +{19949, -25997}, {19607, -26255}, +{19261, -26509}, {18914, -26760}, +{18561, -27004}, {18205, -27246}, +{17846, -27481}, {17485, -27713}, +{17122, -27940}, {16755, -28162}, +{16385, -28378}, {16012, -28590}, +{15636, -28797}, {15258, -28999}, +{14878, -29197}, {14494, -29389}, +{14108, -29576}, {13720, -29757}, +{13329, -29934}, {12937, -30107}, +{12540, -30274}, {12142, -30435}, +{11744, -30592}, {11342, -30743}, +{10939, -30889}, {10534, -31030}, +{10127, -31164}, {9718, -31294}, +{9307, -31418}, {8895, -31537}, +{8482, -31652}, {8067, -31759}, +{7650, -31862}, {7233, -31960}, +{6815, -32051}, {6393, -32138}, +{5973, -32219}, {5549, -32294}, +{5127, -32364}, {4703, -32429}, +{4278, -32487}, {3852, -32541}, +{3426, -32588}, {2999, -32630}, +{2572, -32667}, {2144, -32698}, +{1716, -32724}, {1287, -32742}, +{860, -32757}, {430, -32766}, +{0, -32767}, {-429, -32766}, +{-858, -32757}, {-1287, -32743}, +{-1715, -32724}, {-2143, -32698}, +{-2570, -32667}, {-2998, -32631}, +{-3425, -32588}, {-3851, -32541}, +{-4277, -32488}, {-4701, -32429}, +{-5125, -32364}, {-5548, -32295}, +{-5971, -32219}, {-6393, -32138}, +{-6813, -32051}, {-7231, -31960}, +{-7650, -31863}, {-8067, -31760}, +{-8481, -31652}, {-8895, -31539}, +{-9306, -31419}, {-9716, -31294}, +{-10126, -31165}, {-10532, -31030}, +{-10937, -30889}, {-11340, -30743}, +{-11741, -30592}, {-12141, -30436}, +{-12540, -30274}, {-12935, -30107}, +{-13328, -29936}, {-13718, -29758}, +{-14107, -29577}, {-14493, -29390}, +{-14875, -29197}, {-15257, -29000}, +{-15635, -28797}, {-16010, -28590}, +{-16384, -28379}, {-16753, -28162}, +{-17119, -27940}, {-17484, -27714}, +{-17845, -27482}, {-18205, -27246}, +{-18560, -27006}, {-18911, -26760}, +{-19260, -26510}, {-19606, -26257}, +{-19947, -25997}, {-20286, -25734}, +{-20621, -25466}, {-20952, -25194}, +{-21281, -24918}, {-21605, -24637}, +{-21926, -24353}, {-22242, -24063}, +{-22555, -23770}, {-22865, -23473}, +{-23171, -23171}, {-23472, -22866}, +{-23769, -22557}, {-24063, -22244}, +{-24352, -21927}, {-24636, -21606}, +{-24917, -21282}, {-25194, -20954}, +{-25465, -20622}, {-25733, -20288}, +{-25997, -19949}, {-26255, -19607}, +{-26509, -19261}, {-26760, -18914}, +{-27004, -18561}, {-27246, -18205}, +{-27481, -17846}, {-27713, -17485}, +{-27940, -17122}, {-28162, -16755}, +{-28378, -16385}, {-28590, -16012}, +{-28797, -15636}, {-28999, -15258}, +{-29197, -14878}, {-29389, -14494}, +{-29576, -14108}, {-29757, -13720}, +{-29934, -13329}, {-30107, -12937}, +{-30274, -12540}, {-30435, -12142}, +{-30592, -11744}, {-30743, -11342}, +{-30889, -10939}, {-31030, -10534}, +{-31164, -10127}, {-31294, -9718}, +{-31418, -9307}, {-31537, -8895}, +{-31652, -8482}, {-31759, -8067}, +{-31862, -7650}, {-31960, -7233}, +{-32051, -6815}, {-32138, -6393}, +{-32219, -5973}, {-32294, -5549}, +{-32364, -5127}, {-32429, -4703}, +{-32487, -4278}, {-32541, -3852}, +{-32588, -3426}, {-32630, -2999}, +{-32667, -2572}, {-32698, -2144}, +{-32724, -1716}, {-32742, -1287}, +{-32757, -860}, {-32766, -430}, +{-32767, 0}, {-32766, 429}, +{-32757, 858}, {-32743, 1287}, +{-32724, 1715}, {-32698, 2143}, +{-32667, 2570}, {-32631, 2998}, +{-32588, 3425}, {-32541, 3851}, +{-32488, 4277}, {-32429, 4701}, +{-32364, 5125}, {-32295, 5548}, +{-32219, 5971}, {-32138, 6393}, +{-32051, 6813}, {-31960, 7231}, +{-31863, 7650}, {-31760, 8067}, +{-31652, 8481}, {-31539, 8895}, +{-31419, 9306}, {-31294, 9716}, +{-31165, 10126}, {-31030, 10532}, +{-30889, 10937}, {-30743, 11340}, +{-30592, 11741}, {-30436, 12141}, +{-30274, 12540}, {-30107, 12935}, +{-29936, 13328}, {-29758, 13718}, +{-29577, 14107}, {-29390, 14493}, +{-29197, 14875}, {-29000, 15257}, +{-28797, 15635}, {-28590, 16010}, +{-28379, 16384}, {-28162, 16753}, +{-27940, 17119}, {-27714, 17484}, +{-27482, 17845}, {-27246, 18205}, +{-27006, 18560}, {-26760, 18911}, +{-26510, 19260}, {-26257, 19606}, +{-25997, 19947}, {-25734, 20286}, +{-25466, 20621}, {-25194, 20952}, +{-24918, 21281}, {-24637, 21605}, +{-24353, 21926}, {-24063, 22242}, +{-23770, 22555}, {-23473, 22865}, +{-23171, 23171}, {-22866, 23472}, +{-22557, 23769}, {-22244, 24063}, +{-21927, 24352}, {-21606, 24636}, +{-21282, 24917}, {-20954, 25194}, +{-20622, 25465}, {-20288, 25733}, +{-19949, 25997}, {-19607, 26255}, +{-19261, 26509}, {-18914, 26760}, +{-18561, 27004}, {-18205, 27246}, +{-17846, 27481}, {-17485, 27713}, +{-17122, 27940}, {-16755, 28162}, +{-16385, 28378}, {-16012, 28590}, +{-15636, 28797}, {-15258, 28999}, +{-14878, 29197}, {-14494, 29389}, +{-14108, 29576}, {-13720, 29757}, +{-13329, 29934}, {-12937, 30107}, +{-12540, 30274}, {-12142, 30435}, +{-11744, 30592}, {-11342, 30743}, +{-10939, 30889}, {-10534, 31030}, +{-10127, 31164}, {-9718, 31294}, +{-9307, 31418}, {-8895, 31537}, +{-8482, 31652}, {-8067, 31759}, +{-7650, 31862}, {-7233, 31960}, +{-6815, 32051}, {-6393, 32138}, +{-5973, 32219}, {-5549, 32294}, +{-5127, 32364}, {-4703, 32429}, +{-4278, 32487}, {-3852, 32541}, +{-3426, 32588}, {-2999, 32630}, +{-2572, 32667}, {-2144, 32698}, +{-1716, 32724}, {-1287, 32742}, +{-860, 32757}, {-430, 32766}, +{0, 32767}, {429, 32766}, +{858, 32757}, {1287, 32743}, +{1715, 32724}, {2143, 32698}, +{2570, 32667}, {2998, 32631}, +{3425, 32588}, {3851, 32541}, +{4277, 32488}, {4701, 32429}, +{5125, 32364}, {5548, 32295}, +{5971, 32219}, {6393, 32138}, +{6813, 32051}, {7231, 31960}, +{7650, 31863}, {8067, 31760}, +{8481, 31652}, {8895, 31539}, +{9306, 31419}, {9716, 31294}, +{10126, 31165}, {10532, 31030}, +{10937, 30889}, {11340, 30743}, +{11741, 30592}, {12141, 30436}, +{12540, 30274}, {12935, 30107}, +{13328, 29936}, {13718, 29758}, +{14107, 29577}, {14493, 29390}, +{14875, 29197}, {15257, 29000}, +{15635, 28797}, {16010, 28590}, +{16384, 28379}, {16753, 28162}, +{17119, 27940}, {17484, 27714}, +{17845, 27482}, {18205, 27246}, +{18560, 27006}, {18911, 26760}, +{19260, 26510}, {19606, 26257}, +{19947, 25997}, {20286, 25734}, +{20621, 25466}, {20952, 25194}, +{21281, 24918}, {21605, 24637}, +{21926, 24353}, {22242, 24063}, +{22555, 23770}, {22865, 23473}, +{23171, 23171}, {23472, 22866}, +{23769, 22557}, {24063, 22244}, +{24352, 21927}, {24636, 21606}, +{24917, 21282}, {25194, 20954}, +{25465, 20622}, {25733, 20288}, +{25997, 19949}, {26255, 19607}, +{26509, 19261}, {26760, 18914}, +{27004, 18561}, {27246, 18205}, +{27481, 17846}, {27713, 17485}, +{27940, 17122}, {28162, 16755}, +{28378, 16385}, {28590, 16012}, +{28797, 15636}, {28999, 15258}, +{29197, 14878}, {29389, 14494}, +{29576, 14108}, {29757, 13720}, +{29934, 13329}, {30107, 12937}, +{30274, 12540}, {30435, 12142}, +{30592, 11744}, {30743, 11342}, +{30889, 10939}, {31030, 10534}, +{31164, 10127}, {31294, 9718}, +{31418, 9307}, {31537, 8895}, +{31652, 8482}, {31759, 8067}, +{31862, 7650}, {31960, 7233}, +{32051, 6815}, {32138, 6393}, +{32219, 5973}, {32294, 5549}, +{32364, 5127}, {32429, 4703}, +{32487, 4278}, {32541, 3852}, +{32588, 3426}, {32630, 2999}, +{32667, 2572}, {32698, 2144}, +{32724, 1716}, {32742, 1287}, +{32757, 860}, {32766, 430}, +}; +#ifndef FFT_BITREV480 +#define FFT_BITREV480 +static const opus_int16 fft_bitrev480[480] = { +0, 96, 192, 288, 384, 32, 128, 224, 320, 416, 64, 160, 256, 352, 448, +8, 104, 200, 296, 392, 40, 136, 232, 328, 424, 72, 168, 264, 360, 456, +16, 112, 208, 304, 400, 48, 144, 240, 336, 432, 80, 176, 272, 368, 464, +24, 120, 216, 312, 408, 56, 152, 248, 344, 440, 88, 184, 280, 376, 472, +4, 100, 196, 292, 388, 36, 132, 228, 324, 420, 68, 164, 260, 356, 452, +12, 108, 204, 300, 396, 44, 140, 236, 332, 428, 76, 172, 268, 364, 460, +20, 116, 212, 308, 404, 52, 148, 244, 340, 436, 84, 180, 276, 372, 468, +28, 124, 220, 316, 412, 60, 156, 252, 348, 444, 92, 188, 284, 380, 476, +1, 97, 193, 289, 385, 33, 129, 225, 321, 417, 65, 161, 257, 353, 449, +9, 105, 201, 297, 393, 41, 137, 233, 329, 425, 73, 169, 265, 361, 457, +17, 113, 209, 305, 401, 49, 145, 241, 337, 433, 81, 177, 273, 369, 465, +25, 121, 217, 313, 409, 57, 153, 249, 345, 441, 89, 185, 281, 377, 473, +5, 101, 197, 293, 389, 37, 133, 229, 325, 421, 69, 165, 261, 357, 453, +13, 109, 205, 301, 397, 45, 141, 237, 333, 429, 77, 173, 269, 365, 461, +21, 117, 213, 309, 405, 53, 149, 245, 341, 437, 85, 181, 277, 373, 469, +29, 125, 221, 317, 413, 61, 157, 253, 349, 445, 93, 189, 285, 381, 477, +2, 98, 194, 290, 386, 34, 130, 226, 322, 418, 66, 162, 258, 354, 450, +10, 106, 202, 298, 394, 42, 138, 234, 330, 426, 74, 170, 266, 362, 458, +18, 114, 210, 306, 402, 50, 146, 242, 338, 434, 82, 178, 274, 370, 466, +26, 122, 218, 314, 410, 58, 154, 250, 346, 442, 90, 186, 282, 378, 474, +6, 102, 198, 294, 390, 38, 134, 230, 326, 422, 70, 166, 262, 358, 454, +14, 110, 206, 302, 398, 46, 142, 238, 334, 430, 78, 174, 270, 366, 462, +22, 118, 214, 310, 406, 54, 150, 246, 342, 438, 86, 182, 278, 374, 470, +30, 126, 222, 318, 414, 62, 158, 254, 350, 446, 94, 190, 286, 382, 478, +3, 99, 195, 291, 387, 35, 131, 227, 323, 419, 67, 163, 259, 355, 451, +11, 107, 203, 299, 395, 43, 139, 235, 331, 427, 75, 171, 267, 363, 459, +19, 115, 211, 307, 403, 51, 147, 243, 339, 435, 83, 179, 275, 371, 467, +27, 123, 219, 315, 411, 59, 155, 251, 347, 443, 91, 187, 283, 379, 475, +7, 103, 199, 295, 391, 39, 135, 231, 327, 423, 71, 167, 263, 359, 455, +15, 111, 207, 303, 399, 47, 143, 239, 335, 431, 79, 175, 271, 367, 463, +23, 119, 215, 311, 407, 55, 151, 247, 343, 439, 87, 183, 279, 375, 471, +31, 127, 223, 319, 415, 63, 159, 255, 351, 447, 95, 191, 287, 383, 479, +}; +#endif + +#ifndef FFT_BITREV240 +#define FFT_BITREV240 +static const opus_int16 fft_bitrev240[240] = { +0, 48, 96, 144, 192, 16, 64, 112, 160, 208, 32, 80, 128, 176, 224, +4, 52, 100, 148, 196, 20, 68, 116, 164, 212, 36, 84, 132, 180, 228, +8, 56, 104, 152, 200, 24, 72, 120, 168, 216, 40, 88, 136, 184, 232, +12, 60, 108, 156, 204, 28, 76, 124, 172, 220, 44, 92, 140, 188, 236, +1, 49, 97, 145, 193, 17, 65, 113, 161, 209, 33, 81, 129, 177, 225, +5, 53, 101, 149, 197, 21, 69, 117, 165, 213, 37, 85, 133, 181, 229, +9, 57, 105, 153, 201, 25, 73, 121, 169, 217, 41, 89, 137, 185, 233, +13, 61, 109, 157, 205, 29, 77, 125, 173, 221, 45, 93, 141, 189, 237, +2, 50, 98, 146, 194, 18, 66, 114, 162, 210, 34, 82, 130, 178, 226, +6, 54, 102, 150, 198, 22, 70, 118, 166, 214, 38, 86, 134, 182, 230, +10, 58, 106, 154, 202, 26, 74, 122, 170, 218, 42, 90, 138, 186, 234, +14, 62, 110, 158, 206, 30, 78, 126, 174, 222, 46, 94, 142, 190, 238, +3, 51, 99, 147, 195, 19, 67, 115, 163, 211, 35, 83, 131, 179, 227, +7, 55, 103, 151, 199, 23, 71, 119, 167, 215, 39, 87, 135, 183, 231, +11, 59, 107, 155, 203, 27, 75, 123, 171, 219, 43, 91, 139, 187, 235, +15, 63, 111, 159, 207, 31, 79, 127, 175, 223, 47, 95, 143, 191, 239, +}; +#endif + +#ifndef FFT_BITREV120 +#define FFT_BITREV120 +static const opus_int16 fft_bitrev120[120] = { +0, 24, 48, 72, 96, 8, 32, 56, 80, 104, 16, 40, 64, 88, 112, +4, 28, 52, 76, 100, 12, 36, 60, 84, 108, 20, 44, 68, 92, 116, +1, 25, 49, 73, 97, 9, 33, 57, 81, 105, 17, 41, 65, 89, 113, +5, 29, 53, 77, 101, 13, 37, 61, 85, 109, 21, 45, 69, 93, 117, +2, 26, 50, 74, 98, 10, 34, 58, 82, 106, 18, 42, 66, 90, 114, +6, 30, 54, 78, 102, 14, 38, 62, 86, 110, 22, 46, 70, 94, 118, +3, 27, 51, 75, 99, 11, 35, 59, 83, 107, 19, 43, 67, 91, 115, +7, 31, 55, 79, 103, 15, 39, 63, 87, 111, 23, 47, 71, 95, 119, +}; +#endif + +#ifndef FFT_BITREV60 +#define FFT_BITREV60 +static const opus_int16 fft_bitrev60[60] = { +0, 12, 24, 36, 48, 4, 16, 28, 40, 52, 8, 20, 32, 44, 56, +1, 13, 25, 37, 49, 5, 17, 29, 41, 53, 9, 21, 33, 45, 57, +2, 14, 26, 38, 50, 6, 18, 30, 42, 54, 10, 22, 34, 46, 58, +3, 15, 27, 39, 51, 7, 19, 31, 43, 55, 11, 23, 35, 47, 59, +}; +#endif + +#ifndef FFT_STATE48000_960_0 +#define FFT_STATE48000_960_0 +static const kiss_fft_state fft_state48000_960_0 = { +480, /* nfft */ +17476, /* scale */ +8, /* scale_shift */ +-1, /* shift */ +{5, 96, 3, 32, 4, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev480, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_480, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_1 +#define FFT_STATE48000_960_1 +static const kiss_fft_state fft_state48000_960_1 = { +240, /* nfft */ +17476, /* scale */ +7, /* scale_shift */ +1, /* shift */ +{5, 48, 3, 16, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev240, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_240, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_2 +#define FFT_STATE48000_960_2 +static const kiss_fft_state fft_state48000_960_2 = { +120, /* nfft */ +17476, /* scale */ +6, /* scale_shift */ +2, /* shift */ +{5, 24, 3, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev120, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_120, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_3 +#define FFT_STATE48000_960_3 +static const kiss_fft_state fft_state48000_960_3 = { +60, /* nfft */ +17476, /* scale */ +5, /* scale_shift */ +3, /* shift */ +{5, 12, 3, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev60, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_60, +#else +NULL, +#endif +}; +#endif + +#endif + +#ifndef MDCT_TWIDDLES960 +#define MDCT_TWIDDLES960 +static const opus_val16 mdct_twiddles960[1800] = { +32767, 32767, 32767, 32766, 32765, +32763, 32761, 32759, 32756, 32753, +32750, 32746, 32742, 32738, 32733, +32728, 32722, 32717, 32710, 32704, +32697, 32690, 32682, 32674, 32666, +32657, 32648, 32639, 32629, 32619, +32609, 32598, 32587, 32576, 32564, +32552, 32539, 32526, 32513, 32500, +32486, 32472, 32457, 32442, 32427, +32411, 32395, 32379, 32362, 32345, +32328, 32310, 32292, 32274, 32255, +32236, 32217, 32197, 32177, 32157, +32136, 32115, 32093, 32071, 32049, +32027, 32004, 31981, 31957, 31933, +31909, 31884, 31859, 31834, 31809, +31783, 31756, 31730, 31703, 31676, +31648, 31620, 31592, 31563, 31534, +31505, 31475, 31445, 31415, 31384, +31353, 31322, 31290, 31258, 31226, +31193, 31160, 31127, 31093, 31059, +31025, 30990, 30955, 30920, 30884, +30848, 30812, 30775, 30738, 30701, +30663, 30625, 30587, 30548, 30509, +30470, 30430, 30390, 30350, 30309, +30269, 30227, 30186, 30144, 30102, +30059, 30016, 29973, 29930, 29886, +29842, 29797, 29752, 29707, 29662, +29616, 29570, 29524, 29477, 29430, +29383, 29335, 29287, 29239, 29190, +29142, 29092, 29043, 28993, 28943, +28892, 28842, 28791, 28739, 28688, +28636, 28583, 28531, 28478, 28425, +28371, 28317, 28263, 28209, 28154, +28099, 28044, 27988, 27932, 27876, +27820, 27763, 27706, 27648, 27591, +27533, 27474, 27416, 27357, 27298, +27238, 27178, 27118, 27058, 26997, +26936, 26875, 26814, 26752, 26690, +26628, 26565, 26502, 26439, 26375, +26312, 26247, 26183, 26119, 26054, +25988, 25923, 25857, 25791, 25725, +25658, 25592, 25524, 25457, 25389, +25322, 25253, 25185, 25116, 25047, +24978, 24908, 24838, 24768, 24698, +24627, 24557, 24485, 24414, 24342, +24270, 24198, 24126, 24053, 23980, +23907, 23834, 23760, 23686, 23612, +23537, 23462, 23387, 23312, 23237, +23161, 23085, 23009, 22932, 22856, +22779, 22701, 22624, 22546, 22468, +22390, 22312, 22233, 22154, 22075, +21996, 21916, 21836, 21756, 21676, +21595, 21515, 21434, 21352, 21271, +21189, 21107, 21025, 20943, 20860, +20777, 20694, 20611, 20528, 20444, +20360, 20276, 20192, 20107, 20022, +19937, 19852, 19767, 19681, 19595, +19509, 19423, 19336, 19250, 19163, +19076, 18988, 18901, 18813, 18725, +18637, 18549, 18460, 18372, 18283, +18194, 18104, 18015, 17925, 17835, +17745, 17655, 17565, 17474, 17383, +17292, 17201, 17110, 17018, 16927, +16835, 16743, 16650, 16558, 16465, +16372, 16279, 16186, 16093, 15999, +15906, 15812, 15718, 15624, 15529, +15435, 15340, 15245, 15150, 15055, +14960, 14864, 14769, 14673, 14577, +14481, 14385, 14288, 14192, 14095, +13998, 13901, 13804, 13706, 13609, +13511, 13414, 13316, 13218, 13119, +13021, 12923, 12824, 12725, 12626, +12527, 12428, 12329, 12230, 12130, +12030, 11930, 11831, 11730, 11630, +11530, 11430, 11329, 11228, 11128, +11027, 10926, 10824, 10723, 10622, +10520, 10419, 10317, 10215, 10113, +10011, 9909, 9807, 9704, 9602, +9499, 9397, 9294, 9191, 9088, +8985, 8882, 8778, 8675, 8572, +8468, 8364, 8261, 8157, 8053, +7949, 7845, 7741, 7637, 7532, +7428, 7323, 7219, 7114, 7009, +6905, 6800, 6695, 6590, 6485, +6380, 6274, 6169, 6064, 5958, +5853, 5747, 5642, 5536, 5430, +5325, 5219, 5113, 5007, 4901, +4795, 4689, 4583, 4476, 4370, +4264, 4157, 4051, 3945, 3838, +3732, 3625, 3518, 3412, 3305, +3198, 3092, 2985, 2878, 2771, +2664, 2558, 2451, 2344, 2237, +2130, 2023, 1916, 1809, 1702, +1594, 1487, 1380, 1273, 1166, +1059, 952, 844, 737, 630, +523, 416, 308, 201, 94, +-13, -121, -228, -335, -442, +-550, -657, -764, -871, -978, +-1086, -1193, -1300, -1407, -1514, +-1621, -1728, -1835, -1942, -2049, +-2157, -2263, -2370, -2477, -2584, +-2691, -2798, -2905, -3012, -3118, +-3225, -3332, -3439, -3545, -3652, +-3758, -3865, -3971, -4078, -4184, +-4290, -4397, -4503, -4609, -4715, +-4821, -4927, -5033, -5139, -5245, +-5351, -5457, -5562, -5668, -5774, +-5879, -5985, -6090, -6195, -6301, +-6406, -6511, -6616, -6721, -6826, +-6931, -7036, -7140, -7245, -7349, +-7454, -7558, -7663, -7767, -7871, +-7975, -8079, -8183, -8287, -8390, +-8494, -8597, -8701, -8804, -8907, +-9011, -9114, -9217, -9319, -9422, +-9525, -9627, -9730, -9832, -9934, +-10037, -10139, -10241, -10342, -10444, +-10546, -10647, -10748, -10850, -10951, +-11052, -11153, -11253, -11354, -11455, +-11555, -11655, -11756, -11856, -11955, +-12055, -12155, -12254, -12354, -12453, +-12552, -12651, -12750, -12849, -12947, +-13046, -13144, -13242, -13340, -13438, +-13536, -13633, -13731, -13828, -13925, +-14022, -14119, -14216, -14312, -14409, +-14505, -14601, -14697, -14793, -14888, +-14984, -15079, -15174, -15269, -15364, +-15459, -15553, -15647, -15741, -15835, +-15929, -16023, -16116, -16210, -16303, +-16396, -16488, -16581, -16673, -16766, +-16858, -16949, -17041, -17133, -17224, +-17315, -17406, -17497, -17587, -17678, +-17768, -17858, -17948, -18037, -18127, +-18216, -18305, -18394, -18483, -18571, +-18659, -18747, -18835, -18923, -19010, +-19098, -19185, -19271, -19358, -19444, +-19531, -19617, -19702, -19788, -19873, +-19959, -20043, -20128, -20213, -20297, +-20381, -20465, -20549, -20632, -20715, +-20798, -20881, -20963, -21046, -21128, +-21210, -21291, -21373, -21454, -21535, +-21616, -21696, -21776, -21856, -21936, +-22016, -22095, -22174, -22253, -22331, +-22410, -22488, -22566, -22643, -22721, +-22798, -22875, -22951, -23028, -23104, +-23180, -23256, -23331, -23406, -23481, +-23556, -23630, -23704, -23778, -23852, +-23925, -23998, -24071, -24144, -24216, +-24288, -24360, -24432, -24503, -24574, +-24645, -24716, -24786, -24856, -24926, +-24995, -25064, -25133, -25202, -25270, +-25339, -25406, -25474, -25541, -25608, +-25675, -25742, -25808, -25874, -25939, +-26005, -26070, -26135, -26199, -26264, +-26327, -26391, -26455, -26518, -26581, +-26643, -26705, -26767, -26829, -26891, +-26952, -27013, -27073, -27133, -27193, +-27253, -27312, -27372, -27430, -27489, +-27547, -27605, -27663, -27720, -27777, +-27834, -27890, -27946, -28002, -28058, +-28113, -28168, -28223, -28277, -28331, +-28385, -28438, -28491, -28544, -28596, +-28649, -28701, -28752, -28803, -28854, +-28905, -28955, -29006, -29055, -29105, +-29154, -29203, -29251, -29299, -29347, +-29395, -29442, -29489, -29535, -29582, +-29628, -29673, -29719, -29764, -29808, +-29853, -29897, -29941, -29984, -30027, +-30070, -30112, -30154, -30196, -30238, +-30279, -30320, -30360, -30400, -30440, +-30480, -30519, -30558, -30596, -30635, +-30672, -30710, -30747, -30784, -30821, +-30857, -30893, -30929, -30964, -30999, +-31033, -31068, -31102, -31135, -31168, +-31201, -31234, -31266, -31298, -31330, +-31361, -31392, -31422, -31453, -31483, +-31512, -31541, -31570, -31599, -31627, +-31655, -31682, -31710, -31737, -31763, +-31789, -31815, -31841, -31866, -31891, +-31915, -31939, -31963, -31986, -32010, +-32032, -32055, -32077, -32099, -32120, +-32141, -32162, -32182, -32202, -32222, +-32241, -32260, -32279, -32297, -32315, +-32333, -32350, -32367, -32383, -32399, +-32415, -32431, -32446, -32461, -32475, +-32489, -32503, -32517, -32530, -32542, +-32555, -32567, -32579, -32590, -32601, +-32612, -32622, -32632, -32641, -32651, +-32659, -32668, -32676, -32684, -32692, +-32699, -32706, -32712, -32718, -32724, +-32729, -32734, -32739, -32743, -32747, +-32751, -32754, -32757, -32760, -32762, +-32764, -32765, -32767, -32767, -32767, +32767, 32767, 32765, 32761, 32756, +32750, 32742, 32732, 32722, 32710, +32696, 32681, 32665, 32647, 32628, +32608, 32586, 32562, 32538, 32512, +32484, 32455, 32425, 32393, 32360, +32326, 32290, 32253, 32214, 32174, +32133, 32090, 32046, 32001, 31954, +31906, 31856, 31805, 31753, 31700, +31645, 31588, 31530, 31471, 31411, +31349, 31286, 31222, 31156, 31089, +31020, 30951, 30880, 30807, 30733, +30658, 30582, 30504, 30425, 30345, +30263, 30181, 30096, 30011, 29924, +29836, 29747, 29656, 29564, 29471, +29377, 29281, 29184, 29086, 28987, +28886, 28784, 28681, 28577, 28471, +28365, 28257, 28147, 28037, 27925, +27812, 27698, 27583, 27467, 27349, +27231, 27111, 26990, 26868, 26744, +26620, 26494, 26367, 26239, 26110, +25980, 25849, 25717, 25583, 25449, +25313, 25176, 25038, 24900, 24760, +24619, 24477, 24333, 24189, 24044, +23898, 23751, 23602, 23453, 23303, +23152, 22999, 22846, 22692, 22537, +22380, 22223, 22065, 21906, 21746, +21585, 21423, 21261, 21097, 20933, +20767, 20601, 20434, 20265, 20096, +19927, 19756, 19584, 19412, 19239, +19065, 18890, 18714, 18538, 18361, +18183, 18004, 17824, 17644, 17463, +17281, 17098, 16915, 16731, 16546, +16361, 16175, 15988, 15800, 15612, +15423, 15234, 15043, 14852, 14661, +14469, 14276, 14083, 13889, 13694, +13499, 13303, 13107, 12910, 12713, +12515, 12317, 12118, 11918, 11718, +11517, 11316, 11115, 10913, 10710, +10508, 10304, 10100, 9896, 9691, +9486, 9281, 9075, 8869, 8662, +8455, 8248, 8040, 7832, 7623, +7415, 7206, 6996, 6787, 6577, +6366, 6156, 5945, 5734, 5523, +5311, 5100, 4888, 4675, 4463, +4251, 4038, 3825, 3612, 3399, +3185, 2972, 2758, 2544, 2330, +2116, 1902, 1688, 1474, 1260, +1045, 831, 617, 402, 188, +-27, -241, -456, -670, -885, +-1099, -1313, -1528, -1742, -1956, +-2170, -2384, -2598, -2811, -3025, +-3239, -3452, -3665, -3878, -4091, +-4304, -4516, -4728, -4941, -5153, +-5364, -5576, -5787, -5998, -6209, +-6419, -6629, -6839, -7049, -7258, +-7467, -7676, -7884, -8092, -8300, +-8507, -8714, -8920, -9127, -9332, +-9538, -9743, -9947, -10151, -10355, +-10558, -10761, -10963, -11165, -11367, +-11568, -11768, -11968, -12167, -12366, +-12565, -12762, -12960, -13156, -13352, +-13548, -13743, -13937, -14131, -14324, +-14517, -14709, -14900, -15091, -15281, +-15470, -15659, -15847, -16035, -16221, +-16407, -16593, -16777, -16961, -17144, +-17326, -17508, -17689, -17869, -18049, +-18227, -18405, -18582, -18758, -18934, +-19108, -19282, -19455, -19627, -19799, +-19969, -20139, -20308, -20475, -20642, +-20809, -20974, -21138, -21301, -21464, +-21626, -21786, -21946, -22105, -22263, +-22420, -22575, -22730, -22884, -23037, +-23189, -23340, -23490, -23640, -23788, +-23935, -24080, -24225, -24369, -24512, +-24654, -24795, -24934, -25073, -25211, +-25347, -25482, -25617, -25750, -25882, +-26013, -26143, -26272, -26399, -26526, +-26651, -26775, -26898, -27020, -27141, +-27260, -27379, -27496, -27612, -27727, +-27841, -27953, -28065, -28175, -28284, +-28391, -28498, -28603, -28707, -28810, +-28911, -29012, -29111, -29209, -29305, +-29401, -29495, -29587, -29679, -29769, +-29858, -29946, -30032, -30118, -30201, +-30284, -30365, -30445, -30524, -30601, +-30677, -30752, -30825, -30897, -30968, +-31038, -31106, -31172, -31238, -31302, +-31365, -31426, -31486, -31545, -31602, +-31658, -31713, -31766, -31818, -31869, +-31918, -31966, -32012, -32058, -32101, +-32144, -32185, -32224, -32262, -32299, +-32335, -32369, -32401, -32433, -32463, +-32491, -32518, -32544, -32568, -32591, +-32613, -32633, -32652, -32669, -32685, +-32700, -32713, -32724, -32735, -32744, +-32751, -32757, -32762, -32766, -32767, +32767, 32764, 32755, 32741, 32720, +32694, 32663, 32626, 32583, 32535, +32481, 32421, 32356, 32286, 32209, +32128, 32041, 31948, 31850, 31747, +31638, 31523, 31403, 31278, 31148, +31012, 30871, 30724, 30572, 30415, +30253, 30086, 29913, 29736, 29553, +29365, 29172, 28974, 28771, 28564, +28351, 28134, 27911, 27684, 27452, +27216, 26975, 26729, 26478, 26223, +25964, 25700, 25432, 25159, 24882, +24601, 24315, 24026, 23732, 23434, +23133, 22827, 22517, 22204, 21886, +21565, 21240, 20912, 20580, 20244, +19905, 19563, 19217, 18868, 18516, +18160, 17802, 17440, 17075, 16708, +16338, 15964, 15588, 15210, 14829, +14445, 14059, 13670, 13279, 12886, +12490, 12093, 11693, 11291, 10888, +10482, 10075, 9666, 9255, 8843, +8429, 8014, 7597, 7180, 6760, +6340, 5919, 5496, 5073, 4649, +4224, 3798, 3372, 2945, 2517, +2090, 1661, 1233, 804, 375, +-54, -483, -911, -1340, -1768, +-2197, -2624, -3052, -3479, -3905, +-4330, -4755, -5179, -5602, -6024, +-6445, -6865, -7284, -7702, -8118, +-8533, -8946, -9358, -9768, -10177, +-10584, -10989, -11392, -11793, -12192, +-12589, -12984, -13377, -13767, -14155, +-14541, -14924, -15305, -15683, -16058, +-16430, -16800, -17167, -17531, -17892, +-18249, -18604, -18956, -19304, -19649, +-19990, -20329, -20663, -20994, -21322, +-21646, -21966, -22282, -22595, -22904, +-23208, -23509, -23806, -24099, -24387, +-24672, -24952, -25228, -25499, -25766, +-26029, -26288, -26541, -26791, -27035, +-27275, -27511, -27741, -27967, -28188, +-28405, -28616, -28823, -29024, -29221, +-29412, -29599, -29780, -29957, -30128, +-30294, -30455, -30611, -30761, -30906, +-31046, -31181, -31310, -31434, -31552, +-31665, -31773, -31875, -31972, -32063, +-32149, -32229, -32304, -32373, -32437, +-32495, -32547, -32594, -32635, -32671, +-32701, -32726, -32745, -32758, -32766, +32767, 32754, 32717, 32658, 32577, +32473, 32348, 32200, 32029, 31837, +31624, 31388, 31131, 30853, 30553, +30232, 29891, 29530, 29148, 28746, +28324, 27883, 27423, 26944, 26447, +25931, 25398, 24847, 24279, 23695, +23095, 22478, 21846, 21199, 20538, +19863, 19174, 18472, 17757, 17030, +16291, 15541, 14781, 14010, 13230, +12441, 11643, 10837, 10024, 9204, +8377, 7545, 6708, 5866, 5020, +4171, 3319, 2464, 1608, 751, +-107, -965, -1822, -2678, -3532, +-4383, -5232, -6077, -6918, -7754, +-8585, -9409, -10228, -11039, -11843, +-12639, -13426, -14204, -14972, -15730, +-16477, -17213, -17937, -18648, -19347, +-20033, -20705, -21363, -22006, -22634, +-23246, -23843, -24423, -24986, -25533, +-26062, -26573, -27066, -27540, -27995, +-28431, -28848, -29245, -29622, -29979, +-30315, -30630, -30924, -31197, -31449, +-31679, -31887, -32074, -32239, -32381, +-32501, -32600, -32675, -32729, -32759, +}; +#endif + +static const CELTMode mode48000_960_120 = { +48000, /* Fs */ +120, /* overlap */ +21, /* nbEBands */ +21, /* effEBands */ +{27853, 0, 4096, 8192, }, /* preemph */ +eband5ms, /* eBands */ +3, /* maxLM */ +8, /* nbShortMdcts */ +120, /* shortMdctSize */ +11, /* nbAllocVectors */ +band_allocation, /* allocVectors */ +logN400, /* logN */ +window120, /* window */ +{1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */ +{392, cache_index50, cache_bits50, cache_caps50}, /* cache */ +}; + +/* List of all the available modes */ +#define TOTAL_MODES 1 +static const CELTMode * const static_mode_list[TOTAL_MODES] = { +&mode48000_960_120, +}; diff --git a/external/opus-1.3.1/celt/static_modes_fixed_arm_ne10.h b/external/opus-1.3.1/celt/static_modes_fixed_arm_ne10.h new file mode 100644 index 00000000..76230921 --- /dev/null +++ b/external/opus-1.3.1/celt/static_modes_fixed_arm_ne10.h @@ -0,0 +1,388 @@ +/* The contents of this file was automatically generated by + * dump_mode_arm_ne10.c with arguments: 48000 960 + * It contains static definitions for some pre-defined modes. */ +#include + +#ifndef NE10_FFT_PARAMS48000_960 +#define NE10_FFT_PARAMS48000_960 +static const ne10_int32_t ne10_factors_480[64] = { +4, 40, 4, 30, 2, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }; +static const ne10_int32_t ne10_factors_240[64] = { +3, 20, 4, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }; +static const ne10_int32_t ne10_factors_120[64] = { +3, 10, 2, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }; +static const ne10_int32_t ne10_factors_60[64] = { +2, 5, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }; +static const ne10_fft_cpx_int32_t ne10_twiddles_480[480] = { +{0,0}, {2147483647,0}, {2147483647,0}, +{2147483647,0}, {1961823921,-873460313}, {1436946998,-1595891394}, +{2147483647,0}, {1436946998,-1595891394}, {-224473265,-2135719496}, +{2147483647,0}, {663608871,-2042378339}, {-1737350854,-1262259096}, +{2147483647,0}, {-224473265,-2135719496}, {-2100555935,446487152}, +{2147483647,0}, {2100555974,-446486968}, {1961823921,-873460313}, +{1737350743,-1262259248}, {1436946998,-1595891394}, {1073741769,-1859775424}, +{663608871,-2042378339}, {224473078,-2135719516}, {-224473265,-2135719496}, +{-663609049,-2042378281}, {-1073741932,-1859775330}, {-1436947137,-1595891268}, +{-1737350854,-1262259096}, {-1961823997,-873460141}, {-2100556013,-446486785}, +{2147483647,0}, {2144540595,-112390613}, {2135719506,-224473172}, +{2121044558,-335940465}, {2100555974,-446486968}, {2074309912,-555809682}, +{2042378310,-663608960}, {2004848691,-769589332}, {1961823921,-873460313}, +{1913421927,-974937199}, {1859775377,-1073741851}, {1801031311,-1169603450}, +{1737350743,-1262259248}, {1668908218,-1351455280}, {1595891331,-1436947067}, +{1518500216,-1518500282}, {1436946998,-1595891394}, {1351455207,-1668908277}, +{1262259172,-1737350799}, {1169603371,-1801031362}, {1073741769,-1859775424}, +{974937230,-1913421912}, {873460227,-1961823959}, {769589125,-2004848771}, +{663608871,-2042378339}, {555809715,-2074309903}, {446486876,-2100555994}, +{335940246,-2121044593}, {224473078,-2135719516}, {112390647,-2144540593}, +{2147483647,0}, {2135719506,-224473172}, {2100555974,-446486968}, +{2042378310,-663608960}, {1961823921,-873460313}, {1859775377,-1073741851}, +{1737350743,-1262259248}, {1595891331,-1436947067}, {1436946998,-1595891394}, +{1262259172,-1737350799}, {1073741769,-1859775424}, {873460227,-1961823959}, +{663608871,-2042378339}, {446486876,-2100555994}, {224473078,-2135719516}, +{-94,-2147483647}, {-224473265,-2135719496}, {-446487060,-2100555955}, +{-663609049,-2042378281}, {-873460398,-1961823883}, {-1073741932,-1859775330}, +{-1262259116,-1737350839}, {-1436947137,-1595891268}, {-1595891628,-1436946738}, +{-1737350854,-1262259096}, {-1859775343,-1073741910}, {-1961823997,-873460141}, +{-2042378447,-663608538}, {-2100556013,-446486785}, {-2135719499,-224473240}, +{2147483647,0}, {2121044558,-335940465}, {2042378310,-663608960}, +{1913421927,-974937199}, {1737350743,-1262259248}, {1518500216,-1518500282}, +{1262259172,-1737350799}, {974937230,-1913421912}, {663608871,-2042378339}, +{335940246,-2121044593}, {-94,-2147483647}, {-335940431,-2121044564}, +{-663609049,-2042378281}, {-974937397,-1913421827}, {-1262259116,-1737350839}, +{-1518500258,-1518500240}, {-1737350854,-1262259096}, {-1913422071,-974936918}, +{-2042378447,-663608538}, {-2121044568,-335940406}, {-2147483647,188}, +{-2121044509,335940777}, {-2042378331,663608895}, {-1913421900,974937252}, +{-1737350633,1262259400}, {-1518499993,1518500506}, {-1262258813,1737351059}, +{-974936606,1913422229}, {-663609179,2042378239}, {-335940566,2121044542}, +{2147483647,0}, {2147299667,-28109693}, {2146747758,-56214570}, +{2145828015,-84309815}, {2144540595,-112390613}, {2142885719,-140452154}, +{2140863671,-168489630}, {2138474797,-196498235}, {2135719506,-224473172}, +{2132598271,-252409646}, {2129111626,-280302871}, {2125260168,-308148068}, +{2121044558,-335940465}, {2116465518,-363675300}, {2111523833,-391347822}, +{2106220349,-418953288}, {2100555974,-446486968}, {2094531681,-473944146}, +{2088148500,-501320115}, {2081407525,-528610186}, {2074309912,-555809682}, +{2066856885,-582913912}, {2059049696,-609918325}, {2050889698,-636818231}, +{2042378310,-663608960}, {2033516972,-690285983}, {2024307180,-716844791}, +{2014750533,-743280770}, {2004848691,-769589332}, {1994603329,-795766029}, +{1984016179,-821806435}, {1973089077,-847706028}, {1961823921,-873460313}, +{1950222618,-899064934}, {1938287127,-924515564}, {1926019520,-949807783}, +{1913421927,-974937199}, {1900496481,-999899565}, {1887245364,-1024690661}, +{1873670877,-1049306180}, {1859775377,-1073741851}, {1845561215,-1097993541}, +{1831030826,-1122057097}, {1816186632,-1145928502}, {1801031311,-1169603450}, +{1785567394,-1193077993}, {1769797456,-1216348214}, {1753724345,-1239409914}, +{1737350743,-1262259248}, {1720679456,-1284892300}, {1703713340,-1307305194}, +{1686455222,-1329494189}, {1668908218,-1351455280}, {1651075255,-1373184807}, +{1632959307,-1394679144}, {1614563642,-1415934412}, {1595891331,-1436947067}, +{1576945572,-1457713510}, {1557729613,-1478230181}, {1538246655,-1498493658}, +{1518500216,-1518500282}, {1498493590,-1538246721}, {1478230113,-1557729677}, +{1457713441,-1576945636}, {1436946998,-1595891394}, {1415934341,-1614563704}, +{1394679073,-1632959368}, {1373184735,-1651075315}, {1351455207,-1668908277}, +{1329494115,-1686455280}, {1307305120,-1703713397}, {1284892225,-1720679512}, +{1262259172,-1737350799}, {1239409837,-1753724400}, {1216348136,-1769797510}, +{1193077915,-1785567446}, {1169603371,-1801031362}, {1145928423,-1816186682}, +{1122057017,-1831030875}, {1097993571,-1845561197}, {1073741769,-1859775424}, +{1049305987,-1873670985}, {1024690635,-1887245378}, {999899482,-1900496524}, +{974937230,-1913421912}, {949807699,-1926019561}, {924515422,-1938287195}, +{899064965,-1950222603}, {873460227,-1961823959}, {847705824,-1973089164}, +{821806407,-1984016190}, {795765941,-1994603364}, {769589125,-2004848771}, +{743280682,-2014750566}, {716844642,-2024307233}, {690286016,-2033516961}, +{663608871,-2042378339}, {636818019,-2050889764}, {609918296,-2059049705}, +{582913822,-2066856911}, {555809715,-2074309903}, {528610126,-2081407540}, +{501319962,-2088148536}, {473944148,-2094531680}, {446486876,-2100555994}, +{418953102,-2106220386}, {391347792,-2111523838}, {363675176,-2116465540}, +{335940246,-2121044593}, {308148006,-2125260177}, {280302715,-2129111646}, +{252409648,-2132598271}, {224473078,-2135719516}, {196498046,-2138474814}, +{168489600,-2140863674}, {140452029,-2142885728}, {112390647,-2144540593}, +{84309753,-2145828017}, {56214412,-2146747762}, {28109695,-2147299667}, +{2147483647,0}, {2146747758,-56214570}, {2144540595,-112390613}, +{2140863671,-168489630}, {2135719506,-224473172}, {2129111626,-280302871}, +{2121044558,-335940465}, {2111523833,-391347822}, {2100555974,-446486968}, +{2088148500,-501320115}, {2074309912,-555809682}, {2059049696,-609918325}, +{2042378310,-663608960}, {2024307180,-716844791}, {2004848691,-769589332}, +{1984016179,-821806435}, {1961823921,-873460313}, {1938287127,-924515564}, +{1913421927,-974937199}, {1887245364,-1024690661}, {1859775377,-1073741851}, +{1831030826,-1122057097}, {1801031311,-1169603450}, {1769797456,-1216348214}, +{1737350743,-1262259248}, {1703713340,-1307305194}, {1668908218,-1351455280}, +{1632959307,-1394679144}, {1595891331,-1436947067}, {1557729613,-1478230181}, +{1518500216,-1518500282}, {1478230113,-1557729677}, {1436946998,-1595891394}, +{1394679073,-1632959368}, {1351455207,-1668908277}, {1307305120,-1703713397}, +{1262259172,-1737350799}, {1216348136,-1769797510}, {1169603371,-1801031362}, +{1122057017,-1831030875}, {1073741769,-1859775424}, {1024690635,-1887245378}, +{974937230,-1913421912}, {924515422,-1938287195}, {873460227,-1961823959}, +{821806407,-1984016190}, {769589125,-2004848771}, {716844642,-2024307233}, +{663608871,-2042378339}, {609918296,-2059049705}, {555809715,-2074309903}, +{501319962,-2088148536}, {446486876,-2100555994}, {391347792,-2111523838}, +{335940246,-2121044593}, {280302715,-2129111646}, {224473078,-2135719516}, +{168489600,-2140863674}, {112390647,-2144540593}, {56214412,-2146747762}, +{-94,-2147483647}, {-56214600,-2146747757}, {-112390835,-2144540584}, +{-168489787,-2140863659}, {-224473265,-2135719496}, {-280302901,-2129111622}, +{-335940431,-2121044564}, {-391347977,-2111523804}, {-446487060,-2100555955}, +{-501320144,-2088148493}, {-555809896,-2074309855}, {-609918476,-2059049651}, +{-663609049,-2042378281}, {-716844819,-2024307170}, {-769589300,-2004848703}, +{-821806581,-1984016118}, {-873460398,-1961823883}, {-924515591,-1938287114}, +{-974937397,-1913421827}, {-1024690575,-1887245411}, {-1073741932,-1859775330}, +{-1122057395,-1831030643}, {-1169603421,-1801031330}, {-1216348291,-1769797403}, +{-1262259116,-1737350839}, {-1307305268,-1703713283}, {-1351455453,-1668908078}, +{-1394679021,-1632959413}, {-1436947137,-1595891268}, {-1478230435,-1557729372}, +{-1518500258,-1518500240}, {-1557729742,-1478230045}, {-1595891628,-1436946738}, +{-1632959429,-1394679001}, {-1668908417,-1351455035}, {-1703713298,-1307305248}, +{-1737350854,-1262259096}, {-1769797708,-1216347848}, {-1801031344,-1169603400}, +{-1831030924,-1122056937}, {-1859775343,-1073741910}, {-1887245423,-1024690552}, +{-1913422071,-974936918}, {-1938287125,-924515568}, {-1961823997,-873460141}, +{-1984016324,-821806084}, {-2004848713,-769589276}, {-2024307264,-716844553}, +{-2042378447,-663608538}, {-2059049731,-609918206}, {-2074309994,-555809377}, +{-2088148499,-501320119}, {-2100556013,-446486785}, {-2111523902,-391347448}, +{-2121044568,-335940406}, {-2129111659,-280302621}, {-2135719499,-224473240}, +{-2140863681,-168489506}, {-2144540612,-112390298}, {-2146747758,-56214574}, +{2147483647,0}, {2145828015,-84309815}, {2140863671,-168489630}, +{2132598271,-252409646}, {2121044558,-335940465}, {2106220349,-418953288}, +{2088148500,-501320115}, {2066856885,-582913912}, {2042378310,-663608960}, +{2014750533,-743280770}, {1984016179,-821806435}, {1950222618,-899064934}, +{1913421927,-974937199}, {1873670877,-1049306180}, {1831030826,-1122057097}, +{1785567394,-1193077993}, {1737350743,-1262259248}, {1686455222,-1329494189}, +{1632959307,-1394679144}, {1576945572,-1457713510}, {1518500216,-1518500282}, +{1457713441,-1576945636}, {1394679073,-1632959368}, {1329494115,-1686455280}, +{1262259172,-1737350799}, {1193077915,-1785567446}, {1122057017,-1831030875}, +{1049305987,-1873670985}, {974937230,-1913421912}, {899064965,-1950222603}, +{821806407,-1984016190}, {743280682,-2014750566}, {663608871,-2042378339}, +{582913822,-2066856911}, {501319962,-2088148536}, {418953102,-2106220386}, +{335940246,-2121044593}, {252409648,-2132598271}, {168489600,-2140863674}, +{84309753,-2145828017}, {-94,-2147483647}, {-84309940,-2145828010}, +{-168489787,-2140863659}, {-252409834,-2132598249}, {-335940431,-2121044564}, +{-418953286,-2106220349}, {-501320144,-2088148493}, {-582914003,-2066856860}, +{-663609049,-2042378281}, {-743280858,-2014750501}, {-821806581,-1984016118}, +{-899065136,-1950222525}, {-974937397,-1913421827}, {-1049306374,-1873670768}, +{-1122057395,-1831030643}, {-1193078284,-1785567199}, {-1262259116,-1737350839}, +{-1329494061,-1686455323}, {-1394679021,-1632959413}, {-1457713485,-1576945595}, +{-1518500258,-1518500240}, {-1576945613,-1457713466}, {-1632959429,-1394679001}, +{-1686455338,-1329494041}, {-1737350854,-1262259096}, {-1785567498,-1193077837}, +{-1831030924,-1122056937}, {-1873671031,-1049305905}, {-1913422071,-974936918}, +{-1950222750,-899064648}, {-1984016324,-821806084}, {-2014750687,-743280354}, +{-2042378447,-663608538}, {-2066856867,-582913978}, {-2088148499,-501320119}, +{-2106220354,-418953261}, {-2121044568,-335940406}, {-2132598282,-252409555}, +{-2140863681,-168489506}, {-2145828021,-84309659}, {-2147483647,188}, +{-2145828006,84310034}, {-2140863651,168489881}, {-2132598237,252409928}, +{-2121044509,335940777}, {-2106220281,418953629}, {-2088148411,501320484}, +{-2066856765,582914339}, {-2042378331,663608895}, {-2014750557,743280706}, +{-1984016181,821806431}, {-1950222593,899064989}, {-1913421900,974937252}, +{-1873670848,1049306232}, {-1831030728,1122057257}, {-1785567289,1193078149}, +{-1737350633,1262259400}, {-1686455106,1329494336}, {-1632959185,1394679287}, +{-1576945358,1457713742}, {-1518499993,1518500506}, {-1457713209,1576945850}, +{-1394678735,1632959656}, {-1329493766,1686455555}, {-1262258813,1737351059}, +{-1193077546,1785567692}, {-1122056638,1831031107}, {-1049305599,1873671202}, +{-974936606,1913422229}, {-899064330,1950222896}, {-821805761,1984016458}, +{-743280025,2014750808}, {-663609179,2042378239}, {-582914134,2066856823}, +{-501320277,2088148461}, {-418953420,2106220322}, {-335940566,2121044542}, +{-252409716,2132598263}, {-168489668,2140863668}, {-84309821,2145828015}, +}; +static const ne10_fft_cpx_int32_t ne10_twiddles_240[240] = { +{0,0}, {2147483647,0}, {2147483647,0}, +{2147483647,0}, {1961823921,-873460313}, {1436946998,-1595891394}, +{2147483647,0}, {1436946998,-1595891394}, {-224473265,-2135719496}, +{2147483647,0}, {663608871,-2042378339}, {-1737350854,-1262259096}, +{2147483647,0}, {-224473265,-2135719496}, {-2100555935,446487152}, +{2147483647,0}, {2135719506,-224473172}, {2100555974,-446486968}, +{2042378310,-663608960}, {1961823921,-873460313}, {1859775377,-1073741851}, +{1737350743,-1262259248}, {1595891331,-1436947067}, {1436946998,-1595891394}, +{1262259172,-1737350799}, {1073741769,-1859775424}, {873460227,-1961823959}, +{663608871,-2042378339}, {446486876,-2100555994}, {224473078,-2135719516}, +{2147483647,0}, {2100555974,-446486968}, {1961823921,-873460313}, +{1737350743,-1262259248}, {1436946998,-1595891394}, {1073741769,-1859775424}, +{663608871,-2042378339}, {224473078,-2135719516}, {-224473265,-2135719496}, +{-663609049,-2042378281}, {-1073741932,-1859775330}, {-1436947137,-1595891268}, +{-1737350854,-1262259096}, {-1961823997,-873460141}, {-2100556013,-446486785}, +{2147483647,0}, {2042378310,-663608960}, {1737350743,-1262259248}, +{1262259172,-1737350799}, {663608871,-2042378339}, {-94,-2147483647}, +{-663609049,-2042378281}, {-1262259116,-1737350839}, {-1737350854,-1262259096}, +{-2042378447,-663608538}, {-2147483647,188}, {-2042378331,663608895}, +{-1737350633,1262259400}, {-1262258813,1737351059}, {-663609179,2042378239}, +{2147483647,0}, {2146747758,-56214570}, {2144540595,-112390613}, +{2140863671,-168489630}, {2135719506,-224473172}, {2129111626,-280302871}, +{2121044558,-335940465}, {2111523833,-391347822}, {2100555974,-446486968}, +{2088148500,-501320115}, {2074309912,-555809682}, {2059049696,-609918325}, +{2042378310,-663608960}, {2024307180,-716844791}, {2004848691,-769589332}, +{1984016179,-821806435}, {1961823921,-873460313}, {1938287127,-924515564}, +{1913421927,-974937199}, {1887245364,-1024690661}, {1859775377,-1073741851}, +{1831030826,-1122057097}, {1801031311,-1169603450}, {1769797456,-1216348214}, +{1737350743,-1262259248}, {1703713340,-1307305194}, {1668908218,-1351455280}, +{1632959307,-1394679144}, {1595891331,-1436947067}, {1557729613,-1478230181}, +{1518500216,-1518500282}, {1478230113,-1557729677}, {1436946998,-1595891394}, +{1394679073,-1632959368}, {1351455207,-1668908277}, {1307305120,-1703713397}, +{1262259172,-1737350799}, {1216348136,-1769797510}, {1169603371,-1801031362}, +{1122057017,-1831030875}, {1073741769,-1859775424}, {1024690635,-1887245378}, +{974937230,-1913421912}, {924515422,-1938287195}, {873460227,-1961823959}, +{821806407,-1984016190}, {769589125,-2004848771}, {716844642,-2024307233}, +{663608871,-2042378339}, {609918296,-2059049705}, {555809715,-2074309903}, +{501319962,-2088148536}, {446486876,-2100555994}, {391347792,-2111523838}, +{335940246,-2121044593}, {280302715,-2129111646}, {224473078,-2135719516}, +{168489600,-2140863674}, {112390647,-2144540593}, {56214412,-2146747762}, +{2147483647,0}, {2144540595,-112390613}, {2135719506,-224473172}, +{2121044558,-335940465}, {2100555974,-446486968}, {2074309912,-555809682}, +{2042378310,-663608960}, {2004848691,-769589332}, {1961823921,-873460313}, +{1913421927,-974937199}, {1859775377,-1073741851}, {1801031311,-1169603450}, +{1737350743,-1262259248}, {1668908218,-1351455280}, {1595891331,-1436947067}, +{1518500216,-1518500282}, {1436946998,-1595891394}, {1351455207,-1668908277}, +{1262259172,-1737350799}, {1169603371,-1801031362}, {1073741769,-1859775424}, +{974937230,-1913421912}, {873460227,-1961823959}, {769589125,-2004848771}, +{663608871,-2042378339}, {555809715,-2074309903}, {446486876,-2100555994}, +{335940246,-2121044593}, {224473078,-2135719516}, {112390647,-2144540593}, +{-94,-2147483647}, {-112390835,-2144540584}, {-224473265,-2135719496}, +{-335940431,-2121044564}, {-446487060,-2100555955}, {-555809896,-2074309855}, +{-663609049,-2042378281}, {-769589300,-2004848703}, {-873460398,-1961823883}, +{-974937397,-1913421827}, {-1073741932,-1859775330}, {-1169603421,-1801031330}, +{-1262259116,-1737350839}, {-1351455453,-1668908078}, {-1436947137,-1595891268}, +{-1518500258,-1518500240}, {-1595891628,-1436946738}, {-1668908417,-1351455035}, +{-1737350854,-1262259096}, {-1801031344,-1169603400}, {-1859775343,-1073741910}, +{-1913422071,-974936918}, {-1961823997,-873460141}, {-2004848713,-769589276}, +{-2042378447,-663608538}, {-2074309994,-555809377}, {-2100556013,-446486785}, +{-2121044568,-335940406}, {-2135719499,-224473240}, {-2144540612,-112390298}, +{2147483647,0}, {2140863671,-168489630}, {2121044558,-335940465}, +{2088148500,-501320115}, {2042378310,-663608960}, {1984016179,-821806435}, +{1913421927,-974937199}, {1831030826,-1122057097}, {1737350743,-1262259248}, +{1632959307,-1394679144}, {1518500216,-1518500282}, {1394679073,-1632959368}, +{1262259172,-1737350799}, {1122057017,-1831030875}, {974937230,-1913421912}, +{821806407,-1984016190}, {663608871,-2042378339}, {501319962,-2088148536}, +{335940246,-2121044593}, {168489600,-2140863674}, {-94,-2147483647}, +{-168489787,-2140863659}, {-335940431,-2121044564}, {-501320144,-2088148493}, +{-663609049,-2042378281}, {-821806581,-1984016118}, {-974937397,-1913421827}, +{-1122057395,-1831030643}, {-1262259116,-1737350839}, {-1394679021,-1632959413}, +{-1518500258,-1518500240}, {-1632959429,-1394679001}, {-1737350854,-1262259096}, +{-1831030924,-1122056937}, {-1913422071,-974936918}, {-1984016324,-821806084}, +{-2042378447,-663608538}, {-2088148499,-501320119}, {-2121044568,-335940406}, +{-2140863681,-168489506}, {-2147483647,188}, {-2140863651,168489881}, +{-2121044509,335940777}, {-2088148411,501320484}, {-2042378331,663608895}, +{-1984016181,821806431}, {-1913421900,974937252}, {-1831030728,1122057257}, +{-1737350633,1262259400}, {-1632959185,1394679287}, {-1518499993,1518500506}, +{-1394678735,1632959656}, {-1262258813,1737351059}, {-1122056638,1831031107}, +{-974936606,1913422229}, {-821805761,1984016458}, {-663609179,2042378239}, +{-501320277,2088148461}, {-335940566,2121044542}, {-168489668,2140863668}, +}; +static const ne10_fft_cpx_int32_t ne10_twiddles_120[120] = { +{0,0}, {2147483647,0}, {2147483647,0}, +{2147483647,0}, {1961823921,-873460313}, {1436946998,-1595891394}, +{2147483647,0}, {1436946998,-1595891394}, {-224473265,-2135719496}, +{2147483647,0}, {663608871,-2042378339}, {-1737350854,-1262259096}, +{2147483647,0}, {-224473265,-2135719496}, {-2100555935,446487152}, +{2147483647,0}, {2100555974,-446486968}, {1961823921,-873460313}, +{1737350743,-1262259248}, {1436946998,-1595891394}, {1073741769,-1859775424}, +{663608871,-2042378339}, {224473078,-2135719516}, {-224473265,-2135719496}, +{-663609049,-2042378281}, {-1073741932,-1859775330}, {-1436947137,-1595891268}, +{-1737350854,-1262259096}, {-1961823997,-873460141}, {-2100556013,-446486785}, +{2147483647,0}, {2144540595,-112390613}, {2135719506,-224473172}, +{2121044558,-335940465}, {2100555974,-446486968}, {2074309912,-555809682}, +{2042378310,-663608960}, {2004848691,-769589332}, {1961823921,-873460313}, +{1913421927,-974937199}, {1859775377,-1073741851}, {1801031311,-1169603450}, +{1737350743,-1262259248}, {1668908218,-1351455280}, {1595891331,-1436947067}, +{1518500216,-1518500282}, {1436946998,-1595891394}, {1351455207,-1668908277}, +{1262259172,-1737350799}, {1169603371,-1801031362}, {1073741769,-1859775424}, +{974937230,-1913421912}, {873460227,-1961823959}, {769589125,-2004848771}, +{663608871,-2042378339}, {555809715,-2074309903}, {446486876,-2100555994}, +{335940246,-2121044593}, {224473078,-2135719516}, {112390647,-2144540593}, +{2147483647,0}, {2135719506,-224473172}, {2100555974,-446486968}, +{2042378310,-663608960}, {1961823921,-873460313}, {1859775377,-1073741851}, +{1737350743,-1262259248}, {1595891331,-1436947067}, {1436946998,-1595891394}, +{1262259172,-1737350799}, {1073741769,-1859775424}, {873460227,-1961823959}, +{663608871,-2042378339}, {446486876,-2100555994}, {224473078,-2135719516}, +{-94,-2147483647}, {-224473265,-2135719496}, {-446487060,-2100555955}, +{-663609049,-2042378281}, {-873460398,-1961823883}, {-1073741932,-1859775330}, +{-1262259116,-1737350839}, {-1436947137,-1595891268}, {-1595891628,-1436946738}, +{-1737350854,-1262259096}, {-1859775343,-1073741910}, {-1961823997,-873460141}, +{-2042378447,-663608538}, {-2100556013,-446486785}, {-2135719499,-224473240}, +{2147483647,0}, {2121044558,-335940465}, {2042378310,-663608960}, +{1913421927,-974937199}, {1737350743,-1262259248}, {1518500216,-1518500282}, +{1262259172,-1737350799}, {974937230,-1913421912}, {663608871,-2042378339}, +{335940246,-2121044593}, {-94,-2147483647}, {-335940431,-2121044564}, +{-663609049,-2042378281}, {-974937397,-1913421827}, {-1262259116,-1737350839}, +{-1518500258,-1518500240}, {-1737350854,-1262259096}, {-1913422071,-974936918}, +{-2042378447,-663608538}, {-2121044568,-335940406}, {-2147483647,188}, +{-2121044509,335940777}, {-2042378331,663608895}, {-1913421900,974937252}, +{-1737350633,1262259400}, {-1518499993,1518500506}, {-1262258813,1737351059}, +{-974936606,1913422229}, {-663609179,2042378239}, {-335940566,2121044542}, +}; +static const ne10_fft_cpx_int32_t ne10_twiddles_60[60] = { +{0,0}, {2147483647,0}, {2147483647,0}, +{2147483647,0}, {1961823921,-873460313}, {1436946998,-1595891394}, +{2147483647,0}, {1436946998,-1595891394}, {-224473265,-2135719496}, +{2147483647,0}, {663608871,-2042378339}, {-1737350854,-1262259096}, +{2147483647,0}, {-224473265,-2135719496}, {-2100555935,446487152}, +{2147483647,0}, {2135719506,-224473172}, {2100555974,-446486968}, +{2042378310,-663608960}, {1961823921,-873460313}, {1859775377,-1073741851}, +{1737350743,-1262259248}, {1595891331,-1436947067}, {1436946998,-1595891394}, +{1262259172,-1737350799}, {1073741769,-1859775424}, {873460227,-1961823959}, +{663608871,-2042378339}, {446486876,-2100555994}, {224473078,-2135719516}, +{2147483647,0}, {2100555974,-446486968}, {1961823921,-873460313}, +{1737350743,-1262259248}, {1436946998,-1595891394}, {1073741769,-1859775424}, +{663608871,-2042378339}, {224473078,-2135719516}, {-224473265,-2135719496}, +{-663609049,-2042378281}, {-1073741932,-1859775330}, {-1436947137,-1595891268}, +{-1737350854,-1262259096}, {-1961823997,-873460141}, {-2100556013,-446486785}, +{2147483647,0}, {2042378310,-663608960}, {1737350743,-1262259248}, +{1262259172,-1737350799}, {663608871,-2042378339}, {-94,-2147483647}, +{-663609049,-2042378281}, {-1262259116,-1737350839}, {-1737350854,-1262259096}, +{-2042378447,-663608538}, {-2147483647,188}, {-2042378331,663608895}, +{-1737350633,1262259400}, {-1262258813,1737351059}, {-663609179,2042378239}, +}; +static const ne10_fft_state_int32_t ne10_fft_state_int32_t_480 = { +120, +(ne10_int32_t *)ne10_factors_480, +(ne10_fft_cpx_int32_t *)ne10_twiddles_480, +NULL, +(ne10_fft_cpx_int32_t *)&ne10_twiddles_480[120], +}; +static const arch_fft_state cfg_arch_480 = { +1, +(void *)&ne10_fft_state_int32_t_480, +}; + +static const ne10_fft_state_int32_t ne10_fft_state_int32_t_240 = { +60, +(ne10_int32_t *)ne10_factors_240, +(ne10_fft_cpx_int32_t *)ne10_twiddles_240, +NULL, +(ne10_fft_cpx_int32_t *)&ne10_twiddles_240[60], +}; +static const arch_fft_state cfg_arch_240 = { +1, +(void *)&ne10_fft_state_int32_t_240, +}; + +static const ne10_fft_state_int32_t ne10_fft_state_int32_t_120 = { +30, +(ne10_int32_t *)ne10_factors_120, +(ne10_fft_cpx_int32_t *)ne10_twiddles_120, +NULL, +(ne10_fft_cpx_int32_t *)&ne10_twiddles_120[30], +}; +static const arch_fft_state cfg_arch_120 = { +1, +(void *)&ne10_fft_state_int32_t_120, +}; + +static const ne10_fft_state_int32_t ne10_fft_state_int32_t_60 = { +15, +(ne10_int32_t *)ne10_factors_60, +(ne10_fft_cpx_int32_t *)ne10_twiddles_60, +NULL, +(ne10_fft_cpx_int32_t *)&ne10_twiddles_60[15], +}; +static const arch_fft_state cfg_arch_60 = { +1, +(void *)&ne10_fft_state_int32_t_60, +}; + +#endif /* end NE10_FFT_PARAMS48000_960 */ diff --git a/external/opus-1.3.1/celt/static_modes_float.h b/external/opus-1.3.1/celt/static_modes_float.h new file mode 100644 index 00000000..e102a383 --- /dev/null +++ b/external/opus-1.3.1/celt/static_modes_float.h @@ -0,0 +1,888 @@ +/* The contents of this file was automatically generated by dump_modes.c + with arguments: 48000 960 + It contains static definitions for some pre-defined modes. */ +#include "modes.h" +#include "rate.h" + +#ifdef HAVE_ARM_NE10 +#define OVERRIDE_FFT 1 +#include "static_modes_float_arm_ne10.h" +#endif + +#ifndef DEF_WINDOW120 +#define DEF_WINDOW120 +static const opus_val16 window120[120] = { +6.7286966e-05f, 0.00060551348f, 0.0016815970f, 0.0032947962f, 0.0054439943f, +0.0081276923f, 0.011344001f, 0.015090633f, 0.019364886f, 0.024163635f, +0.029483315f, 0.035319905f, 0.041668911f, 0.048525347f, 0.055883718f, +0.063737999f, 0.072081616f, 0.080907428f, 0.090207705f, 0.099974111f, +0.11019769f, 0.12086883f, 0.13197729f, 0.14351214f, 0.15546177f, +0.16781389f, 0.18055550f, 0.19367290f, 0.20715171f, 0.22097682f, +0.23513243f, 0.24960208f, 0.26436860f, 0.27941419f, 0.29472040f, +0.31026818f, 0.32603788f, 0.34200931f, 0.35816177f, 0.37447407f, +0.39092462f, 0.40749142f, 0.42415215f, 0.44088423f, 0.45766484f, +0.47447104f, 0.49127978f, 0.50806798f, 0.52481261f, 0.54149077f, +0.55807973f, 0.57455701f, 0.59090049f, 0.60708841f, 0.62309951f, +0.63891306f, 0.65450896f, 0.66986776f, 0.68497077f, 0.69980010f, +0.71433873f, 0.72857055f, 0.74248043f, 0.75605424f, 0.76927895f, +0.78214257f, 0.79463430f, 0.80674445f, 0.81846456f, 0.82978733f, +0.84070669f, 0.85121779f, 0.86131698f, 0.87100183f, 0.88027111f, +0.88912479f, 0.89756398f, 0.90559094f, 0.91320904f, 0.92042270f, +0.92723738f, 0.93365955f, 0.93969656f, 0.94535671f, 0.95064907f, +0.95558353f, 0.96017067f, 0.96442171f, 0.96834849f, 0.97196334f, +0.97527906f, 0.97830883f, 0.98106616f, 0.98356480f, 0.98581869f, +0.98784191f, 0.98964856f, 0.99125274f, 0.99266849f, 0.99390969f, +0.99499004f, 0.99592297f, 0.99672162f, 0.99739874f, 0.99796667f, +0.99843728f, 0.99882195f, 0.99913147f, 0.99937606f, 0.99956527f, +0.99970802f, 0.99981248f, 0.99988613f, 0.99993565f, 0.99996697f, +0.99998518f, 0.99999457f, 0.99999859f, 0.99999982f, 1.0000000f, +}; +#endif + +#ifndef DEF_LOGN400 +#define DEF_LOGN400 +static const opus_int16 logN400[21] = { +0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, }; +#endif + +#ifndef DEF_PULSE_CACHE50 +#define DEF_PULSE_CACHE50 +static const opus_int16 cache_index50[105] = { +-1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, +82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, +41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, +41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, +318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, +305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, +240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, +}; +static const unsigned char cache_bits50[392] = { +40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, +31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, +51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, +66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, +64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, +94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, +124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, +97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, +142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, +28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, +153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, +229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, +166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, +86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, +25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, +185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, +110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, +74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, +163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, +228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, +90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, +87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, +106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, +224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, +182, 234, }; +static const unsigned char cache_caps50[168] = { +224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185, +178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240, +240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160, +160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172, +138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207, +204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185, +185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39, +207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201, +188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193, +193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204, +204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175, +140, 66, 40, }; +#endif + +#ifndef FFT_TWIDDLES48000_960 +#define FFT_TWIDDLES48000_960 +static const kiss_twiddle_cpx fft_twiddles48000_960[480] = { +{1.0000000f, -0.0000000f}, {0.99991433f, -0.013089596f}, +{0.99965732f, -0.026176948f}, {0.99922904f, -0.039259816f}, +{0.99862953f, -0.052335956f}, {0.99785892f, -0.065403129f}, +{0.99691733f, -0.078459096f}, {0.99580493f, -0.091501619f}, +{0.99452190f, -0.10452846f}, {0.99306846f, -0.11753740f}, +{0.99144486f, -0.13052619f}, {0.98965139f, -0.14349262f}, +{0.98768834f, -0.15643447f}, {0.98555606f, -0.16934950f}, +{0.98325491f, -0.18223553f}, {0.98078528f, -0.19509032f}, +{0.97814760f, -0.20791169f}, {0.97534232f, -0.22069744f}, +{0.97236992f, -0.23344536f}, {0.96923091f, -0.24615329f}, +{0.96592583f, -0.25881905f}, {0.96245524f, -0.27144045f}, +{0.95881973f, -0.28401534f}, {0.95501994f, -0.29654157f}, +{0.95105652f, -0.30901699f}, {0.94693013f, -0.32143947f}, +{0.94264149f, -0.33380686f}, {0.93819134f, -0.34611706f}, +{0.93358043f, -0.35836795f}, {0.92880955f, -0.37055744f}, +{0.92387953f, -0.38268343f}, {0.91879121f, -0.39474386f}, +{0.91354546f, -0.40673664f}, {0.90814317f, -0.41865974f}, +{0.90258528f, -0.43051110f}, {0.89687274f, -0.44228869f}, +{0.89100652f, -0.45399050f}, {0.88498764f, -0.46561452f}, +{0.87881711f, -0.47715876f}, {0.87249601f, -0.48862124f}, +{0.86602540f, -0.50000000f}, {0.85940641f, -0.51129309f}, +{0.85264016f, -0.52249856f}, {0.84572782f, -0.53361452f}, +{0.83867057f, -0.54463904f}, {0.83146961f, -0.55557023f}, +{0.82412619f, -0.56640624f}, {0.81664156f, -0.57714519f}, +{0.80901699f, -0.58778525f}, {0.80125381f, -0.59832460f}, +{0.79335334f, -0.60876143f}, {0.78531693f, -0.61909395f}, +{0.77714596f, -0.62932039f}, {0.76884183f, -0.63943900f}, +{0.76040597f, -0.64944805f}, {0.75183981f, -0.65934582f}, +{0.74314483f, -0.66913061f}, {0.73432251f, -0.67880075f}, +{0.72537437f, -0.68835458f}, {0.71630194f, -0.69779046f}, +{0.70710678f, -0.70710678f}, {0.69779046f, -0.71630194f}, +{0.68835458f, -0.72537437f}, {0.67880075f, -0.73432251f}, +{0.66913061f, -0.74314483f}, {0.65934582f, -0.75183981f}, +{0.64944805f, -0.76040597f}, {0.63943900f, -0.76884183f}, +{0.62932039f, -0.77714596f}, {0.61909395f, -0.78531693f}, +{0.60876143f, -0.79335334f}, {0.59832460f, -0.80125381f}, +{0.58778525f, -0.80901699f}, {0.57714519f, -0.81664156f}, +{0.56640624f, -0.82412619f}, {0.55557023f, -0.83146961f}, +{0.54463904f, -0.83867057f}, {0.53361452f, -0.84572782f}, +{0.52249856f, -0.85264016f}, {0.51129309f, -0.85940641f}, +{0.50000000f, -0.86602540f}, {0.48862124f, -0.87249601f}, +{0.47715876f, -0.87881711f}, {0.46561452f, -0.88498764f}, +{0.45399050f, -0.89100652f}, {0.44228869f, -0.89687274f}, +{0.43051110f, -0.90258528f}, {0.41865974f, -0.90814317f}, +{0.40673664f, -0.91354546f}, {0.39474386f, -0.91879121f}, +{0.38268343f, -0.92387953f}, {0.37055744f, -0.92880955f}, +{0.35836795f, -0.93358043f}, {0.34611706f, -0.93819134f}, +{0.33380686f, -0.94264149f}, {0.32143947f, -0.94693013f}, +{0.30901699f, -0.95105652f}, {0.29654157f, -0.95501994f}, +{0.28401534f, -0.95881973f}, {0.27144045f, -0.96245524f}, +{0.25881905f, -0.96592583f}, {0.24615329f, -0.96923091f}, +{0.23344536f, -0.97236992f}, {0.22069744f, -0.97534232f}, +{0.20791169f, -0.97814760f}, {0.19509032f, -0.98078528f}, +{0.18223553f, -0.98325491f}, {0.16934950f, -0.98555606f}, +{0.15643447f, -0.98768834f}, {0.14349262f, -0.98965139f}, +{0.13052619f, -0.99144486f}, {0.11753740f, -0.99306846f}, +{0.10452846f, -0.99452190f}, {0.091501619f, -0.99580493f}, +{0.078459096f, -0.99691733f}, {0.065403129f, -0.99785892f}, +{0.052335956f, -0.99862953f}, {0.039259816f, -0.99922904f}, +{0.026176948f, -0.99965732f}, {0.013089596f, -0.99991433f}, +{6.1230318e-17f, -1.0000000f}, {-0.013089596f, -0.99991433f}, +{-0.026176948f, -0.99965732f}, {-0.039259816f, -0.99922904f}, +{-0.052335956f, -0.99862953f}, {-0.065403129f, -0.99785892f}, +{-0.078459096f, -0.99691733f}, {-0.091501619f, -0.99580493f}, +{-0.10452846f, -0.99452190f}, {-0.11753740f, -0.99306846f}, +{-0.13052619f, -0.99144486f}, {-0.14349262f, -0.98965139f}, +{-0.15643447f, -0.98768834f}, {-0.16934950f, -0.98555606f}, +{-0.18223553f, -0.98325491f}, {-0.19509032f, -0.98078528f}, +{-0.20791169f, -0.97814760f}, {-0.22069744f, -0.97534232f}, +{-0.23344536f, -0.97236992f}, {-0.24615329f, -0.96923091f}, +{-0.25881905f, -0.96592583f}, {-0.27144045f, -0.96245524f}, +{-0.28401534f, -0.95881973f}, {-0.29654157f, -0.95501994f}, +{-0.30901699f, -0.95105652f}, {-0.32143947f, -0.94693013f}, +{-0.33380686f, -0.94264149f}, {-0.34611706f, -0.93819134f}, +{-0.35836795f, -0.93358043f}, {-0.37055744f, -0.92880955f}, +{-0.38268343f, -0.92387953f}, {-0.39474386f, -0.91879121f}, +{-0.40673664f, -0.91354546f}, {-0.41865974f, -0.90814317f}, +{-0.43051110f, -0.90258528f}, {-0.44228869f, -0.89687274f}, +{-0.45399050f, -0.89100652f}, {-0.46561452f, -0.88498764f}, +{-0.47715876f, -0.87881711f}, {-0.48862124f, -0.87249601f}, +{-0.50000000f, -0.86602540f}, {-0.51129309f, -0.85940641f}, +{-0.52249856f, -0.85264016f}, {-0.53361452f, -0.84572782f}, +{-0.54463904f, -0.83867057f}, {-0.55557023f, -0.83146961f}, +{-0.56640624f, -0.82412619f}, {-0.57714519f, -0.81664156f}, +{-0.58778525f, -0.80901699f}, {-0.59832460f, -0.80125381f}, +{-0.60876143f, -0.79335334f}, {-0.61909395f, -0.78531693f}, +{-0.62932039f, -0.77714596f}, {-0.63943900f, -0.76884183f}, +{-0.64944805f, -0.76040597f}, {-0.65934582f, -0.75183981f}, +{-0.66913061f, -0.74314483f}, {-0.67880075f, -0.73432251f}, +{-0.68835458f, -0.72537437f}, {-0.69779046f, -0.71630194f}, +{-0.70710678f, -0.70710678f}, {-0.71630194f, -0.69779046f}, +{-0.72537437f, -0.68835458f}, {-0.73432251f, -0.67880075f}, +{-0.74314483f, -0.66913061f}, {-0.75183981f, -0.65934582f}, +{-0.76040597f, -0.64944805f}, {-0.76884183f, -0.63943900f}, +{-0.77714596f, -0.62932039f}, {-0.78531693f, -0.61909395f}, +{-0.79335334f, -0.60876143f}, {-0.80125381f, -0.59832460f}, +{-0.80901699f, -0.58778525f}, {-0.81664156f, -0.57714519f}, +{-0.82412619f, -0.56640624f}, {-0.83146961f, -0.55557023f}, +{-0.83867057f, -0.54463904f}, {-0.84572782f, -0.53361452f}, +{-0.85264016f, -0.52249856f}, {-0.85940641f, -0.51129309f}, +{-0.86602540f, -0.50000000f}, {-0.87249601f, -0.48862124f}, +{-0.87881711f, -0.47715876f}, {-0.88498764f, -0.46561452f}, +{-0.89100652f, -0.45399050f}, {-0.89687274f, -0.44228869f}, +{-0.90258528f, -0.43051110f}, {-0.90814317f, -0.41865974f}, +{-0.91354546f, -0.40673664f}, {-0.91879121f, -0.39474386f}, +{-0.92387953f, -0.38268343f}, {-0.92880955f, -0.37055744f}, +{-0.93358043f, -0.35836795f}, {-0.93819134f, -0.34611706f}, +{-0.94264149f, -0.33380686f}, {-0.94693013f, -0.32143947f}, +{-0.95105652f, -0.30901699f}, {-0.95501994f, -0.29654157f}, +{-0.95881973f, -0.28401534f}, {-0.96245524f, -0.27144045f}, +{-0.96592583f, -0.25881905f}, {-0.96923091f, -0.24615329f}, +{-0.97236992f, -0.23344536f}, {-0.97534232f, -0.22069744f}, +{-0.97814760f, -0.20791169f}, {-0.98078528f, -0.19509032f}, +{-0.98325491f, -0.18223553f}, {-0.98555606f, -0.16934950f}, +{-0.98768834f, -0.15643447f}, {-0.98965139f, -0.14349262f}, +{-0.99144486f, -0.13052619f}, {-0.99306846f, -0.11753740f}, +{-0.99452190f, -0.10452846f}, {-0.99580493f, -0.091501619f}, +{-0.99691733f, -0.078459096f}, {-0.99785892f, -0.065403129f}, +{-0.99862953f, -0.052335956f}, {-0.99922904f, -0.039259816f}, +{-0.99965732f, -0.026176948f}, {-0.99991433f, -0.013089596f}, +{-1.0000000f, -1.2246064e-16f}, {-0.99991433f, 0.013089596f}, +{-0.99965732f, 0.026176948f}, {-0.99922904f, 0.039259816f}, +{-0.99862953f, 0.052335956f}, {-0.99785892f, 0.065403129f}, +{-0.99691733f, 0.078459096f}, {-0.99580493f, 0.091501619f}, +{-0.99452190f, 0.10452846f}, {-0.99306846f, 0.11753740f}, +{-0.99144486f, 0.13052619f}, {-0.98965139f, 0.14349262f}, +{-0.98768834f, 0.15643447f}, {-0.98555606f, 0.16934950f}, +{-0.98325491f, 0.18223553f}, {-0.98078528f, 0.19509032f}, +{-0.97814760f, 0.20791169f}, {-0.97534232f, 0.22069744f}, +{-0.97236992f, 0.23344536f}, {-0.96923091f, 0.24615329f}, +{-0.96592583f, 0.25881905f}, {-0.96245524f, 0.27144045f}, +{-0.95881973f, 0.28401534f}, {-0.95501994f, 0.29654157f}, +{-0.95105652f, 0.30901699f}, {-0.94693013f, 0.32143947f}, +{-0.94264149f, 0.33380686f}, {-0.93819134f, 0.34611706f}, +{-0.93358043f, 0.35836795f}, {-0.92880955f, 0.37055744f}, +{-0.92387953f, 0.38268343f}, {-0.91879121f, 0.39474386f}, +{-0.91354546f, 0.40673664f}, {-0.90814317f, 0.41865974f}, +{-0.90258528f, 0.43051110f}, {-0.89687274f, 0.44228869f}, +{-0.89100652f, 0.45399050f}, {-0.88498764f, 0.46561452f}, +{-0.87881711f, 0.47715876f}, {-0.87249601f, 0.48862124f}, +{-0.86602540f, 0.50000000f}, {-0.85940641f, 0.51129309f}, +{-0.85264016f, 0.52249856f}, {-0.84572782f, 0.53361452f}, +{-0.83867057f, 0.54463904f}, {-0.83146961f, 0.55557023f}, +{-0.82412619f, 0.56640624f}, {-0.81664156f, 0.57714519f}, +{-0.80901699f, 0.58778525f}, {-0.80125381f, 0.59832460f}, +{-0.79335334f, 0.60876143f}, {-0.78531693f, 0.61909395f}, +{-0.77714596f, 0.62932039f}, {-0.76884183f, 0.63943900f}, +{-0.76040597f, 0.64944805f}, {-0.75183981f, 0.65934582f}, +{-0.74314483f, 0.66913061f}, {-0.73432251f, 0.67880075f}, +{-0.72537437f, 0.68835458f}, {-0.71630194f, 0.69779046f}, +{-0.70710678f, 0.70710678f}, {-0.69779046f, 0.71630194f}, +{-0.68835458f, 0.72537437f}, {-0.67880075f, 0.73432251f}, +{-0.66913061f, 0.74314483f}, {-0.65934582f, 0.75183981f}, +{-0.64944805f, 0.76040597f}, {-0.63943900f, 0.76884183f}, +{-0.62932039f, 0.77714596f}, {-0.61909395f, 0.78531693f}, +{-0.60876143f, 0.79335334f}, {-0.59832460f, 0.80125381f}, +{-0.58778525f, 0.80901699f}, {-0.57714519f, 0.81664156f}, +{-0.56640624f, 0.82412619f}, {-0.55557023f, 0.83146961f}, +{-0.54463904f, 0.83867057f}, {-0.53361452f, 0.84572782f}, +{-0.52249856f, 0.85264016f}, {-0.51129309f, 0.85940641f}, +{-0.50000000f, 0.86602540f}, {-0.48862124f, 0.87249601f}, +{-0.47715876f, 0.87881711f}, {-0.46561452f, 0.88498764f}, +{-0.45399050f, 0.89100652f}, {-0.44228869f, 0.89687274f}, +{-0.43051110f, 0.90258528f}, {-0.41865974f, 0.90814317f}, +{-0.40673664f, 0.91354546f}, {-0.39474386f, 0.91879121f}, +{-0.38268343f, 0.92387953f}, {-0.37055744f, 0.92880955f}, +{-0.35836795f, 0.93358043f}, {-0.34611706f, 0.93819134f}, +{-0.33380686f, 0.94264149f}, {-0.32143947f, 0.94693013f}, +{-0.30901699f, 0.95105652f}, {-0.29654157f, 0.95501994f}, +{-0.28401534f, 0.95881973f}, {-0.27144045f, 0.96245524f}, +{-0.25881905f, 0.96592583f}, {-0.24615329f, 0.96923091f}, +{-0.23344536f, 0.97236992f}, {-0.22069744f, 0.97534232f}, +{-0.20791169f, 0.97814760f}, {-0.19509032f, 0.98078528f}, +{-0.18223553f, 0.98325491f}, {-0.16934950f, 0.98555606f}, +{-0.15643447f, 0.98768834f}, {-0.14349262f, 0.98965139f}, +{-0.13052619f, 0.99144486f}, {-0.11753740f, 0.99306846f}, +{-0.10452846f, 0.99452190f}, {-0.091501619f, 0.99580493f}, +{-0.078459096f, 0.99691733f}, {-0.065403129f, 0.99785892f}, +{-0.052335956f, 0.99862953f}, {-0.039259816f, 0.99922904f}, +{-0.026176948f, 0.99965732f}, {-0.013089596f, 0.99991433f}, +{-1.8369095e-16f, 1.0000000f}, {0.013089596f, 0.99991433f}, +{0.026176948f, 0.99965732f}, {0.039259816f, 0.99922904f}, +{0.052335956f, 0.99862953f}, {0.065403129f, 0.99785892f}, +{0.078459096f, 0.99691733f}, {0.091501619f, 0.99580493f}, +{0.10452846f, 0.99452190f}, {0.11753740f, 0.99306846f}, +{0.13052619f, 0.99144486f}, {0.14349262f, 0.98965139f}, +{0.15643447f, 0.98768834f}, {0.16934950f, 0.98555606f}, +{0.18223553f, 0.98325491f}, {0.19509032f, 0.98078528f}, +{0.20791169f, 0.97814760f}, {0.22069744f, 0.97534232f}, +{0.23344536f, 0.97236992f}, {0.24615329f, 0.96923091f}, +{0.25881905f, 0.96592583f}, {0.27144045f, 0.96245524f}, +{0.28401534f, 0.95881973f}, {0.29654157f, 0.95501994f}, +{0.30901699f, 0.95105652f}, {0.32143947f, 0.94693013f}, +{0.33380686f, 0.94264149f}, {0.34611706f, 0.93819134f}, +{0.35836795f, 0.93358043f}, {0.37055744f, 0.92880955f}, +{0.38268343f, 0.92387953f}, {0.39474386f, 0.91879121f}, +{0.40673664f, 0.91354546f}, {0.41865974f, 0.90814317f}, +{0.43051110f, 0.90258528f}, {0.44228869f, 0.89687274f}, +{0.45399050f, 0.89100652f}, {0.46561452f, 0.88498764f}, +{0.47715876f, 0.87881711f}, {0.48862124f, 0.87249601f}, +{0.50000000f, 0.86602540f}, {0.51129309f, 0.85940641f}, +{0.52249856f, 0.85264016f}, {0.53361452f, 0.84572782f}, +{0.54463904f, 0.83867057f}, {0.55557023f, 0.83146961f}, +{0.56640624f, 0.82412619f}, {0.57714519f, 0.81664156f}, +{0.58778525f, 0.80901699f}, {0.59832460f, 0.80125381f}, +{0.60876143f, 0.79335334f}, {0.61909395f, 0.78531693f}, +{0.62932039f, 0.77714596f}, {0.63943900f, 0.76884183f}, +{0.64944805f, 0.76040597f}, {0.65934582f, 0.75183981f}, +{0.66913061f, 0.74314483f}, {0.67880075f, 0.73432251f}, +{0.68835458f, 0.72537437f}, {0.69779046f, 0.71630194f}, +{0.70710678f, 0.70710678f}, {0.71630194f, 0.69779046f}, +{0.72537437f, 0.68835458f}, {0.73432251f, 0.67880075f}, +{0.74314483f, 0.66913061f}, {0.75183981f, 0.65934582f}, +{0.76040597f, 0.64944805f}, {0.76884183f, 0.63943900f}, +{0.77714596f, 0.62932039f}, {0.78531693f, 0.61909395f}, +{0.79335334f, 0.60876143f}, {0.80125381f, 0.59832460f}, +{0.80901699f, 0.58778525f}, {0.81664156f, 0.57714519f}, +{0.82412619f, 0.56640624f}, {0.83146961f, 0.55557023f}, +{0.83867057f, 0.54463904f}, {0.84572782f, 0.53361452f}, +{0.85264016f, 0.52249856f}, {0.85940641f, 0.51129309f}, +{0.86602540f, 0.50000000f}, {0.87249601f, 0.48862124f}, +{0.87881711f, 0.47715876f}, {0.88498764f, 0.46561452f}, +{0.89100652f, 0.45399050f}, {0.89687274f, 0.44228869f}, +{0.90258528f, 0.43051110f}, {0.90814317f, 0.41865974f}, +{0.91354546f, 0.40673664f}, {0.91879121f, 0.39474386f}, +{0.92387953f, 0.38268343f}, {0.92880955f, 0.37055744f}, +{0.93358043f, 0.35836795f}, {0.93819134f, 0.34611706f}, +{0.94264149f, 0.33380686f}, {0.94693013f, 0.32143947f}, +{0.95105652f, 0.30901699f}, {0.95501994f, 0.29654157f}, +{0.95881973f, 0.28401534f}, {0.96245524f, 0.27144045f}, +{0.96592583f, 0.25881905f}, {0.96923091f, 0.24615329f}, +{0.97236992f, 0.23344536f}, {0.97534232f, 0.22069744f}, +{0.97814760f, 0.20791169f}, {0.98078528f, 0.19509032f}, +{0.98325491f, 0.18223553f}, {0.98555606f, 0.16934950f}, +{0.98768834f, 0.15643447f}, {0.98965139f, 0.14349262f}, +{0.99144486f, 0.13052619f}, {0.99306846f, 0.11753740f}, +{0.99452190f, 0.10452846f}, {0.99580493f, 0.091501619f}, +{0.99691733f, 0.078459096f}, {0.99785892f, 0.065403129f}, +{0.99862953f, 0.052335956f}, {0.99922904f, 0.039259816f}, +{0.99965732f, 0.026176948f}, {0.99991433f, 0.013089596f}, +}; +#ifndef FFT_BITREV480 +#define FFT_BITREV480 +static const opus_int16 fft_bitrev480[480] = { +0, 96, 192, 288, 384, 32, 128, 224, 320, 416, 64, 160, 256, 352, 448, +8, 104, 200, 296, 392, 40, 136, 232, 328, 424, 72, 168, 264, 360, 456, +16, 112, 208, 304, 400, 48, 144, 240, 336, 432, 80, 176, 272, 368, 464, +24, 120, 216, 312, 408, 56, 152, 248, 344, 440, 88, 184, 280, 376, 472, +4, 100, 196, 292, 388, 36, 132, 228, 324, 420, 68, 164, 260, 356, 452, +12, 108, 204, 300, 396, 44, 140, 236, 332, 428, 76, 172, 268, 364, 460, +20, 116, 212, 308, 404, 52, 148, 244, 340, 436, 84, 180, 276, 372, 468, +28, 124, 220, 316, 412, 60, 156, 252, 348, 444, 92, 188, 284, 380, 476, +1, 97, 193, 289, 385, 33, 129, 225, 321, 417, 65, 161, 257, 353, 449, +9, 105, 201, 297, 393, 41, 137, 233, 329, 425, 73, 169, 265, 361, 457, +17, 113, 209, 305, 401, 49, 145, 241, 337, 433, 81, 177, 273, 369, 465, +25, 121, 217, 313, 409, 57, 153, 249, 345, 441, 89, 185, 281, 377, 473, +5, 101, 197, 293, 389, 37, 133, 229, 325, 421, 69, 165, 261, 357, 453, +13, 109, 205, 301, 397, 45, 141, 237, 333, 429, 77, 173, 269, 365, 461, +21, 117, 213, 309, 405, 53, 149, 245, 341, 437, 85, 181, 277, 373, 469, +29, 125, 221, 317, 413, 61, 157, 253, 349, 445, 93, 189, 285, 381, 477, +2, 98, 194, 290, 386, 34, 130, 226, 322, 418, 66, 162, 258, 354, 450, +10, 106, 202, 298, 394, 42, 138, 234, 330, 426, 74, 170, 266, 362, 458, +18, 114, 210, 306, 402, 50, 146, 242, 338, 434, 82, 178, 274, 370, 466, +26, 122, 218, 314, 410, 58, 154, 250, 346, 442, 90, 186, 282, 378, 474, +6, 102, 198, 294, 390, 38, 134, 230, 326, 422, 70, 166, 262, 358, 454, +14, 110, 206, 302, 398, 46, 142, 238, 334, 430, 78, 174, 270, 366, 462, +22, 118, 214, 310, 406, 54, 150, 246, 342, 438, 86, 182, 278, 374, 470, +30, 126, 222, 318, 414, 62, 158, 254, 350, 446, 94, 190, 286, 382, 478, +3, 99, 195, 291, 387, 35, 131, 227, 323, 419, 67, 163, 259, 355, 451, +11, 107, 203, 299, 395, 43, 139, 235, 331, 427, 75, 171, 267, 363, 459, +19, 115, 211, 307, 403, 51, 147, 243, 339, 435, 83, 179, 275, 371, 467, +27, 123, 219, 315, 411, 59, 155, 251, 347, 443, 91, 187, 283, 379, 475, +7, 103, 199, 295, 391, 39, 135, 231, 327, 423, 71, 167, 263, 359, 455, +15, 111, 207, 303, 399, 47, 143, 239, 335, 431, 79, 175, 271, 367, 463, +23, 119, 215, 311, 407, 55, 151, 247, 343, 439, 87, 183, 279, 375, 471, +31, 127, 223, 319, 415, 63, 159, 255, 351, 447, 95, 191, 287, 383, 479, +}; +#endif + +#ifndef FFT_BITREV240 +#define FFT_BITREV240 +static const opus_int16 fft_bitrev240[240] = { +0, 48, 96, 144, 192, 16, 64, 112, 160, 208, 32, 80, 128, 176, 224, +4, 52, 100, 148, 196, 20, 68, 116, 164, 212, 36, 84, 132, 180, 228, +8, 56, 104, 152, 200, 24, 72, 120, 168, 216, 40, 88, 136, 184, 232, +12, 60, 108, 156, 204, 28, 76, 124, 172, 220, 44, 92, 140, 188, 236, +1, 49, 97, 145, 193, 17, 65, 113, 161, 209, 33, 81, 129, 177, 225, +5, 53, 101, 149, 197, 21, 69, 117, 165, 213, 37, 85, 133, 181, 229, +9, 57, 105, 153, 201, 25, 73, 121, 169, 217, 41, 89, 137, 185, 233, +13, 61, 109, 157, 205, 29, 77, 125, 173, 221, 45, 93, 141, 189, 237, +2, 50, 98, 146, 194, 18, 66, 114, 162, 210, 34, 82, 130, 178, 226, +6, 54, 102, 150, 198, 22, 70, 118, 166, 214, 38, 86, 134, 182, 230, +10, 58, 106, 154, 202, 26, 74, 122, 170, 218, 42, 90, 138, 186, 234, +14, 62, 110, 158, 206, 30, 78, 126, 174, 222, 46, 94, 142, 190, 238, +3, 51, 99, 147, 195, 19, 67, 115, 163, 211, 35, 83, 131, 179, 227, +7, 55, 103, 151, 199, 23, 71, 119, 167, 215, 39, 87, 135, 183, 231, +11, 59, 107, 155, 203, 27, 75, 123, 171, 219, 43, 91, 139, 187, 235, +15, 63, 111, 159, 207, 31, 79, 127, 175, 223, 47, 95, 143, 191, 239, +}; +#endif + +#ifndef FFT_BITREV120 +#define FFT_BITREV120 +static const opus_int16 fft_bitrev120[120] = { +0, 24, 48, 72, 96, 8, 32, 56, 80, 104, 16, 40, 64, 88, 112, +4, 28, 52, 76, 100, 12, 36, 60, 84, 108, 20, 44, 68, 92, 116, +1, 25, 49, 73, 97, 9, 33, 57, 81, 105, 17, 41, 65, 89, 113, +5, 29, 53, 77, 101, 13, 37, 61, 85, 109, 21, 45, 69, 93, 117, +2, 26, 50, 74, 98, 10, 34, 58, 82, 106, 18, 42, 66, 90, 114, +6, 30, 54, 78, 102, 14, 38, 62, 86, 110, 22, 46, 70, 94, 118, +3, 27, 51, 75, 99, 11, 35, 59, 83, 107, 19, 43, 67, 91, 115, +7, 31, 55, 79, 103, 15, 39, 63, 87, 111, 23, 47, 71, 95, 119, +}; +#endif + +#ifndef FFT_BITREV60 +#define FFT_BITREV60 +static const opus_int16 fft_bitrev60[60] = { +0, 12, 24, 36, 48, 4, 16, 28, 40, 52, 8, 20, 32, 44, 56, +1, 13, 25, 37, 49, 5, 17, 29, 41, 53, 9, 21, 33, 45, 57, +2, 14, 26, 38, 50, 6, 18, 30, 42, 54, 10, 22, 34, 46, 58, +3, 15, 27, 39, 51, 7, 19, 31, 43, 55, 11, 23, 35, 47, 59, +}; +#endif + +#ifndef FFT_STATE48000_960_0 +#define FFT_STATE48000_960_0 +static const kiss_fft_state fft_state48000_960_0 = { +480, /* nfft */ +0.002083333f, /* scale */ +-1, /* shift */ +{5, 96, 3, 32, 4, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev480, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_480, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_1 +#define FFT_STATE48000_960_1 +static const kiss_fft_state fft_state48000_960_1 = { +240, /* nfft */ +0.004166667f, /* scale */ +1, /* shift */ +{5, 48, 3, 16, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev240, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_240, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_2 +#define FFT_STATE48000_960_2 +static const kiss_fft_state fft_state48000_960_2 = { +120, /* nfft */ +0.008333333f, /* scale */ +2, /* shift */ +{5, 24, 3, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev120, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_120, +#else +NULL, +#endif +}; +#endif + +#ifndef FFT_STATE48000_960_3 +#define FFT_STATE48000_960_3 +static const kiss_fft_state fft_state48000_960_3 = { +60, /* nfft */ +0.016666667f, /* scale */ +3, /* shift */ +{5, 12, 3, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ +fft_bitrev60, /* bitrev */ +fft_twiddles48000_960, /* bitrev */ +#ifdef OVERRIDE_FFT +(arch_fft_state *)&cfg_arch_60, +#else +NULL, +#endif +}; +#endif + +#endif + +#ifndef MDCT_TWIDDLES960 +#define MDCT_TWIDDLES960 +static const opus_val16 mdct_twiddles960[1800] = { +0.99999994f, 0.99999321f, 0.99997580f, 0.99994773f, 0.99990886f, +0.99985933f, 0.99979913f, 0.99972820f, 0.99964654f, 0.99955416f, +0.99945110f, 0.99933738f, 0.99921292f, 0.99907774f, 0.99893188f, +0.99877530f, 0.99860805f, 0.99843007f, 0.99824142f, 0.99804211f, +0.99783206f, 0.99761140f, 0.99737996f, 0.99713790f, 0.99688518f, +0.99662173f, 0.99634761f, 0.99606287f, 0.99576741f, 0.99546129f, +0.99514455f, 0.99481714f, 0.99447906f, 0.99413031f, 0.99377096f, +0.99340093f, 0.99302030f, 0.99262899f, 0.99222708f, 0.99181455f, +0.99139136f, 0.99095762f, 0.99051321f, 0.99005818f, 0.98959261f, +0.98911643f, 0.98862964f, 0.98813224f, 0.98762429f, 0.98710573f, +0.98657662f, 0.98603696f, 0.98548669f, 0.98492593f, 0.98435456f, +0.98377270f, 0.98318028f, 0.98257732f, 0.98196387f, 0.98133987f, +0.98070538f, 0.98006040f, 0.97940493f, 0.97873890f, 0.97806245f, +0.97737551f, 0.97667813f, 0.97597027f, 0.97525197f, 0.97452319f, +0.97378403f, 0.97303438f, 0.97227436f, 0.97150391f, 0.97072303f, +0.96993178f, 0.96913016f, 0.96831810f, 0.96749574f, 0.96666300f, +0.96581990f, 0.96496642f, 0.96410263f, 0.96322852f, 0.96234411f, +0.96144938f, 0.96054435f, 0.95962906f, 0.95870346f, 0.95776761f, +0.95682150f, 0.95586514f, 0.95489854f, 0.95392174f, 0.95293468f, +0.95193744f, 0.95093000f, 0.94991243f, 0.94888461f, 0.94784665f, +0.94679856f, 0.94574034f, 0.94467193f, 0.94359344f, 0.94250488f, +0.94140619f, 0.94029742f, 0.93917859f, 0.93804967f, 0.93691075f, +0.93576175f, 0.93460274f, 0.93343377f, 0.93225473f, 0.93106574f, +0.92986679f, 0.92865789f, 0.92743903f, 0.92621022f, 0.92497152f, +0.92372292f, 0.92246443f, 0.92119598f, 0.91991776f, 0.91862965f, +0.91733170f, 0.91602397f, 0.91470635f, 0.91337901f, 0.91204184f, +0.91069490f, 0.90933824f, 0.90797186f, 0.90659571f, 0.90520984f, +0.90381432f, 0.90240908f, 0.90099424f, 0.89956969f, 0.89813554f, +0.89669174f, 0.89523834f, 0.89377540f, 0.89230281f, 0.89082074f, +0.88932908f, 0.88782793f, 0.88631725f, 0.88479710f, 0.88326746f, +0.88172835f, 0.88017982f, 0.87862182f, 0.87705445f, 0.87547767f, +0.87389153f, 0.87229604f, 0.87069118f, 0.86907703f, 0.86745358f, +0.86582077f, 0.86417878f, 0.86252749f, 0.86086690f, 0.85919720f, +0.85751826f, 0.85583007f, 0.85413277f, 0.85242635f, 0.85071075f, +0.84898609f, 0.84725231f, 0.84550947f, 0.84375757f, 0.84199661f, +0.84022665f, 0.83844769f, 0.83665979f, 0.83486289f, 0.83305705f, +0.83124226f, 0.82941860f, 0.82758605f, 0.82574469f, 0.82389444f, +0.82203537f, 0.82016748f, 0.81829083f, 0.81640542f, 0.81451124f, +0.81260836f, 0.81069672f, 0.80877650f, 0.80684757f, 0.80490994f, +0.80296379f, 0.80100900f, 0.79904562f, 0.79707366f, 0.79509324f, +0.79310423f, 0.79110676f, 0.78910083f, 0.78708643f, 0.78506362f, +0.78303236f, 0.78099275f, 0.77894479f, 0.77688843f, 0.77482378f, +0.77275085f, 0.77066964f, 0.76858020f, 0.76648247f, 0.76437658f, +0.76226246f, 0.76014024f, 0.75800985f, 0.75587130f, 0.75372469f, +0.75157005f, 0.74940729f, 0.74723655f, 0.74505776f, 0.74287105f, +0.74067634f, 0.73847371f, 0.73626316f, 0.73404479f, 0.73181850f, +0.72958434f, 0.72734243f, 0.72509271f, 0.72283524f, 0.72057003f, +0.71829706f, 0.71601641f, 0.71372813f, 0.71143216f, 0.70912862f, +0.70681745f, 0.70449871f, 0.70217246f, 0.69983864f, 0.69749737f, +0.69514859f, 0.69279242f, 0.69042879f, 0.68805778f, 0.68567938f, +0.68329364f, 0.68090063f, 0.67850029f, 0.67609268f, 0.67367786f, +0.67125577f, 0.66882652f, 0.66639012f, 0.66394657f, 0.66149592f, +0.65903819f, 0.65657341f, 0.65410155f, 0.65162271f, 0.64913690f, +0.64664418f, 0.64414448f, 0.64163786f, 0.63912445f, 0.63660413f, +0.63407701f, 0.63154310f, 0.62900239f, 0.62645501f, 0.62390089f, +0.62134010f, 0.61877263f, 0.61619854f, 0.61361790f, 0.61103064f, +0.60843682f, 0.60583651f, 0.60322970f, 0.60061646f, 0.59799677f, +0.59537065f, 0.59273821f, 0.59009939f, 0.58745426f, 0.58480281f, +0.58214509f, 0.57948118f, 0.57681108f, 0.57413477f, 0.57145232f, +0.56876373f, 0.56606907f, 0.56336832f, 0.56066155f, 0.55794877f, +0.55523002f, 0.55250537f, 0.54977477f, 0.54703826f, 0.54429591f, +0.54154772f, 0.53879374f, 0.53603399f, 0.53326851f, 0.53049731f, +0.52772039f, 0.52493787f, 0.52214974f, 0.51935595f, 0.51655668f, +0.51375180f, 0.51094145f, 0.50812566f, 0.50530440f, 0.50247771f, +0.49964568f, 0.49680826f, 0.49396557f, 0.49111754f, 0.48826426f, +0.48540577f, 0.48254207f, 0.47967321f, 0.47679919f, 0.47392011f, +0.47103590f, 0.46814668f, 0.46525243f, 0.46235323f, 0.45944905f, +0.45653993f, 0.45362595f, 0.45070711f, 0.44778344f, 0.44485497f, +0.44192174f, 0.43898380f, 0.43604112f, 0.43309379f, 0.43014181f, +0.42718524f, 0.42422408f, 0.42125839f, 0.41828820f, 0.41531351f, +0.41233435f, 0.40935081f, 0.40636289f, 0.40337059f, 0.40037400f, +0.39737311f, 0.39436796f, 0.39135858f, 0.38834500f, 0.38532731f, +0.38230544f, 0.37927949f, 0.37624949f, 0.37321547f, 0.37017745f, +0.36713544f, 0.36408952f, 0.36103970f, 0.35798600f, 0.35492846f, +0.35186714f, 0.34880206f, 0.34573323f, 0.34266070f, 0.33958447f, +0.33650464f, 0.33342120f, 0.33033419f, 0.32724363f, 0.32414958f, +0.32105204f, 0.31795108f, 0.31484672f, 0.31173897f, 0.30862790f, +0.30551350f, 0.30239585f, 0.29927495f, 0.29615086f, 0.29302359f, +0.28989318f, 0.28675964f, 0.28362307f, 0.28048345f, 0.27734083f, +0.27419522f, 0.27104670f, 0.26789525f, 0.26474094f, 0.26158381f, +0.25842386f, 0.25526115f, 0.25209570f, 0.24892756f, 0.24575676f, +0.24258332f, 0.23940729f, 0.23622867f, 0.23304754f, 0.22986393f, +0.22667783f, 0.22348931f, 0.22029841f, 0.21710514f, 0.21390954f, +0.21071166f, 0.20751151f, 0.20430915f, 0.20110460f, 0.19789790f, +0.19468907f, 0.19147816f, 0.18826519f, 0.18505022f, 0.18183327f, +0.17861435f, 0.17539354f, 0.17217083f, 0.16894630f, 0.16571994f, +0.16249183f, 0.15926196f, 0.15603039f, 0.15279715f, 0.14956227f, +0.14632578f, 0.14308774f, 0.13984816f, 0.13660708f, 0.13336454f, +0.13012058f, 0.12687522f, 0.12362850f, 0.12038045f, 0.11713112f, +0.11388054f, 0.11062872f, 0.10737573f, 0.10412160f, 0.10086634f, +0.097609997f, 0.094352618f, 0.091094226f, 0.087834857f, 0.084574550f, +0.081313334f, 0.078051247f, 0.074788325f, 0.071524605f, 0.068260118f, +0.064994894f, 0.061728980f, 0.058462404f, 0.055195201f, 0.051927410f, +0.048659060f, 0.045390189f, 0.042120833f, 0.038851023f, 0.035580799f, +0.032310195f, 0.029039243f, 0.025767982f, 0.022496443f, 0.019224664f, +0.015952680f, 0.012680525f, 0.0094082337f, 0.0061358409f, 0.0028633832f, +-0.00040910527f, -0.0036815894f, -0.0069540343f, -0.010226404f, -0.013498665f, +-0.016770782f, -0.020042717f, -0.023314439f, -0.026585912f, -0.029857099f, +-0.033127967f, -0.036398482f, -0.039668605f, -0.042938303f, -0.046207540f, +-0.049476285f, -0.052744497f, -0.056012146f, -0.059279196f, -0.062545612f, +-0.065811358f, -0.069076397f, -0.072340697f, -0.075604223f, -0.078866936f, +-0.082128808f, -0.085389800f, -0.088649876f, -0.091909006f, -0.095167145f, +-0.098424271f, -0.10168034f, -0.10493532f, -0.10818918f, -0.11144188f, +-0.11469338f, -0.11794366f, -0.12119267f, -0.12444039f, -0.12768677f, +-0.13093179f, -0.13417540f, -0.13741758f, -0.14065829f, -0.14389749f, +-0.14713514f, -0.15037122f, -0.15360570f, -0.15683852f, -0.16006967f, +-0.16329910f, -0.16652679f, -0.16975269f, -0.17297678f, -0.17619900f, +-0.17941935f, -0.18263777f, -0.18585424f, -0.18906870f, -0.19228116f, +-0.19549155f, -0.19869985f, -0.20190603f, -0.20511003f, -0.20831184f, +-0.21151142f, -0.21470875f, -0.21790376f, -0.22109644f, -0.22428675f, +-0.22747467f, -0.23066014f, -0.23384315f, -0.23702365f, -0.24020162f, +-0.24337701f, -0.24654980f, -0.24971995f, -0.25288740f, -0.25605217f, +-0.25921419f, -0.26237345f, -0.26552987f, -0.26868346f, -0.27183419f, +-0.27498198f, -0.27812684f, -0.28126872f, -0.28440759f, -0.28754342f, +-0.29067615f, -0.29380578f, -0.29693225f, -0.30005556f, -0.30317566f, +-0.30629250f, -0.30940607f, -0.31251630f, -0.31562322f, -0.31872672f, +-0.32182685f, -0.32492352f, -0.32801670f, -0.33110636f, -0.33419248f, +-0.33727503f, -0.34035397f, -0.34342924f, -0.34650084f, -0.34956875f, +-0.35263291f, -0.35569328f, -0.35874987f, -0.36180258f, -0.36485144f, +-0.36789638f, -0.37093741f, -0.37397444f, -0.37700745f, -0.38003644f, +-0.38306138f, -0.38608220f, -0.38909888f, -0.39211139f, -0.39511973f, +-0.39812380f, -0.40112361f, -0.40411916f, -0.40711036f, -0.41009718f, +-0.41307965f, -0.41605768f, -0.41903123f, -0.42200032f, -0.42496487f, +-0.42792490f, -0.43088034f, -0.43383113f, -0.43677729f, -0.43971881f, +-0.44265559f, -0.44558764f, -0.44851488f, -0.45143735f, -0.45435500f, +-0.45726776f, -0.46017563f, -0.46307856f, -0.46597654f, -0.46886954f, +-0.47175750f, -0.47464043f, -0.47751826f, -0.48039100f, -0.48325855f, +-0.48612097f, -0.48897815f, -0.49183011f, -0.49467680f, -0.49751821f, +-0.50035429f, -0.50318497f, -0.50601029f, -0.50883019f, -0.51164466f, +-0.51445359f, -0.51725709f, -0.52005500f, -0.52284735f, -0.52563411f, +-0.52841520f, -0.53119069f, -0.53396046f, -0.53672451f, -0.53948283f, +-0.54223537f, -0.54498214f, -0.54772300f, -0.55045801f, -0.55318713f, +-0.55591035f, -0.55862761f, -0.56133890f, -0.56404412f, -0.56674337f, +-0.56943649f, -0.57212353f, -0.57480448f, -0.57747924f, -0.58014780f, +-0.58281022f, -0.58546633f, -0.58811617f, -0.59075975f, -0.59339696f, +-0.59602785f, -0.59865236f, -0.60127044f, -0.60388207f, -0.60648727f, +-0.60908598f, -0.61167812f, -0.61426371f, -0.61684275f, -0.61941516f, +-0.62198097f, -0.62454009f, -0.62709254f, -0.62963831f, -0.63217729f, +-0.63470948f, -0.63723493f, -0.63975352f, -0.64226526f, -0.64477009f, +-0.64726806f, -0.64975911f, -0.65224314f, -0.65472025f, -0.65719032f, +-0.65965337f, -0.66210932f, -0.66455823f, -0.66700000f, -0.66943461f, +-0.67186207f, -0.67428231f, -0.67669535f, -0.67910111f, -0.68149966f, +-0.68389088f, -0.68627477f, -0.68865126f, -0.69102043f, -0.69338220f, +-0.69573659f, -0.69808346f, -0.70042288f, -0.70275480f, -0.70507920f, +-0.70739603f, -0.70970529f, -0.71200693f, -0.71430099f, -0.71658736f, +-0.71886611f, -0.72113711f, -0.72340041f, -0.72565591f, -0.72790372f, +-0.73014367f, -0.73237586f, -0.73460019f, -0.73681659f, -0.73902518f, +-0.74122584f, -0.74341851f, -0.74560326f, -0.74778003f, -0.74994880f, +-0.75210953f, -0.75426215f, -0.75640678f, -0.75854325f, -0.76067162f, +-0.76279181f, -0.76490390f, -0.76700771f, -0.76910341f, -0.77119076f, +-0.77326995f, -0.77534080f, -0.77740335f, -0.77945763f, -0.78150350f, +-0.78354102f, -0.78557014f, -0.78759086f, -0.78960317f, -0.79160696f, +-0.79360235f, -0.79558921f, -0.79756755f, -0.79953730f, -0.80149853f, +-0.80345118f, -0.80539525f, -0.80733067f, -0.80925739f, -0.81117553f, +-0.81308490f, -0.81498563f, -0.81687760f, -0.81876087f, -0.82063532f, +-0.82250100f, -0.82435787f, -0.82620591f, -0.82804507f, -0.82987541f, +-0.83169687f, -0.83350939f, -0.83531296f, -0.83710766f, -0.83889335f, +-0.84067005f, -0.84243774f, -0.84419644f, -0.84594607f, -0.84768665f, +-0.84941816f, -0.85114056f, -0.85285389f, -0.85455805f, -0.85625303f, +-0.85793889f, -0.85961550f, -0.86128294f, -0.86294121f, -0.86459017f, +-0.86622989f, -0.86786032f, -0.86948150f, -0.87109333f, -0.87269586f, +-0.87428904f, -0.87587279f, -0.87744725f, -0.87901229f, -0.88056785f, +-0.88211405f, -0.88365078f, -0.88517809f, -0.88669586f, -0.88820416f, +-0.88970292f, -0.89119220f, -0.89267188f, -0.89414203f, -0.89560264f, +-0.89705360f, -0.89849502f, -0.89992678f, -0.90134889f, -0.90276134f, +-0.90416414f, -0.90555727f, -0.90694070f, -0.90831441f, -0.90967834f, +-0.91103262f, -0.91237706f, -0.91371179f, -0.91503674f, -0.91635185f, +-0.91765714f, -0.91895264f, -0.92023826f, -0.92151409f, -0.92277998f, +-0.92403603f, -0.92528218f, -0.92651838f, -0.92774469f, -0.92896110f, +-0.93016750f, -0.93136400f, -0.93255049f, -0.93372697f, -0.93489349f, +-0.93604994f, -0.93719643f, -0.93833286f, -0.93945926f, -0.94057560f, +-0.94168180f, -0.94277799f, -0.94386405f, -0.94494003f, -0.94600588f, +-0.94706154f, -0.94810712f, -0.94914252f, -0.95016778f, -0.95118284f, +-0.95218778f, -0.95318246f, -0.95416695f, -0.95514119f, -0.95610523f, +-0.95705903f, -0.95800257f, -0.95893586f, -0.95985889f, -0.96077162f, +-0.96167403f, -0.96256620f, -0.96344805f, -0.96431959f, -0.96518075f, +-0.96603161f, -0.96687216f, -0.96770233f, -0.96852213f, -0.96933156f, +-0.97013056f, -0.97091925f, -0.97169751f, -0.97246534f, -0.97322279f, +-0.97396982f, -0.97470641f, -0.97543252f, -0.97614825f, -0.97685349f, +-0.97754824f, -0.97823256f, -0.97890645f, -0.97956979f, -0.98022264f, +-0.98086500f, -0.98149687f, -0.98211825f, -0.98272908f, -0.98332942f, +-0.98391914f, -0.98449844f, -0.98506713f, -0.98562527f, -0.98617285f, +-0.98670989f, -0.98723638f, -0.98775226f, -0.98825759f, -0.98875231f, +-0.98923647f, -0.98971003f, -0.99017298f, -0.99062532f, -0.99106705f, +-0.99149817f, -0.99191868f, -0.99232858f, -0.99272782f, -0.99311644f, +-0.99349445f, -0.99386179f, -0.99421853f, -0.99456459f, -0.99489999f, +-0.99522477f, -0.99553883f, -0.99584228f, -0.99613506f, -0.99641716f, +-0.99668860f, -0.99694937f, -0.99719942f, -0.99743885f, -0.99766755f, +-0.99788558f, -0.99809295f, -0.99828959f, -0.99847561f, -0.99865085f, +-0.99881548f, -0.99896932f, -0.99911255f, -0.99924499f, -0.99936682f, +-0.99947786f, -0.99957830f, -0.99966794f, -0.99974692f, -0.99981517f, +-0.99987274f, -0.99991959f, -0.99995571f, -0.99998116f, -0.99999589f, +0.99999964f, 0.99997288f, 0.99990326f, 0.99979085f, 0.99963558f, +0.99943751f, 0.99919659f, 0.99891287f, 0.99858636f, 0.99821711f, +0.99780506f, 0.99735034f, 0.99685282f, 0.99631262f, 0.99572974f, +0.99510419f, 0.99443603f, 0.99372530f, 0.99297196f, 0.99217612f, +0.99133772f, 0.99045694f, 0.98953366f, 0.98856801f, 0.98756003f, +0.98650974f, 0.98541719f, 0.98428243f, 0.98310548f, 0.98188645f, +0.98062533f, 0.97932225f, 0.97797716f, 0.97659022f, 0.97516143f, +0.97369087f, 0.97217858f, 0.97062469f, 0.96902919f, 0.96739221f, +0.96571374f, 0.96399397f, 0.96223283f, 0.96043050f, 0.95858705f, +0.95670253f, 0.95477700f, 0.95281059f, 0.95080340f, 0.94875544f, +0.94666684f, 0.94453770f, 0.94236809f, 0.94015813f, 0.93790787f, +0.93561745f, 0.93328691f, 0.93091643f, 0.92850608f, 0.92605597f, +0.92356616f, 0.92103678f, 0.91846794f, 0.91585976f, 0.91321236f, +0.91052586f, 0.90780038f, 0.90503591f, 0.90223277f, 0.89939094f, +0.89651060f, 0.89359182f, 0.89063478f, 0.88763964f, 0.88460642f, +0.88153529f, 0.87842643f, 0.87527996f, 0.87209594f, 0.86887461f, +0.86561602f, 0.86232042f, 0.85898781f, 0.85561842f, 0.85221243f, +0.84876984f, 0.84529096f, 0.84177583f, 0.83822471f, 0.83463764f, +0.83101481f, 0.82735640f, 0.82366252f, 0.81993335f, 0.81616908f, +0.81236988f, 0.80853581f, 0.80466717f, 0.80076402f, 0.79682660f, +0.79285502f, 0.78884947f, 0.78481019f, 0.78073722f, 0.77663082f, +0.77249116f, 0.76831841f, 0.76411277f, 0.75987434f, 0.75560343f, +0.75130010f, 0.74696463f, 0.74259710f, 0.73819780f, 0.73376691f, +0.72930455f, 0.72481096f, 0.72028631f, 0.71573079f, 0.71114463f, +0.70652801f, 0.70188117f, 0.69720417f, 0.69249737f, 0.68776089f, +0.68299496f, 0.67819971f, 0.67337549f, 0.66852236f, 0.66364062f, +0.65873051f, 0.65379208f, 0.64882571f, 0.64383155f, 0.63880974f, +0.63376063f, 0.62868434f, 0.62358117f, 0.61845124f, 0.61329484f, +0.60811216f, 0.60290343f, 0.59766883f, 0.59240872f, 0.58712316f, +0.58181250f, 0.57647687f, 0.57111657f, 0.56573176f, 0.56032276f, +0.55488980f, 0.54943299f, 0.54395270f, 0.53844911f, 0.53292239f, +0.52737290f, 0.52180082f, 0.51620632f, 0.51058978f, 0.50495136f, +0.49929130f, 0.49360985f, 0.48790723f, 0.48218375f, 0.47643960f, +0.47067502f, 0.46489030f, 0.45908567f, 0.45326138f, 0.44741765f, +0.44155475f, 0.43567297f, 0.42977250f, 0.42385364f, 0.41791660f, +0.41196167f, 0.40598908f, 0.39999911f, 0.39399201f, 0.38796803f, +0.38192743f, 0.37587047f, 0.36979741f, 0.36370850f, 0.35760403f, +0.35148421f, 0.34534934f, 0.33919969f, 0.33303553f, 0.32685706f, +0.32066461f, 0.31445843f, 0.30823877f, 0.30200592f, 0.29576012f, +0.28950164f, 0.28323078f, 0.27694780f, 0.27065292f, 0.26434645f, +0.25802869f, 0.25169984f, 0.24536023f, 0.23901010f, 0.23264973f, +0.22627939f, 0.21989937f, 0.21350993f, 0.20711134f, 0.20070387f, +0.19428782f, 0.18786344f, 0.18143101f, 0.17499080f, 0.16854310f, +0.16208819f, 0.15562633f, 0.14915779f, 0.14268288f, 0.13620184f, +0.12971498f, 0.12322257f, 0.11672486f, 0.11022217f, 0.10371475f, +0.097202882f, 0.090686858f, 0.084166944f, 0.077643424f, 0.071116582f, +0.064586692f, 0.058054037f, 0.051518895f, 0.044981543f, 0.038442269f, +0.031901345f, 0.025359053f, 0.018815678f, 0.012271495f, 0.0057267868f, +-0.00081816671f, -0.0073630852f, -0.013907688f, -0.020451695f, -0.026994826f, +-0.033536803f, -0.040077340f, -0.046616159f, -0.053152986f, -0.059687532f, +-0.066219524f, -0.072748676f, -0.079274714f, -0.085797355f, -0.092316322f, +-0.098831341f, -0.10534211f, -0.11184838f, -0.11834986f, -0.12484626f, +-0.13133731f, -0.13782275f, -0.14430228f, -0.15077563f, -0.15724251f, +-0.16370267f, -0.17015581f, -0.17660165f, -0.18303993f, -0.18947038f, +-0.19589271f, -0.20230664f, -0.20871192f, -0.21510825f, -0.22149536f, +-0.22787298f, -0.23424086f, -0.24059868f, -0.24694622f, -0.25328314f, +-0.25960925f, -0.26592422f, -0.27222782f, -0.27851975f, -0.28479972f, +-0.29106751f, -0.29732284f, -0.30356544f, -0.30979502f, -0.31601134f, +-0.32221413f, -0.32840309f, -0.33457801f, -0.34073856f, -0.34688455f, +-0.35301566f, -0.35913166f, -0.36523229f, -0.37131724f, -0.37738630f, +-0.38343921f, -0.38947567f, -0.39549544f, -0.40149832f, -0.40748394f, +-0.41345215f, -0.41940263f, -0.42533514f, -0.43124944f, -0.43714526f, +-0.44302234f, -0.44888046f, -0.45471936f, -0.46053877f, -0.46633846f, +-0.47211814f, -0.47787762f, -0.48361665f, -0.48933494f, -0.49503228f, +-0.50070840f, -0.50636309f, -0.51199609f, -0.51760709f, -0.52319598f, +-0.52876246f, -0.53430629f, -0.53982723f, -0.54532504f, -0.55079949f, +-0.55625033f, -0.56167740f, -0.56708032f, -0.57245898f, -0.57781315f, +-0.58314258f, -0.58844697f, -0.59372622f, -0.59897995f, -0.60420811f, +-0.60941035f, -0.61458647f, -0.61973625f, -0.62485951f, -0.62995601f, +-0.63502556f, -0.64006782f, -0.64508271f, -0.65007001f, -0.65502942f, +-0.65996075f, -0.66486382f, -0.66973841f, -0.67458433f, -0.67940134f, +-0.68418926f, -0.68894786f, -0.69367695f, -0.69837630f, -0.70304573f, +-0.70768511f, -0.71229410f, -0.71687263f, -0.72142041f, -0.72593731f, +-0.73042315f, -0.73487765f, -0.73930067f, -0.74369204f, -0.74805158f, +-0.75237900f, -0.75667429f, -0.76093709f, -0.76516730f, -0.76936477f, +-0.77352923f, -0.77766061f, -0.78175867f, -0.78582323f, -0.78985411f, +-0.79385114f, -0.79781419f, -0.80174309f, -0.80563760f, -0.80949765f, +-0.81332302f, -0.81711352f, -0.82086903f, -0.82458937f, -0.82827437f, +-0.83192390f, -0.83553779f, -0.83911592f, -0.84265804f, -0.84616417f, +-0.84963393f, -0.85306740f, -0.85646427f, -0.85982448f, -0.86314780f, +-0.86643422f, -0.86968350f, -0.87289548f, -0.87607014f, -0.87920725f, +-0.88230664f, -0.88536829f, -0.88839203f, -0.89137769f, -0.89432514f, +-0.89723432f, -0.90010506f, -0.90293723f, -0.90573072f, -0.90848541f, +-0.91120118f, -0.91387796f, -0.91651553f, -0.91911387f, -0.92167282f, +-0.92419231f, -0.92667222f, -0.92911243f, -0.93151283f, -0.93387336f, +-0.93619382f, -0.93847424f, -0.94071442f, -0.94291431f, -0.94507378f, +-0.94719279f, -0.94927126f, -0.95130903f, -0.95330608f, -0.95526224f, +-0.95717752f, -0.95905179f, -0.96088499f, -0.96267700f, -0.96442777f, +-0.96613729f, -0.96780539f, -0.96943200f, -0.97101706f, -0.97256058f, +-0.97406244f, -0.97552258f, -0.97694093f, -0.97831738f, -0.97965199f, +-0.98094457f, -0.98219514f, -0.98340368f, -0.98457009f, -0.98569429f, +-0.98677629f, -0.98781598f, -0.98881340f, -0.98976845f, -0.99068111f, +-0.99155134f, -0.99237907f, -0.99316430f, -0.99390697f, -0.99460709f, +-0.99526459f, -0.99587947f, -0.99645168f, -0.99698120f, -0.99746799f, +-0.99791211f, -0.99831343f, -0.99867201f, -0.99898779f, -0.99926084f, +-0.99949104f, -0.99967843f, -0.99982297f, -0.99992472f, -0.99998361f, +0.99999869f, 0.99989158f, 0.99961317f, 0.99916345f, 0.99854255f, +0.99775058f, 0.99678761f, 0.99565387f, 0.99434954f, 0.99287480f, +0.99122995f, 0.98941529f, 0.98743105f, 0.98527765f, 0.98295540f, +0.98046476f, 0.97780609f, 0.97497988f, 0.97198665f, 0.96882683f, +0.96550101f, 0.96200979f, 0.95835376f, 0.95453346f, 0.95054960f, +0.94640291f, 0.94209403f, 0.93762374f, 0.93299282f, 0.92820197f, +0.92325211f, 0.91814411f, 0.91287869f, 0.90745693f, 0.90187967f, +0.89614785f, 0.89026248f, 0.88422459f, 0.87803519f, 0.87169534f, +0.86520612f, 0.85856867f, 0.85178405f, 0.84485358f, 0.83777827f, +0.83055943f, 0.82319832f, 0.81569612f, 0.80805415f, 0.80027372f, +0.79235619f, 0.78430289f, 0.77611518f, 0.76779449f, 0.75934225f, +0.75075996f, 0.74204898f, 0.73321080f, 0.72424710f, 0.71515924f, +0.70594883f, 0.69661748f, 0.68716675f, 0.67759830f, 0.66791373f, +0.65811473f, 0.64820296f, 0.63818014f, 0.62804794f, 0.61780810f, +0.60746247f, 0.59701276f, 0.58646071f, 0.57580817f, 0.56505698f, +0.55420899f, 0.54326600f, 0.53222996f, 0.52110273f, 0.50988621f, +0.49858227f, 0.48719296f, 0.47572014f, 0.46416581f, 0.45253196f, +0.44082057f, 0.42903364f, 0.41717321f, 0.40524128f, 0.39323992f, +0.38117120f, 0.36903715f, 0.35683987f, 0.34458145f, 0.33226398f, +0.31988961f, 0.30746040f, 0.29497850f, 0.28244606f, 0.26986524f, +0.25723818f, 0.24456702f, 0.23185398f, 0.21910121f, 0.20631088f, +0.19348522f, 0.18062639f, 0.16773662f, 0.15481812f, 0.14187308f, +0.12890373f, 0.11591230f, 0.10290100f, 0.089872077f, 0.076827750f, +0.063770257f, 0.050701842f, 0.037624735f, 0.024541186f, 0.011453429f, +-0.0016362892f, -0.014725727f, -0.027812643f, -0.040894791f, -0.053969935f, +-0.067035832f, -0.080090240f, -0.093130924f, -0.10615565f, -0.11916219f, +-0.13214831f, -0.14511178f, -0.15805040f, -0.17096193f, -0.18384418f, +-0.19669491f, -0.20951195f, -0.22229309f, -0.23503613f, -0.24773891f, +-0.26039925f, -0.27301496f, -0.28558388f, -0.29810387f, -0.31057280f, +-0.32298848f, -0.33534884f, -0.34765175f, -0.35989508f, -0.37207675f, +-0.38419467f, -0.39624676f, -0.40823093f, -0.42014518f, -0.43198743f, +-0.44375566f, -0.45544785f, -0.46706200f, -0.47859612f, -0.49004826f, +-0.50141639f, -0.51269865f, -0.52389306f, -0.53499764f, -0.54601061f, +-0.55693001f, -0.56775403f, -0.57848072f, -0.58910829f, -0.59963489f, +-0.61005878f, -0.62037814f, -0.63059121f, -0.64069623f, -0.65069145f, +-0.66057515f, -0.67034572f, -0.68000144f, -0.68954057f, -0.69896162f, +-0.70826286f, -0.71744281f, -0.72649974f, -0.73543227f, -0.74423873f, +-0.75291771f, -0.76146764f, -0.76988715f, -0.77817470f, -0.78632891f, +-0.79434842f, -0.80223179f, -0.80997771f, -0.81758487f, -0.82505190f, +-0.83237761f, -0.83956063f, -0.84659988f, -0.85349399f, -0.86024189f, +-0.86684239f, -0.87329435f, -0.87959671f, -0.88574833f, -0.89174819f, +-0.89759529f, -0.90328854f, -0.90882701f, -0.91420978f, -0.91943592f, +-0.92450452f, -0.92941469f, -0.93416560f, -0.93875647f, -0.94318646f, +-0.94745487f, -0.95156091f, -0.95550388f, -0.95928317f, -0.96289814f, +-0.96634805f, -0.96963239f, -0.97275060f, -0.97570217f, -0.97848648f, +-0.98110318f, -0.98355180f, -0.98583186f, -0.98794299f, -0.98988485f, +-0.99165714f, -0.99325943f, -0.99469161f, -0.99595332f, -0.99704438f, +-0.99796462f, -0.99871385f, -0.99929196f, -0.99969882f, -0.99993443f, +0.99999464f, 0.99956632f, 0.99845290f, 0.99665523f, 0.99417448f, +0.99101239f, 0.98717111f, 0.98265326f, 0.97746199f, 0.97160077f, +0.96507365f, 0.95788515f, 0.95004016f, 0.94154406f, 0.93240267f, +0.92262226f, 0.91220951f, 0.90117162f, 0.88951606f, 0.87725091f, +0.86438453f, 0.85092574f, 0.83688372f, 0.82226819f, 0.80708915f, +0.79135692f, 0.77508235f, 0.75827658f, 0.74095112f, 0.72311783f, +0.70478898f, 0.68597710f, 0.66669506f, 0.64695615f, 0.62677377f, +0.60616189f, 0.58513457f, 0.56370622f, 0.54189157f, 0.51970547f, +0.49716324f, 0.47428027f, 0.45107225f, 0.42755505f, 0.40374488f, +0.37965798f, 0.35531086f, 0.33072025f, 0.30590299f, 0.28087607f, +0.25565663f, 0.23026201f, 0.20470956f, 0.17901683f, 0.15320139f, +0.12728097f, 0.10127331f, 0.075196236f, 0.049067631f, 0.022905400f, +-0.0032725304f, -0.029448219f, -0.055603724f, -0.081721120f, -0.10778251f, +-0.13377003f, -0.15966587f, -0.18545228f, -0.21111161f, -0.23662624f, +-0.26197869f, -0.28715160f, -0.31212771f, -0.33688989f, -0.36142120f, +-0.38570482f, -0.40972409f, -0.43346253f, -0.45690393f, -0.48003218f, +-0.50283146f, -0.52528608f, -0.54738069f, -0.56910020f, -0.59042966f, +-0.61135447f, -0.63186026f, -0.65193301f, -0.67155898f, -0.69072473f, +-0.70941705f, -0.72762316f, -0.74533063f, -0.76252723f, -0.77920127f, +-0.79534131f, -0.81093621f, -0.82597536f, -0.84044844f, -0.85434550f, +-0.86765707f, -0.88037395f, -0.89248747f, -0.90398932f, -0.91487163f, +-0.92512697f, -0.93474823f, -0.94372886f, -0.95206273f, -0.95974404f, +-0.96676767f, -0.97312868f, -0.97882277f, -0.98384601f, -0.98819500f, +-0.99186671f, -0.99485862f, -0.99716878f, -0.99879545f, -0.99973762f, +}; +#endif + +static const CELTMode mode48000_960_120 = { +48000, /* Fs */ +120, /* overlap */ +21, /* nbEBands */ +21, /* effEBands */ +{0.85000610f, 0.0000000f, 1.0000000f, 1.0000000f, }, /* preemph */ +eband5ms, /* eBands */ +3, /* maxLM */ +8, /* nbShortMdcts */ +120, /* shortMdctSize */ +11, /* nbAllocVectors */ +band_allocation, /* allocVectors */ +logN400, /* logN */ +window120, /* window */ +{1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */ +{392, cache_index50, cache_bits50, cache_caps50}, /* cache */ +}; + +/* List of all the available modes */ +#define TOTAL_MODES 1 +static const CELTMode * const static_mode_list[TOTAL_MODES] = { +&mode48000_960_120, +}; diff --git a/external/opus-1.3.1/celt/static_modes_float_arm_ne10.h b/external/opus-1.3.1/celt/static_modes_float_arm_ne10.h new file mode 100644 index 00000000..66e1abb1 --- /dev/null +++ b/external/opus-1.3.1/celt/static_modes_float_arm_ne10.h @@ -0,0 +1,404 @@ +/* The contents of this file was automatically generated by + * dump_mode_arm_ne10.c with arguments: 48000 960 + * It contains static definitions for some pre-defined modes. */ +#include + +#ifndef NE10_FFT_PARAMS48000_960 +#define NE10_FFT_PARAMS48000_960 +static const ne10_int32_t ne10_factors_480[64] = { +4, 40, 4, 30, 2, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }; +static const ne10_int32_t ne10_factors_240[64] = { +3, 20, 4, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }; +static const ne10_int32_t ne10_factors_120[64] = { +3, 10, 2, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }; +static const ne10_int32_t ne10_factors_60[64] = { +2, 5, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }; +static const ne10_fft_cpx_float32_t ne10_twiddles_480[480] = { +{1.0000000f,0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, +{1.0000000f,-0.0000000f}, {0.91354543f,-0.40673664f}, {0.66913056f,-0.74314487f}, +{1.0000000f,-0.0000000f}, {0.66913056f,-0.74314487f}, {-0.10452851f,-0.99452192f}, +{1.0000000f,-0.0000000f}, {0.30901697f,-0.95105654f}, {-0.80901700f,-0.58778518f}, +{1.0000000f,-0.0000000f}, {-0.10452851f,-0.99452192f}, {-0.97814757f,0.20791179f}, +{1.0000000f,-0.0000000f}, {0.97814763f,-0.20791170f}, {0.91354543f,-0.40673664f}, +{0.80901700f,-0.58778524f}, {0.66913056f,-0.74314487f}, {0.49999997f,-0.86602545f}, +{0.30901697f,-0.95105654f}, {0.10452842f,-0.99452192f}, {-0.10452851f,-0.99452192f}, +{-0.30901703f,-0.95105648f}, {-0.50000006f,-0.86602533f}, {-0.66913068f,-0.74314475f}, +{-0.80901700f,-0.58778518f}, {-0.91354549f,-0.40673658f}, {-0.97814763f,-0.20791161f}, +{1.0000000f,-0.0000000f}, {0.99862951f,-0.052335959f}, {0.99452192f,-0.10452846f}, +{0.98768836f,-0.15643448f}, {0.97814763f,-0.20791170f}, {0.96592581f,-0.25881904f}, +{0.95105648f,-0.30901700f}, {0.93358040f,-0.35836795f}, {0.91354543f,-0.40673664f}, +{0.89100653f,-0.45399052f}, {0.86602545f,-0.50000000f}, {0.83867055f,-0.54463905f}, +{0.80901700f,-0.58778524f}, {0.77714598f,-0.62932038f}, {0.74314475f,-0.66913062f}, +{0.70710677f,-0.70710683f}, {0.66913056f,-0.74314487f}, {0.62932038f,-0.77714598f}, +{0.58778524f,-0.80901700f}, {0.54463899f,-0.83867055f}, {0.49999997f,-0.86602545f}, +{0.45399052f,-0.89100653f}, {0.40673661f,-0.91354549f}, {0.35836786f,-0.93358046f}, +{0.30901697f,-0.95105654f}, {0.25881907f,-0.96592581f}, {0.20791166f,-0.97814763f}, +{0.15643437f,-0.98768836f}, {0.10452842f,-0.99452192f}, {0.052335974f,-0.99862951f}, +{1.0000000f,-0.0000000f}, {0.99452192f,-0.10452846f}, {0.97814763f,-0.20791170f}, +{0.95105648f,-0.30901700f}, {0.91354543f,-0.40673664f}, {0.86602545f,-0.50000000f}, +{0.80901700f,-0.58778524f}, {0.74314475f,-0.66913062f}, {0.66913056f,-0.74314487f}, +{0.58778524f,-0.80901700f}, {0.49999997f,-0.86602545f}, {0.40673661f,-0.91354549f}, +{0.30901697f,-0.95105654f}, {0.20791166f,-0.97814763f}, {0.10452842f,-0.99452192f}, +{-4.3711388e-08f,-1.0000000f}, {-0.10452851f,-0.99452192f}, {-0.20791174f,-0.97814757f}, +{-0.30901703f,-0.95105648f}, {-0.40673670f,-0.91354543f}, {-0.50000006f,-0.86602533f}, +{-0.58778518f,-0.80901700f}, {-0.66913068f,-0.74314475f}, {-0.74314493f,-0.66913044f}, +{-0.80901700f,-0.58778518f}, {-0.86602539f,-0.50000006f}, {-0.91354549f,-0.40673658f}, +{-0.95105654f,-0.30901679f}, {-0.97814763f,-0.20791161f}, {-0.99452192f,-0.10452849f}, +{1.0000000f,-0.0000000f}, {0.98768836f,-0.15643448f}, {0.95105648f,-0.30901700f}, +{0.89100653f,-0.45399052f}, {0.80901700f,-0.58778524f}, {0.70710677f,-0.70710683f}, +{0.58778524f,-0.80901700f}, {0.45399052f,-0.89100653f}, {0.30901697f,-0.95105654f}, +{0.15643437f,-0.98768836f}, {-4.3711388e-08f,-1.0000000f}, {-0.15643445f,-0.98768836f}, +{-0.30901703f,-0.95105648f}, {-0.45399061f,-0.89100647f}, {-0.58778518f,-0.80901700f}, +{-0.70710677f,-0.70710677f}, {-0.80901700f,-0.58778518f}, {-0.89100659f,-0.45399037f}, +{-0.95105654f,-0.30901679f}, {-0.98768836f,-0.15643445f}, {-1.0000000f,8.7422777e-08f}, +{-0.98768830f,0.15643461f}, {-0.95105654f,0.30901697f}, {-0.89100653f,0.45399055f}, +{-0.80901694f,0.58778536f}, {-0.70710665f,0.70710689f}, {-0.58778507f,0.80901712f}, +{-0.45399022f,0.89100665f}, {-0.30901709f,0.95105648f}, {-0.15643452f,0.98768830f}, +{1.0000000f,-0.0000000f}, {0.99991435f,-0.013089596f}, {0.99965733f,-0.026176950f}, +{0.99922901f,-0.039259817f}, {0.99862951f,-0.052335959f}, {0.99785894f,-0.065403134f}, +{0.99691731f,-0.078459099f}, {0.99580491f,-0.091501623f}, {0.99452192f,-0.10452846f}, +{0.99306846f,-0.11753740f}, {0.99144489f,-0.13052620f}, {0.98965138f,-0.14349262f}, +{0.98768836f,-0.15643448f}, {0.98555607f,-0.16934951f}, {0.98325491f,-0.18223552f}, +{0.98078525f,-0.19509032f}, {0.97814763f,-0.20791170f}, {0.97534233f,-0.22069745f}, +{0.97236991f,-0.23344538f}, {0.96923089f,-0.24615330f}, {0.96592581f,-0.25881904f}, +{0.96245521f,-0.27144045f}, {0.95881975f,-0.28401536f}, {0.95501995f,-0.29654160f}, +{0.95105648f,-0.30901700f}, {0.94693011f,-0.32143945f}, {0.94264150f,-0.33380687f}, +{0.93819129f,-0.34611708f}, {0.93358040f,-0.35836795f}, {0.92880952f,-0.37055743f}, +{0.92387956f,-0.38268346f}, {0.91879117f,-0.39474389f}, {0.91354543f,-0.40673664f}, +{0.90814316f,-0.41865975f}, {0.90258527f,-0.43051112f}, {0.89687270f,-0.44228873f}, +{0.89100653f,-0.45399052f}, {0.88498765f,-0.46561453f}, {0.87881708f,-0.47715878f}, +{0.87249601f,-0.48862126f}, {0.86602545f,-0.50000000f}, {0.85940641f,-0.51129311f}, +{0.85264015f,-0.52249855f}, {0.84572786f,-0.53361452f}, {0.83867055f,-0.54463905f}, +{0.83146960f,-0.55557024f}, {0.82412618f,-0.56640625f}, {0.81664151f,-0.57714522f}, +{0.80901700f,-0.58778524f}, {0.80125380f,-0.59832460f}, {0.79335332f,-0.60876143f}, +{0.78531694f,-0.61909395f}, {0.77714598f,-0.62932038f}, {0.76884180f,-0.63943899f}, +{0.76040596f,-0.64944810f}, {0.75183982f,-0.65934587f}, {0.74314475f,-0.66913062f}, +{0.73432249f,-0.67880076f}, {0.72537434f,-0.68835455f}, {0.71630192f,-0.69779050f}, +{0.70710677f,-0.70710683f}, {0.69779044f,-0.71630198f}, {0.68835455f,-0.72537440f}, +{0.67880070f,-0.73432255f}, {0.66913056f,-0.74314487f}, {0.65934581f,-0.75183982f}, +{0.64944804f,-0.76040596f}, {0.63943899f,-0.76884186f}, {0.62932038f,-0.77714598f}, +{0.61909395f,-0.78531694f}, {0.60876137f,-0.79335338f}, {0.59832460f,-0.80125386f}, +{0.58778524f,-0.80901700f}, {0.57714516f,-0.81664151f}, {0.56640625f,-0.82412618f}, +{0.55557019f,-0.83146960f}, {0.54463899f,-0.83867055f}, {0.53361452f,-0.84572786f}, +{0.52249849f,-0.85264015f}, {0.51129311f,-0.85940641f}, {0.49999997f,-0.86602545f}, +{0.48862118f,-0.87249601f}, {0.47715876f,-0.87881708f}, {0.46561447f,-0.88498765f}, +{0.45399052f,-0.89100653f}, {0.44228867f,-0.89687276f}, {0.43051103f,-0.90258533f}, +{0.41865975f,-0.90814316f}, {0.40673661f,-0.91354549f}, {0.39474380f,-0.91879129f}, +{0.38268343f,-0.92387956f}, {0.37055740f,-0.92880958f}, {0.35836786f,-0.93358046f}, +{0.34611705f,-0.93819135f}, {0.33380681f,-0.94264150f}, {0.32143947f,-0.94693011f}, +{0.30901697f,-0.95105654f}, {0.29654151f,-0.95501995f}, {0.28401533f,-0.95881975f}, +{0.27144039f,-0.96245527f}, {0.25881907f,-0.96592581f}, {0.24615327f,-0.96923089f}, +{0.23344530f,-0.97236991f}, {0.22069745f,-0.97534233f}, {0.20791166f,-0.97814763f}, +{0.19509023f,-0.98078531f}, {0.18223552f,-0.98325491f}, {0.16934945f,-0.98555607f}, +{0.15643437f,-0.98768836f}, {0.14349259f,-0.98965138f}, {0.13052613f,-0.99144489f}, +{0.11753740f,-0.99306846f}, {0.10452842f,-0.99452192f}, {0.091501534f,-0.99580491f}, +{0.078459084f,-0.99691731f}, {0.065403074f,-0.99785894f}, {0.052335974f,-0.99862951f}, +{0.039259788f,-0.99922901f}, {0.026176875f,-0.99965733f}, {0.013089597f,-0.99991435f}, +{1.0000000f,-0.0000000f}, {0.99965733f,-0.026176950f}, {0.99862951f,-0.052335959f}, +{0.99691731f,-0.078459099f}, {0.99452192f,-0.10452846f}, {0.99144489f,-0.13052620f}, +{0.98768836f,-0.15643448f}, {0.98325491f,-0.18223552f}, {0.97814763f,-0.20791170f}, +{0.97236991f,-0.23344538f}, {0.96592581f,-0.25881904f}, {0.95881975f,-0.28401536f}, +{0.95105648f,-0.30901700f}, {0.94264150f,-0.33380687f}, {0.93358040f,-0.35836795f}, +{0.92387956f,-0.38268346f}, {0.91354543f,-0.40673664f}, {0.90258527f,-0.43051112f}, +{0.89100653f,-0.45399052f}, {0.87881708f,-0.47715878f}, {0.86602545f,-0.50000000f}, +{0.85264015f,-0.52249855f}, {0.83867055f,-0.54463905f}, {0.82412618f,-0.56640625f}, +{0.80901700f,-0.58778524f}, {0.79335332f,-0.60876143f}, {0.77714598f,-0.62932038f}, +{0.76040596f,-0.64944810f}, {0.74314475f,-0.66913062f}, {0.72537434f,-0.68835455f}, +{0.70710677f,-0.70710683f}, {0.68835455f,-0.72537440f}, {0.66913056f,-0.74314487f}, +{0.64944804f,-0.76040596f}, {0.62932038f,-0.77714598f}, {0.60876137f,-0.79335338f}, +{0.58778524f,-0.80901700f}, {0.56640625f,-0.82412618f}, {0.54463899f,-0.83867055f}, +{0.52249849f,-0.85264015f}, {0.49999997f,-0.86602545f}, {0.47715876f,-0.87881708f}, +{0.45399052f,-0.89100653f}, {0.43051103f,-0.90258533f}, {0.40673661f,-0.91354549f}, +{0.38268343f,-0.92387956f}, {0.35836786f,-0.93358046f}, {0.33380681f,-0.94264150f}, +{0.30901697f,-0.95105654f}, {0.28401533f,-0.95881975f}, {0.25881907f,-0.96592581f}, +{0.23344530f,-0.97236991f}, {0.20791166f,-0.97814763f}, {0.18223552f,-0.98325491f}, +{0.15643437f,-0.98768836f}, {0.13052613f,-0.99144489f}, {0.10452842f,-0.99452192f}, +{0.078459084f,-0.99691731f}, {0.052335974f,-0.99862951f}, {0.026176875f,-0.99965733f}, +{-4.3711388e-08f,-1.0000000f}, {-0.026176963f,-0.99965733f}, {-0.052336060f,-0.99862951f}, +{-0.078459173f,-0.99691731f}, {-0.10452851f,-0.99452192f}, {-0.13052621f,-0.99144489f}, +{-0.15643445f,-0.98768836f}, {-0.18223560f,-0.98325491f}, {-0.20791174f,-0.97814757f}, +{-0.23344538f,-0.97236991f}, {-0.25881916f,-0.96592581f}, {-0.28401542f,-0.95881969f}, +{-0.30901703f,-0.95105648f}, {-0.33380687f,-0.94264150f}, {-0.35836795f,-0.93358040f}, +{-0.38268352f,-0.92387950f}, {-0.40673670f,-0.91354543f}, {-0.43051112f,-0.90258527f}, +{-0.45399061f,-0.89100647f}, {-0.47715873f,-0.87881708f}, {-0.50000006f,-0.86602533f}, +{-0.52249867f,-0.85264009f}, {-0.54463905f,-0.83867055f}, {-0.56640631f,-0.82412612f}, +{-0.58778518f,-0.80901700f}, {-0.60876143f,-0.79335332f}, {-0.62932050f,-0.77714586f}, +{-0.64944804f,-0.76040596f}, {-0.66913068f,-0.74314475f}, {-0.68835467f,-0.72537428f}, +{-0.70710677f,-0.70710677f}, {-0.72537446f,-0.68835449f}, {-0.74314493f,-0.66913044f}, +{-0.76040596f,-0.64944804f}, {-0.77714604f,-0.62932026f}, {-0.79335332f,-0.60876143f}, +{-0.80901700f,-0.58778518f}, {-0.82412624f,-0.56640613f}, {-0.83867055f,-0.54463899f}, +{-0.85264021f,-0.52249849f}, {-0.86602539f,-0.50000006f}, {-0.87881714f,-0.47715873f}, +{-0.89100659f,-0.45399037f}, {-0.90258527f,-0.43051112f}, {-0.91354549f,-0.40673658f}, +{-0.92387956f,-0.38268328f}, {-0.93358040f,-0.35836792f}, {-0.94264150f,-0.33380675f}, +{-0.95105654f,-0.30901679f}, {-0.95881975f,-0.28401530f}, {-0.96592587f,-0.25881892f}, +{-0.97236991f,-0.23344538f}, {-0.97814763f,-0.20791161f}, {-0.98325491f,-0.18223536f}, +{-0.98768836f,-0.15643445f}, {-0.99144489f,-0.13052608f}, {-0.99452192f,-0.10452849f}, +{-0.99691737f,-0.078459039f}, {-0.99862957f,-0.052335810f}, {-0.99965733f,-0.026176952f}, +{1.0000000f,-0.0000000f}, {0.99922901f,-0.039259817f}, {0.99691731f,-0.078459099f}, +{0.99306846f,-0.11753740f}, {0.98768836f,-0.15643448f}, {0.98078525f,-0.19509032f}, +{0.97236991f,-0.23344538f}, {0.96245521f,-0.27144045f}, {0.95105648f,-0.30901700f}, +{0.93819129f,-0.34611708f}, {0.92387956f,-0.38268346f}, {0.90814316f,-0.41865975f}, +{0.89100653f,-0.45399052f}, {0.87249601f,-0.48862126f}, {0.85264015f,-0.52249855f}, +{0.83146960f,-0.55557024f}, {0.80901700f,-0.58778524f}, {0.78531694f,-0.61909395f}, +{0.76040596f,-0.64944810f}, {0.73432249f,-0.67880076f}, {0.70710677f,-0.70710683f}, +{0.67880070f,-0.73432255f}, {0.64944804f,-0.76040596f}, {0.61909395f,-0.78531694f}, +{0.58778524f,-0.80901700f}, {0.55557019f,-0.83146960f}, {0.52249849f,-0.85264015f}, +{0.48862118f,-0.87249601f}, {0.45399052f,-0.89100653f}, {0.41865975f,-0.90814316f}, +{0.38268343f,-0.92387956f}, {0.34611705f,-0.93819135f}, {0.30901697f,-0.95105654f}, +{0.27144039f,-0.96245527f}, {0.23344530f,-0.97236991f}, {0.19509023f,-0.98078531f}, +{0.15643437f,-0.98768836f}, {0.11753740f,-0.99306846f}, {0.078459084f,-0.99691731f}, +{0.039259788f,-0.99922901f}, {-4.3711388e-08f,-1.0000000f}, {-0.039259877f,-0.99922901f}, +{-0.078459173f,-0.99691731f}, {-0.11753749f,-0.99306846f}, {-0.15643445f,-0.98768836f}, +{-0.19509032f,-0.98078525f}, {-0.23344538f,-0.97236991f}, {-0.27144048f,-0.96245521f}, +{-0.30901703f,-0.95105648f}, {-0.34611711f,-0.93819129f}, {-0.38268352f,-0.92387950f}, +{-0.41865984f,-0.90814310f}, {-0.45399061f,-0.89100647f}, {-0.48862135f,-0.87249595f}, +{-0.52249867f,-0.85264009f}, {-0.55557036f,-0.83146954f}, {-0.58778518f,-0.80901700f}, +{-0.61909389f,-0.78531694f}, {-0.64944804f,-0.76040596f}, {-0.67880076f,-0.73432249f}, +{-0.70710677f,-0.70710677f}, {-0.73432249f,-0.67880070f}, {-0.76040596f,-0.64944804f}, +{-0.78531694f,-0.61909389f}, {-0.80901700f,-0.58778518f}, {-0.83146966f,-0.55557019f}, +{-0.85264021f,-0.52249849f}, {-0.87249607f,-0.48862115f}, {-0.89100659f,-0.45399037f}, +{-0.90814322f,-0.41865960f}, {-0.92387956f,-0.38268328f}, {-0.93819135f,-0.34611690f}, +{-0.95105654f,-0.30901679f}, {-0.96245521f,-0.27144048f}, {-0.97236991f,-0.23344538f}, +{-0.98078531f,-0.19509031f}, {-0.98768836f,-0.15643445f}, {-0.99306846f,-0.11753736f}, +{-0.99691737f,-0.078459039f}, {-0.99922901f,-0.039259743f}, {-1.0000000f,8.7422777e-08f}, +{-0.99922901f,0.039259918f}, {-0.99691731f,0.078459218f}, {-0.99306846f,0.11753753f}, +{-0.98768830f,0.15643461f}, {-0.98078525f,0.19509049f}, {-0.97236985f,0.23344554f}, +{-0.96245515f,0.27144065f}, {-0.95105654f,0.30901697f}, {-0.93819135f,0.34611705f}, +{-0.92387956f,0.38268346f}, {-0.90814316f,0.41865975f}, {-0.89100653f,0.45399055f}, +{-0.87249601f,0.48862129f}, {-0.85264015f,0.52249861f}, {-0.83146960f,0.55557030f}, +{-0.80901694f,0.58778536f}, {-0.78531688f,0.61909401f}, {-0.76040590f,0.64944816f}, +{-0.73432243f,0.67880082f}, {-0.70710665f,0.70710689f}, {-0.67880058f,0.73432261f}, +{-0.64944792f,0.76040608f}, {-0.61909378f,0.78531706f}, {-0.58778507f,0.80901712f}, +{-0.55557001f,0.83146977f}, {-0.52249837f,0.85264033f}, {-0.48862100f,0.87249613f}, +{-0.45399022f,0.89100665f}, {-0.41865945f,0.90814328f}, {-0.38268313f,0.92387968f}, +{-0.34611672f,0.93819147f}, {-0.30901709f,0.95105648f}, {-0.27144054f,0.96245521f}, +{-0.23344545f,0.97236991f}, {-0.19509038f,0.98078525f}, {-0.15643452f,0.98768830f}, +{-0.11753743f,0.99306846f}, {-0.078459114f,0.99691731f}, {-0.039259821f,0.99922901f}, +}; +static const ne10_fft_cpx_float32_t ne10_twiddles_240[240] = { +{1.0000000f,0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, +{1.0000000f,-0.0000000f}, {0.91354543f,-0.40673664f}, {0.66913056f,-0.74314487f}, +{1.0000000f,-0.0000000f}, {0.66913056f,-0.74314487f}, {-0.10452851f,-0.99452192f}, +{1.0000000f,-0.0000000f}, {0.30901697f,-0.95105654f}, {-0.80901700f,-0.58778518f}, +{1.0000000f,-0.0000000f}, {-0.10452851f,-0.99452192f}, {-0.97814757f,0.20791179f}, +{1.0000000f,-0.0000000f}, {0.99452192f,-0.10452846f}, {0.97814763f,-0.20791170f}, +{0.95105648f,-0.30901700f}, {0.91354543f,-0.40673664f}, {0.86602545f,-0.50000000f}, +{0.80901700f,-0.58778524f}, {0.74314475f,-0.66913062f}, {0.66913056f,-0.74314487f}, +{0.58778524f,-0.80901700f}, {0.49999997f,-0.86602545f}, {0.40673661f,-0.91354549f}, +{0.30901697f,-0.95105654f}, {0.20791166f,-0.97814763f}, {0.10452842f,-0.99452192f}, +{1.0000000f,-0.0000000f}, {0.97814763f,-0.20791170f}, {0.91354543f,-0.40673664f}, +{0.80901700f,-0.58778524f}, {0.66913056f,-0.74314487f}, {0.49999997f,-0.86602545f}, +{0.30901697f,-0.95105654f}, {0.10452842f,-0.99452192f}, {-0.10452851f,-0.99452192f}, +{-0.30901703f,-0.95105648f}, {-0.50000006f,-0.86602533f}, {-0.66913068f,-0.74314475f}, +{-0.80901700f,-0.58778518f}, {-0.91354549f,-0.40673658f}, {-0.97814763f,-0.20791161f}, +{1.0000000f,-0.0000000f}, {0.95105648f,-0.30901700f}, {0.80901700f,-0.58778524f}, +{0.58778524f,-0.80901700f}, {0.30901697f,-0.95105654f}, {-4.3711388e-08f,-1.0000000f}, +{-0.30901703f,-0.95105648f}, {-0.58778518f,-0.80901700f}, {-0.80901700f,-0.58778518f}, +{-0.95105654f,-0.30901679f}, {-1.0000000f,8.7422777e-08f}, {-0.95105654f,0.30901697f}, +{-0.80901694f,0.58778536f}, {-0.58778507f,0.80901712f}, {-0.30901709f,0.95105648f}, +{1.0000000f,-0.0000000f}, {0.99965733f,-0.026176950f}, {0.99862951f,-0.052335959f}, +{0.99691731f,-0.078459099f}, {0.99452192f,-0.10452846f}, {0.99144489f,-0.13052620f}, +{0.98768836f,-0.15643448f}, {0.98325491f,-0.18223552f}, {0.97814763f,-0.20791170f}, +{0.97236991f,-0.23344538f}, {0.96592581f,-0.25881904f}, {0.95881975f,-0.28401536f}, +{0.95105648f,-0.30901700f}, {0.94264150f,-0.33380687f}, {0.93358040f,-0.35836795f}, +{0.92387956f,-0.38268346f}, {0.91354543f,-0.40673664f}, {0.90258527f,-0.43051112f}, +{0.89100653f,-0.45399052f}, {0.87881708f,-0.47715878f}, {0.86602545f,-0.50000000f}, +{0.85264015f,-0.52249855f}, {0.83867055f,-0.54463905f}, {0.82412618f,-0.56640625f}, +{0.80901700f,-0.58778524f}, {0.79335332f,-0.60876143f}, {0.77714598f,-0.62932038f}, +{0.76040596f,-0.64944810f}, {0.74314475f,-0.66913062f}, {0.72537434f,-0.68835455f}, +{0.70710677f,-0.70710683f}, {0.68835455f,-0.72537440f}, {0.66913056f,-0.74314487f}, +{0.64944804f,-0.76040596f}, {0.62932038f,-0.77714598f}, {0.60876137f,-0.79335338f}, +{0.58778524f,-0.80901700f}, {0.56640625f,-0.82412618f}, {0.54463899f,-0.83867055f}, +{0.52249849f,-0.85264015f}, {0.49999997f,-0.86602545f}, {0.47715876f,-0.87881708f}, +{0.45399052f,-0.89100653f}, {0.43051103f,-0.90258533f}, {0.40673661f,-0.91354549f}, +{0.38268343f,-0.92387956f}, {0.35836786f,-0.93358046f}, {0.33380681f,-0.94264150f}, +{0.30901697f,-0.95105654f}, {0.28401533f,-0.95881975f}, {0.25881907f,-0.96592581f}, +{0.23344530f,-0.97236991f}, {0.20791166f,-0.97814763f}, {0.18223552f,-0.98325491f}, +{0.15643437f,-0.98768836f}, {0.13052613f,-0.99144489f}, {0.10452842f,-0.99452192f}, +{0.078459084f,-0.99691731f}, {0.052335974f,-0.99862951f}, {0.026176875f,-0.99965733f}, +{1.0000000f,-0.0000000f}, {0.99862951f,-0.052335959f}, {0.99452192f,-0.10452846f}, +{0.98768836f,-0.15643448f}, {0.97814763f,-0.20791170f}, {0.96592581f,-0.25881904f}, +{0.95105648f,-0.30901700f}, {0.93358040f,-0.35836795f}, {0.91354543f,-0.40673664f}, +{0.89100653f,-0.45399052f}, {0.86602545f,-0.50000000f}, {0.83867055f,-0.54463905f}, +{0.80901700f,-0.58778524f}, {0.77714598f,-0.62932038f}, {0.74314475f,-0.66913062f}, +{0.70710677f,-0.70710683f}, {0.66913056f,-0.74314487f}, {0.62932038f,-0.77714598f}, +{0.58778524f,-0.80901700f}, {0.54463899f,-0.83867055f}, {0.49999997f,-0.86602545f}, +{0.45399052f,-0.89100653f}, {0.40673661f,-0.91354549f}, {0.35836786f,-0.93358046f}, +{0.30901697f,-0.95105654f}, {0.25881907f,-0.96592581f}, {0.20791166f,-0.97814763f}, +{0.15643437f,-0.98768836f}, {0.10452842f,-0.99452192f}, {0.052335974f,-0.99862951f}, +{-4.3711388e-08f,-1.0000000f}, {-0.052336060f,-0.99862951f}, {-0.10452851f,-0.99452192f}, +{-0.15643445f,-0.98768836f}, {-0.20791174f,-0.97814757f}, {-0.25881916f,-0.96592581f}, +{-0.30901703f,-0.95105648f}, {-0.35836795f,-0.93358040f}, {-0.40673670f,-0.91354543f}, +{-0.45399061f,-0.89100647f}, {-0.50000006f,-0.86602533f}, {-0.54463905f,-0.83867055f}, +{-0.58778518f,-0.80901700f}, {-0.62932050f,-0.77714586f}, {-0.66913068f,-0.74314475f}, +{-0.70710677f,-0.70710677f}, {-0.74314493f,-0.66913044f}, {-0.77714604f,-0.62932026f}, +{-0.80901700f,-0.58778518f}, {-0.83867055f,-0.54463899f}, {-0.86602539f,-0.50000006f}, +{-0.89100659f,-0.45399037f}, {-0.91354549f,-0.40673658f}, {-0.93358040f,-0.35836792f}, +{-0.95105654f,-0.30901679f}, {-0.96592587f,-0.25881892f}, {-0.97814763f,-0.20791161f}, +{-0.98768836f,-0.15643445f}, {-0.99452192f,-0.10452849f}, {-0.99862957f,-0.052335810f}, +{1.0000000f,-0.0000000f}, {0.99691731f,-0.078459099f}, {0.98768836f,-0.15643448f}, +{0.97236991f,-0.23344538f}, {0.95105648f,-0.30901700f}, {0.92387956f,-0.38268346f}, +{0.89100653f,-0.45399052f}, {0.85264015f,-0.52249855f}, {0.80901700f,-0.58778524f}, +{0.76040596f,-0.64944810f}, {0.70710677f,-0.70710683f}, {0.64944804f,-0.76040596f}, +{0.58778524f,-0.80901700f}, {0.52249849f,-0.85264015f}, {0.45399052f,-0.89100653f}, +{0.38268343f,-0.92387956f}, {0.30901697f,-0.95105654f}, {0.23344530f,-0.97236991f}, +{0.15643437f,-0.98768836f}, {0.078459084f,-0.99691731f}, {-4.3711388e-08f,-1.0000000f}, +{-0.078459173f,-0.99691731f}, {-0.15643445f,-0.98768836f}, {-0.23344538f,-0.97236991f}, +{-0.30901703f,-0.95105648f}, {-0.38268352f,-0.92387950f}, {-0.45399061f,-0.89100647f}, +{-0.52249867f,-0.85264009f}, {-0.58778518f,-0.80901700f}, {-0.64944804f,-0.76040596f}, +{-0.70710677f,-0.70710677f}, {-0.76040596f,-0.64944804f}, {-0.80901700f,-0.58778518f}, +{-0.85264021f,-0.52249849f}, {-0.89100659f,-0.45399037f}, {-0.92387956f,-0.38268328f}, +{-0.95105654f,-0.30901679f}, {-0.97236991f,-0.23344538f}, {-0.98768836f,-0.15643445f}, +{-0.99691737f,-0.078459039f}, {-1.0000000f,8.7422777e-08f}, {-0.99691731f,0.078459218f}, +{-0.98768830f,0.15643461f}, {-0.97236985f,0.23344554f}, {-0.95105654f,0.30901697f}, +{-0.92387956f,0.38268346f}, {-0.89100653f,0.45399055f}, {-0.85264015f,0.52249861f}, +{-0.80901694f,0.58778536f}, {-0.76040590f,0.64944816f}, {-0.70710665f,0.70710689f}, +{-0.64944792f,0.76040608f}, {-0.58778507f,0.80901712f}, {-0.52249837f,0.85264033f}, +{-0.45399022f,0.89100665f}, {-0.38268313f,0.92387968f}, {-0.30901709f,0.95105648f}, +{-0.23344545f,0.97236991f}, {-0.15643452f,0.98768830f}, {-0.078459114f,0.99691731f}, +}; +static const ne10_fft_cpx_float32_t ne10_twiddles_120[120] = { +{1.0000000f,0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, +{1.0000000f,-0.0000000f}, {0.91354543f,-0.40673664f}, {0.66913056f,-0.74314487f}, +{1.0000000f,-0.0000000f}, {0.66913056f,-0.74314487f}, {-0.10452851f,-0.99452192f}, +{1.0000000f,-0.0000000f}, {0.30901697f,-0.95105654f}, {-0.80901700f,-0.58778518f}, +{1.0000000f,-0.0000000f}, {-0.10452851f,-0.99452192f}, {-0.97814757f,0.20791179f}, +{1.0000000f,-0.0000000f}, {0.97814763f,-0.20791170f}, {0.91354543f,-0.40673664f}, +{0.80901700f,-0.58778524f}, {0.66913056f,-0.74314487f}, {0.49999997f,-0.86602545f}, +{0.30901697f,-0.95105654f}, {0.10452842f,-0.99452192f}, {-0.10452851f,-0.99452192f}, +{-0.30901703f,-0.95105648f}, {-0.50000006f,-0.86602533f}, {-0.66913068f,-0.74314475f}, +{-0.80901700f,-0.58778518f}, {-0.91354549f,-0.40673658f}, {-0.97814763f,-0.20791161f}, +{1.0000000f,-0.0000000f}, {0.99862951f,-0.052335959f}, {0.99452192f,-0.10452846f}, +{0.98768836f,-0.15643448f}, {0.97814763f,-0.20791170f}, {0.96592581f,-0.25881904f}, +{0.95105648f,-0.30901700f}, {0.93358040f,-0.35836795f}, {0.91354543f,-0.40673664f}, +{0.89100653f,-0.45399052f}, {0.86602545f,-0.50000000f}, {0.83867055f,-0.54463905f}, +{0.80901700f,-0.58778524f}, {0.77714598f,-0.62932038f}, {0.74314475f,-0.66913062f}, +{0.70710677f,-0.70710683f}, {0.66913056f,-0.74314487f}, {0.62932038f,-0.77714598f}, +{0.58778524f,-0.80901700f}, {0.54463899f,-0.83867055f}, {0.49999997f,-0.86602545f}, +{0.45399052f,-0.89100653f}, {0.40673661f,-0.91354549f}, {0.35836786f,-0.93358046f}, +{0.30901697f,-0.95105654f}, {0.25881907f,-0.96592581f}, {0.20791166f,-0.97814763f}, +{0.15643437f,-0.98768836f}, {0.10452842f,-0.99452192f}, {0.052335974f,-0.99862951f}, +{1.0000000f,-0.0000000f}, {0.99452192f,-0.10452846f}, {0.97814763f,-0.20791170f}, +{0.95105648f,-0.30901700f}, {0.91354543f,-0.40673664f}, {0.86602545f,-0.50000000f}, +{0.80901700f,-0.58778524f}, {0.74314475f,-0.66913062f}, {0.66913056f,-0.74314487f}, +{0.58778524f,-0.80901700f}, {0.49999997f,-0.86602545f}, {0.40673661f,-0.91354549f}, +{0.30901697f,-0.95105654f}, {0.20791166f,-0.97814763f}, {0.10452842f,-0.99452192f}, +{-4.3711388e-08f,-1.0000000f}, {-0.10452851f,-0.99452192f}, {-0.20791174f,-0.97814757f}, +{-0.30901703f,-0.95105648f}, {-0.40673670f,-0.91354543f}, {-0.50000006f,-0.86602533f}, +{-0.58778518f,-0.80901700f}, {-0.66913068f,-0.74314475f}, {-0.74314493f,-0.66913044f}, +{-0.80901700f,-0.58778518f}, {-0.86602539f,-0.50000006f}, {-0.91354549f,-0.40673658f}, +{-0.95105654f,-0.30901679f}, {-0.97814763f,-0.20791161f}, {-0.99452192f,-0.10452849f}, +{1.0000000f,-0.0000000f}, {0.98768836f,-0.15643448f}, {0.95105648f,-0.30901700f}, +{0.89100653f,-0.45399052f}, {0.80901700f,-0.58778524f}, {0.70710677f,-0.70710683f}, +{0.58778524f,-0.80901700f}, {0.45399052f,-0.89100653f}, {0.30901697f,-0.95105654f}, +{0.15643437f,-0.98768836f}, {-4.3711388e-08f,-1.0000000f}, {-0.15643445f,-0.98768836f}, +{-0.30901703f,-0.95105648f}, {-0.45399061f,-0.89100647f}, {-0.58778518f,-0.80901700f}, +{-0.70710677f,-0.70710677f}, {-0.80901700f,-0.58778518f}, {-0.89100659f,-0.45399037f}, +{-0.95105654f,-0.30901679f}, {-0.98768836f,-0.15643445f}, {-1.0000000f,8.7422777e-08f}, +{-0.98768830f,0.15643461f}, {-0.95105654f,0.30901697f}, {-0.89100653f,0.45399055f}, +{-0.80901694f,0.58778536f}, {-0.70710665f,0.70710689f}, {-0.58778507f,0.80901712f}, +{-0.45399022f,0.89100665f}, {-0.30901709f,0.95105648f}, {-0.15643452f,0.98768830f}, +}; +static const ne10_fft_cpx_float32_t ne10_twiddles_60[60] = { +{1.0000000f,0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, +{1.0000000f,-0.0000000f}, {0.91354543f,-0.40673664f}, {0.66913056f,-0.74314487f}, +{1.0000000f,-0.0000000f}, {0.66913056f,-0.74314487f}, {-0.10452851f,-0.99452192f}, +{1.0000000f,-0.0000000f}, {0.30901697f,-0.95105654f}, {-0.80901700f,-0.58778518f}, +{1.0000000f,-0.0000000f}, {-0.10452851f,-0.99452192f}, {-0.97814757f,0.20791179f}, +{1.0000000f,-0.0000000f}, {0.99452192f,-0.10452846f}, {0.97814763f,-0.20791170f}, +{0.95105648f,-0.30901700f}, {0.91354543f,-0.40673664f}, {0.86602545f,-0.50000000f}, +{0.80901700f,-0.58778524f}, {0.74314475f,-0.66913062f}, {0.66913056f,-0.74314487f}, +{0.58778524f,-0.80901700f}, {0.49999997f,-0.86602545f}, {0.40673661f,-0.91354549f}, +{0.30901697f,-0.95105654f}, {0.20791166f,-0.97814763f}, {0.10452842f,-0.99452192f}, +{1.0000000f,-0.0000000f}, {0.97814763f,-0.20791170f}, {0.91354543f,-0.40673664f}, +{0.80901700f,-0.58778524f}, {0.66913056f,-0.74314487f}, {0.49999997f,-0.86602545f}, +{0.30901697f,-0.95105654f}, {0.10452842f,-0.99452192f}, {-0.10452851f,-0.99452192f}, +{-0.30901703f,-0.95105648f}, {-0.50000006f,-0.86602533f}, {-0.66913068f,-0.74314475f}, +{-0.80901700f,-0.58778518f}, {-0.91354549f,-0.40673658f}, {-0.97814763f,-0.20791161f}, +{1.0000000f,-0.0000000f}, {0.95105648f,-0.30901700f}, {0.80901700f,-0.58778524f}, +{0.58778524f,-0.80901700f}, {0.30901697f,-0.95105654f}, {-4.3711388e-08f,-1.0000000f}, +{-0.30901703f,-0.95105648f}, {-0.58778518f,-0.80901700f}, {-0.80901700f,-0.58778518f}, +{-0.95105654f,-0.30901679f}, {-1.0000000f,8.7422777e-08f}, {-0.95105654f,0.30901697f}, +{-0.80901694f,0.58778536f}, {-0.58778507f,0.80901712f}, {-0.30901709f,0.95105648f}, +}; +static const ne10_fft_state_float32_t ne10_fft_state_float32_t_480 = { +120, +(ne10_int32_t *)ne10_factors_480, +(ne10_fft_cpx_float32_t *)ne10_twiddles_480, +NULL, +(ne10_fft_cpx_float32_t *)&ne10_twiddles_480[120], +/* is_forward_scaled = true */ +(ne10_int32_t) 1, +/* is_backward_scaled = false */ +(ne10_int32_t) 0, +}; +static const arch_fft_state cfg_arch_480 = { +1, +(void *)&ne10_fft_state_float32_t_480, +}; + +static const ne10_fft_state_float32_t ne10_fft_state_float32_t_240 = { +60, +(ne10_int32_t *)ne10_factors_240, +(ne10_fft_cpx_float32_t *)ne10_twiddles_240, +NULL, +(ne10_fft_cpx_float32_t *)&ne10_twiddles_240[60], +/* is_forward_scaled = true */ +(ne10_int32_t) 1, +/* is_backward_scaled = false */ +(ne10_int32_t) 0, +}; +static const arch_fft_state cfg_arch_240 = { +1, +(void *)&ne10_fft_state_float32_t_240, +}; + +static const ne10_fft_state_float32_t ne10_fft_state_float32_t_120 = { +30, +(ne10_int32_t *)ne10_factors_120, +(ne10_fft_cpx_float32_t *)ne10_twiddles_120, +NULL, +(ne10_fft_cpx_float32_t *)&ne10_twiddles_120[30], +/* is_forward_scaled = true */ +(ne10_int32_t) 1, +/* is_backward_scaled = false */ +(ne10_int32_t) 0, +}; +static const arch_fft_state cfg_arch_120 = { +1, +(void *)&ne10_fft_state_float32_t_120, +}; + +static const ne10_fft_state_float32_t ne10_fft_state_float32_t_60 = { +15, +(ne10_int32_t *)ne10_factors_60, +(ne10_fft_cpx_float32_t *)ne10_twiddles_60, +NULL, +(ne10_fft_cpx_float32_t *)&ne10_twiddles_60[15], +/* is_forward_scaled = true */ +(ne10_int32_t) 1, +/* is_backward_scaled = false */ +(ne10_int32_t) 0, +}; +static const arch_fft_state cfg_arch_60 = { +1, +(void *)&ne10_fft_state_float32_t_60, +}; + +#endif /* end NE10_FFT_PARAMS48000_960 */ diff --git a/external/opus-1.0.3/celt/tests/test_unit_cwrs32.c b/external/opus-1.3.1/celt/tests/test_unit_cwrs32.c similarity index 59% rename from external/opus-1.0.3/celt/tests/test_unit_cwrs32.c rename to external/opus-1.3.1/celt/tests/test_unit_cwrs32.c index 4695f2dd..36dd8af5 100644 --- a/external/opus-1.0.3/celt/tests/test_unit_cwrs32.c +++ b/external/opus-1.3.1/celt/tests/test_unit_cwrs32.c @@ -53,22 +53,20 @@ #ifdef TEST_CUSTOM_MODES -#define NDIMS (46) +#define NDIMS (44) static const int pn[NDIMS]={ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 30, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 88, 96, 104, - 112, 120, 128, 144, 160, 176, 192, 208, 224, - 240 + 112, 120, 128, 144, 160, 176, 192, 208 }; static const int pkmax[NDIMS]={ 128, 128, 128, 128, 88, 52, 36, 26, 22, 18, 16, 15, 13, 12, 12, 11, 10, 9, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4 + 4, 4, 4, 4, 4, 4, 4, 4 }; #else /* TEST_CUSTOM_MODES */ @@ -97,29 +95,39 @@ int main(void){ for(pseudo=1;pseudo<41;pseudo++) { int k; +#if defined(SMALL_FOOTPRINT) opus_uint32 uu[KMAX+2U]; +#endif opus_uint32 inc; opus_uint32 nc; opus_uint32 i; k=get_pulses(pseudo); if (k>pkmax[t])break; printf("Testing CWRS with N=%i, K=%i...\n",n,k); +#if defined(SMALL_FOOTPRINT) nc=ncwrs_urow(n,k,uu); +#else + nc=CELT_PVQ_V(n,k); +#endif inc=nc/20000; if(inc<1)inc=1; for(i=0;i");*/ +#if defined(SMALL_FOOTPRINT) ii=icwrs(n,k,&v,y,u); +#else + ii=icwrs(n,y); + v=CELT_PVQ_V(n,k); +#endif if(ii!=i){ fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); @@ -139,81 +152,6 @@ int main(void){ (long)v,(long)nc); return 2; } -#ifndef SMALL_FOOTPRINT - if(n==2){ - cwrsi2(k,i,yy); - for(j=0;j<2;j++)if(yy[j]!=y[j]){ - fprintf(stderr,"N=2 pulse vector mismatch ({%i,%i}!={%i,%i}).\n", - yy[0],yy[1],y[0],y[1]); - return 3; - } - ii=icwrs2(yy,&kk); - if(ii!=i){ - fprintf(stderr,"N=2 combination-index mismatch (%lu!=%lu).\n", - (long)ii,(long)i); - return 4; - } - if(kk!=k){ - fprintf(stderr,"N=2 pulse count mismatch (%i,%i).\n",kk,k); - return 5; - } - v=ncwrs2(k); - if(v!=nc){ - fprintf(stderr,"N=2 combination count mismatch (%lu,%lu).\n", - (long)v,(long)nc); - return 6; - } - } - else if(n==3){ - cwrsi3(k,i,yy); - for(j=0;j<3;j++)if(yy[j]!=y[j]){ - fprintf(stderr,"N=3 pulse vector mismatch " - "({%i,%i,%i}!={%i,%i,%i}).\n",yy[0],yy[1],yy[2],y[0],y[1],y[2]); - return 7; - } - ii=icwrs3(yy,&kk); - if(ii!=i){ - fprintf(stderr,"N=3 combination-index mismatch (%lu!=%lu).\n", - (long)ii,(long)i); - return 8; - } - if(kk!=k){ - fprintf(stderr,"N=3 pulse count mismatch (%i!=%i).\n",kk,k); - return 9; - } - v=ncwrs3(k); - if(v!=nc){ - fprintf(stderr,"N=3 combination count mismatch (%lu!=%lu).\n", - (long)v,(long)nc); - return 10; - } - } - else if(n==4){ - cwrsi4(k,i,yy); - for(j=0;j<4;j++)if(yy[j]!=y[j]){ - fprintf(stderr,"N=4 pulse vector mismatch " - "({%i,%i,%i,%i}!={%i,%i,%i,%i}.\n", - yy[0],yy[1],yy[2],yy[3],y[0],y[1],y[2],y[3]); - return 11; - } - ii=icwrs4(yy,&kk); - if(ii!=i){ - fprintf(stderr,"N=4 combination-index mismatch (%lu!=%lu).\n", - (long)ii,(long)i); - return 12; - } - if(kk!=k){ - fprintf(stderr,"N=4 pulse count mismatch (%i!=%i).\n",kk,k); - return 13; - } - v=ncwrs4(k); - if(v!=nc){ - fprintf(stderr,"N=4 combination count mismatch (%lu!=%lu).\n", - (long)v,(long)nc); - return 14; - } - } -#endif /* SMALL_FOOTPRINT */ /*printf(" %6u\n",i);*/ } /*printf("\n");*/ diff --git a/external/opus-1.0.3/celt/tests/test_unit_dft.c b/external/opus-1.3.1/celt/tests/test_unit_dft.c similarity index 72% rename from external/opus-1.0.3/celt/tests/test_unit_dft.c rename to external/opus-1.3.1/celt/tests/test_unit_dft.c index 7ff0be04..70f8f493 100644 --- a/external/opus-1.0.3/celt/tests/test_unit_dft.c +++ b/external/opus-1.3.1/celt/tests/test_unit_dft.c @@ -29,21 +29,12 @@ #include "config.h" #endif -#define SKIP_CONFIG_H - -#ifndef CUSTOM_MODES -#define CUSTOM_MODES -#endif - #include -#define CELT_C #include "stack_alloc.h" #include "kiss_fft.h" -#include "kiss_fft.c" -#include "mathops.c" -#include "entcode.c" - +#include "mathops.h" +#include "modes.h" #ifndef M_PI #define M_PI 3.141592653 @@ -92,14 +83,28 @@ void check(kiss_fft_cpx * in,kiss_fft_cpx * out,int nfft,int isinverse) } } -void test1d(int nfft,int isinverse) +void test1d(int nfft,int isinverse,int arch) { size_t buflen = sizeof(kiss_fft_cpx)*nfft; - - kiss_fft_cpx * in = (kiss_fft_cpx*)malloc(buflen); - kiss_fft_cpx * out= (kiss_fft_cpx*)malloc(buflen); - kiss_fft_state *cfg = opus_fft_alloc(nfft,0,0); + kiss_fft_cpx *in; + kiss_fft_cpx *out; int k; +#ifdef CUSTOM_MODES + kiss_fft_state *cfg = opus_fft_alloc(nfft,0,0,arch); +#else + int id; + const kiss_fft_state *cfg; + CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); + if (nfft == 480) id = 0; + else if (nfft == 240) id = 1; + else if (nfft == 120) id = 2; + else if (nfft == 60) id = 3; + else return; + cfg = mode->mdct.kfft[id]; +#endif + + in = (kiss_fft_cpx*)malloc(buflen); + out = (kiss_fft_cpx*)malloc(buflen); for (k=0;k1) { int k; for (k=1;k #include #include +#define CELT_C #include "entcode.h" #include "entenc.h" #include "entdec.h" @@ -66,10 +67,10 @@ int main(int _argc,char **_argv){ const char *env_seed; ret=0; entropy=0; - if (_argc > 2) { - fprintf(stderr, "Usage: %s []\n", _argv[0]); - return 1; - } + if (_argc > 2) { + fprintf(stderr, "Usage: %s []\n", _argv[0]); + return 1; + } env_seed = getenv("SEED"); if (_argc > 1) seed = atoi(_argv[1]); diff --git a/external/opus-1.0.3/celt/tests/test_unit_laplace.c b/external/opus-1.3.1/celt/tests/test_unit_laplace.c similarity index 99% rename from external/opus-1.0.3/celt/tests/test_unit_laplace.c rename to external/opus-1.3.1/celt/tests/test_unit_laplace.c index b0f59359..727bf012 100644 --- a/external/opus-1.0.3/celt/tests/test_unit_laplace.c +++ b/external/opus-1.3.1/celt/tests/test_unit_laplace.c @@ -31,8 +31,8 @@ #include #include -#include "laplace.h" #define CELT_C +#include "laplace.h" #include "stack_alloc.h" #include "entenc.c" @@ -88,5 +88,6 @@ int main(void) } } + free(ptr); return ret; } diff --git a/external/opus-1.0.3/celt/tests/test_unit_mathops.c b/external/opus-1.3.1/celt/tests/test_unit_mathops.c similarity index 96% rename from external/opus-1.0.3/celt/tests/test_unit_mathops.c rename to external/opus-1.3.1/celt/tests/test_unit_mathops.c index c11f0adc..874e9adf 100644 --- a/external/opus-1.0.3/celt/tests/test_unit_mathops.c +++ b/external/opus-1.3.1/celt/tests/test_unit_mathops.c @@ -34,17 +34,10 @@ #define CUSTOM_MODES #endif -#define CELT_C - -#include "mathops.c" -#include "entenc.c" -#include "entdec.c" -#include "entcode.c" -#include "bands.c" -#include "vq.c" -#include "cwrs.c" #include #include +#include "mathops.h" +#include "bands.h" #ifdef FIXED_POINT #define WORD "%d" @@ -212,7 +205,7 @@ void testexp2(void) float error2 = fabs(exp(0.6931471805599453094*x/1024.0)-celt_exp2(x)/65536.0); if (error1>0.0002&&error2>0.00004) { - fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2); + fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2); ret = 1; } } diff --git a/external/opus-1.0.3/celt/tests/test_unit_mdct.c b/external/opus-1.3.1/celt/tests/test_unit_mdct.c similarity index 65% rename from external/opus-1.0.3/celt/tests/test_unit_mdct.c rename to external/opus-1.3.1/celt/tests/test_unit_mdct.c index f8fb9acd..4a563ccf 100644 --- a/external/opus-1.0.3/celt/tests/test_unit_mdct.c +++ b/external/opus-1.3.1/celt/tests/test_unit_mdct.c @@ -29,22 +29,13 @@ #include "config.h" #endif -#define SKIP_CONFIG_H - -#ifndef CUSTOM_MODES -#define CUSTOM_MODES -#endif - #include -#define CELT_C #include "mdct.h" #include "stack_alloc.h" - -#include "kiss_fft.c" -#include "mdct.c" -#include "mathops.c" -#include "entcode.c" +#include "kiss_fft.h" +#include "mdct.h" +#include "modes.h" #ifndef M_PI #define M_PI 3.141592653 @@ -112,18 +103,38 @@ void check_inv(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinver } -void test1d(int nfft,int isinverse) +void test1d(int nfft,int isinverse,int arch) { - mdct_lookup cfg; size_t buflen = sizeof(kiss_fft_scalar)*nfft; - - kiss_fft_scalar * in = (kiss_fft_scalar*)malloc(buflen); - kiss_fft_scalar * in_copy = (kiss_fft_scalar*)malloc(buflen); - kiss_fft_scalar * out= (kiss_fft_scalar*)malloc(buflen); - opus_val16 * window= (opus_val16*)malloc(sizeof(opus_val16)*nfft/2); + kiss_fft_scalar *in; + kiss_fft_scalar *in_copy; + kiss_fft_scalar *out; + opus_val16 *window; int k; - clt_mdct_init(&cfg, nfft, 0); +#ifdef CUSTOM_MODES + int shift = 0; + const mdct_lookup *cfg; + mdct_lookup _cfg; + clt_mdct_init(&_cfg, nfft, 0, arch); + cfg = &_cfg; +#else + int shift; + const mdct_lookup *cfg; + CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); + if (nfft == 1920) shift = 0; + else if (nfft == 960) shift = 1; + else if (nfft == 480) shift = 2; + else if (nfft == 240) shift = 3; + else return; + cfg = &mode->mdct; +#endif + + in = (kiss_fft_scalar*)malloc(buflen); + in_copy = (kiss_fft_scalar*)malloc(buflen); + out = (kiss_fft_scalar*)malloc(buflen); + window = (opus_val16*)malloc(sizeof(opus_val16)*nfft/2); + for (k=0;k1) { int k; for (k=1;k #include -#include "vq.c" -#include "cwrs.c" -#include "entcode.c" -#include "entenc.c" -#include "entdec.c" -#include "mathops.c" +#include "vq.h" #include "bands.h" +#include "stack_alloc.h" #include + + #define MAX_SIZE 100 int ret=0; diff --git a/external/opus-1.0.3/celt/tests/test_unit_types.c b/external/opus-1.3.1/celt/tests/test_unit_types.c similarity index 100% rename from external/opus-1.0.3/celt/tests/test_unit_types.c rename to external/opus-1.3.1/celt/tests/test_unit_types.c diff --git a/external/opus-1.0.3/celt/vq.c b/external/opus-1.3.1/celt/vq.c similarity index 72% rename from external/opus-1.0.3/celt/vq.c rename to external/opus-1.3.1/celt/vq.c index a40d8214..8011e225 100644 --- a/external/opus-1.0.3/celt/vq.c +++ b/external/opus-1.3.1/celt/vq.c @@ -37,19 +37,27 @@ #include "os_support.h" #include "bands.h" #include "rate.h" +#include "pitch.h" +#if defined(MIPSr1_ASM) +#include "mips/vq_mipsr1.h" +#endif + +#ifndef OVERRIDE_vq_exp_rotation1 static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s) { int i; + opus_val16 ms; celt_norm *Xptr; Xptr = X; + ms = NEG16(s); for (i=0;i=0;i--) @@ -57,12 +65,13 @@ static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_ celt_norm x1, x2; x1 = Xptr[0]; x2 = Xptr[stride]; - Xptr[stride] = EXTRACT16(SHR32(MULT16_16(c,x2) + MULT16_16(s,x1), 15)); - *Xptr-- = EXTRACT16(SHR32(MULT16_16(c,x1) - MULT16_16(s,x2), 15)); + Xptr[stride] = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x2), s, x1), 15)); + *Xptr-- = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x1), ms, x2), 15)); } } +#endif /* OVERRIDE_vq_exp_rotation1 */ -static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread) +void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread) { static const int SPREAD_FACTOR[3]={15,10,5}; int i; @@ -91,7 +100,7 @@ static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int } /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for extract_collapse_mask().*/ - len /= stride; + len = celt_udiv(len, stride); for (i=0;i0, "alg_quant() needs at least one pulse"); - celt_assert2(N>1, "alg_quant() needs at least two dimensions"); - + (void)arch; ALLOC(y, N, celt_norm); - ALLOC(iy, N, int); - ALLOC(signx, N, opus_val16); - - exp_rotation(X, N, 1, B, K, spread); + ALLOC(signx, N, int); /* Get rid of the sign */ sum = 0; j=0; do { - if (X[j]>0) - signx[j]=1; - else { - signx[j]=-1; - X[j]=-X[j]; - } + signx[j] = X[j]<0; + /* OPT: Make sure the compiler doesn't use a branch on ABS16(). */ + X[j] = ABS16(X[j]); iy[j] = 0; y[j] = 0; } while (++j=1, "Allocated too many pulses in the quick pass"); + celt_sig_assert(pulsesLeft>=0); /* This should never happen, but just in case it does (e.g. on silence) we fill the first bin with pulses. */ #ifdef FIXED_POINT_DEBUG - celt_assert2(pulsesLeft<=N+3, "Not enough pulses in the quick pass"); + celt_sig_assert(pulsesLeft<=N+3); #endif if (pulsesLeft > N+3) { @@ -250,12 +250,12 @@ unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc pulsesLeft=0; } - s = 1; for (i=0;i= best_num/best_den, but that way we can do it without any division */ - /* OPT: Make sure to use conditional moves here */ - if (MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num)) + /* OPT: It's not clear whether a cmov is faster than a branch here + since the condition is more often false than true and using + a cmov introduces data dependencies across iterations. The optimal + choice may be architecture-dependent. */ + if (opus_unlikely(MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num))) { best_den = Ryy; best_num = Rxy; @@ -295,36 +311,58 @@ unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc /* Only now that we've made the final choice, update y/iy */ /* Multiplying y[j] by 2 so we don't have to do it everywhere else */ - y[best_id] += 2*s; + y[best_id] += 2; iy[best_id]++; } /* Put the original sign back */ j=0; do { - X[j] = MULT16_16(signx[j],X[j]); - if (signx[j] < 0) - iy[j] = -iy[j]; + /*iy[j] = signx[j] ? -iy[j] : iy[j];*/ + /* OPT: The is more likely to be compiled without a branch than the code above + but has the same performance otherwise. */ + iy[j] = (iy[j]^-signx[j]) + signx[j]; } while (++j0, "alg_quant() needs at least one pulse"); + celt_assert2(N>1, "alg_quant() needs at least two dimensions"); + + /* Covers vectorization by up to 4. */ + ALLOC(iy, N+3, int); + + exp_rotation(X, N, 1, B, K, spread); + + yy = op_pvq_search(X, iy, K, N, arch); + encode_pulses(iy, N, K, enc); -#ifdef RESYNTH - normalise_residual(iy, X, N, yy, gain); - exp_rotation(X, N, -1, B, K, spread); -#endif + if (resynth) + { + normalise_residual(iy, X, N, yy, gain); + exp_rotation(X, N, -1, B, K, spread); + } collapse_mask = extract_collapse_mask(iy, N, B); RESTORE_STACK; return collapse_mask; } -#endif /* OPUS_ENABLE_ENCODER */ /** Decode pulse vector and combine the result with the pitch vector to produce the final normalised signal in the current band. */ unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B, ec_dec *dec, opus_val16 gain) { - int i; opus_val32 Ryy; unsigned collapse_mask; VARDECL(int, iy); @@ -333,12 +371,7 @@ unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B, celt_assert2(K>0, "alg_unquant() needs at least one pulse"); celt_assert2(N>1, "alg_unquant() needs at least two dimensions"); ALLOC(iy, N, int); - decode_pulses(iy, N, K, dec); - Ryy = 0; - i=0; - do { - Ryy = MAC16_16(Ryy, iy[i], iy[i]); - } while (++i < N); + Ryy = decode_pulses(iy, N, K, dec); normalise_residual(iy, X, N, Ryy, gain); exp_rotation(X, N, -1, B, K, spread); collapse_mask = extract_collapse_mask(iy, N, B); @@ -346,21 +379,18 @@ unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B, return collapse_mask; } -void renormalise_vector(celt_norm *X, int N, opus_val16 gain) +#ifndef OVERRIDE_renormalise_vector +void renormalise_vector(celt_norm *X, int N, opus_val16 gain, int arch) { int i; #ifdef FIXED_POINT int k; #endif - opus_val32 E = EPSILON; + opus_val32 E; opus_val16 g; opus_val32 t; - celt_norm *xptr = X; - for (i=0;i>1; #endif @@ -375,8 +405,9 @@ void renormalise_vector(celt_norm *X, int N, opus_val16 gain) } /*return celt_sqrt(E);*/ } +#endif /* OVERRIDE_renormalise_vector */ -int stereo_itheta(celt_norm *X, celt_norm *Y, int stereo, int N) +int stereo_itheta(const celt_norm *X, const celt_norm *Y, int stereo, int N, int arch) { int i; int itheta; @@ -395,14 +426,8 @@ int stereo_itheta(celt_norm *X, celt_norm *Y, int stereo, int N) Eside = MAC16_16(Eside, s, s); } } else { - for (i=0;i +#include +#include +#include "celt_lpc.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "pitch.h" +#include "x86cpu.h" + +#if defined(FIXED_POINT) + +void celt_fir_sse4_1(const opus_val16 *x, + const opus_val16 *num, + opus_val16 *y, + int N, + int ord, + int arch) +{ + int i,j; + VARDECL(opus_val16, rnum); + + __m128i vecNoA; + opus_int32 noA ; + SAVE_STACK; + + ALLOC(rnum, ord, opus_val16); + for(i=0;i> 1; + vecNoA = _mm_set_epi32(noA, noA, noA, noA); + + for (i=0;i +#include "arch.h" + +void xcorr_kernel_sse(const opus_val16 *x, const opus_val16 *y, opus_val32 sum[4], int len) +{ + int j; + __m128 xsum1, xsum2; + xsum1 = _mm_loadu_ps(sum); + xsum2 = _mm_setzero_ps(); + + for (j = 0; j < len-3; j += 4) + { + __m128 x0 = _mm_loadu_ps(x+j); + __m128 yj = _mm_loadu_ps(y+j); + __m128 y3 = _mm_loadu_ps(y+j+3); + + xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0x00),yj)); + xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0x55), + _mm_shuffle_ps(yj,y3,0x49))); + xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0xaa), + _mm_shuffle_ps(yj,y3,0x9e))); + xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0xff),y3)); + } + if (j < len) + { + xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j))); + if (++j < len) + { + xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j))); + if (++j < len) + { + xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j))); + } + } + } + _mm_storeu_ps(sum,_mm_add_ps(xsum1,xsum2)); +} + + +void dual_inner_prod_sse(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, + int N, opus_val32 *xy1, opus_val32 *xy2) +{ + int i; + __m128 xsum1, xsum2; + xsum1 = _mm_setzero_ps(); + xsum2 = _mm_setzero_ps(); + for (i=0;i +#include + +#include "macros.h" +#include "celt_lpc.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "pitch.h" + +#if defined(OPUS_X86_MAY_HAVE_SSE2) && defined(FIXED_POINT) +opus_val32 celt_inner_prod_sse2(const opus_val16 *x, const opus_val16 *y, + int N) +{ + opus_int i, dataSize16; + opus_int32 sum; + + __m128i inVec1_76543210, inVec1_FEDCBA98, acc1; + __m128i inVec2_76543210, inVec2_FEDCBA98, acc2; + + sum = 0; + dataSize16 = N & ~15; + + acc1 = _mm_setzero_si128(); + acc2 = _mm_setzero_si128(); + + for (i=0;i= 8) + { + inVec1_76543210 = _mm_loadu_si128((__m128i *)(&x[i + 0])); + inVec2_76543210 = _mm_loadu_si128((__m128i *)(&y[i + 0])); + + inVec1_76543210 = _mm_madd_epi16(inVec1_76543210, inVec2_76543210); + + acc1 = _mm_add_epi32(acc1, inVec1_76543210); + i += 8; + } + + acc1 = _mm_add_epi32(acc1, _mm_unpackhi_epi64( acc1, acc1)); + acc1 = _mm_add_epi32(acc1, _mm_shufflelo_epi16( acc1, 0x0E)); + sum += _mm_cvtsi128_si32(acc1); + + for (;i +#include + +#include "macros.h" +#include "celt_lpc.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "pitch.h" + +#if defined(OPUS_X86_MAY_HAVE_SSE4_1) && defined(FIXED_POINT) +#include +#include "x86cpu.h" + +opus_val32 celt_inner_prod_sse4_1(const opus_val16 *x, const opus_val16 *y, + int N) +{ + opus_int i, dataSize16; + opus_int32 sum; + __m128i inVec1_76543210, inVec1_FEDCBA98, acc1; + __m128i inVec2_76543210, inVec2_FEDCBA98, acc2; + __m128i inVec1_3210, inVec2_3210; + + sum = 0; + dataSize16 = N & ~15; + + acc1 = _mm_setzero_si128(); + acc2 = _mm_setzero_si128(); + + for (i=0;i= 8) + { + inVec1_76543210 = _mm_loadu_si128((__m128i *)(&x[i + 0])); + inVec2_76543210 = _mm_loadu_si128((__m128i *)(&y[i + 0])); + + inVec1_76543210 = _mm_madd_epi16(inVec1_76543210, inVec2_76543210); + + acc1 = _mm_add_epi32(acc1, inVec1_76543210); + i += 8; + } + + if (N - i >= 4) + { + inVec1_3210 = OP_CVTEPI16_EPI32_M64(&x[i + 0]); + inVec2_3210 = OP_CVTEPI16_EPI32_M64(&y[i + 0]); + + inVec1_3210 = _mm_mullo_epi32(inVec1_3210, inVec2_3210); + + acc1 = _mm_add_epi32(acc1, inVec1_3210); + i += 4; + } + + acc1 = _mm_add_epi32(acc1, _mm_unpackhi_epi64(acc1, acc1)); + acc1 = _mm_add_epi32(acc1, _mm_shufflelo_epi16(acc1, 0x0E)); + + sum += _mm_cvtsi128_si32(acc1); + + for (;i= 3); + + sum0 = _mm_setzero_si128(); + sum1 = _mm_setzero_si128(); + sum2 = _mm_setzero_si128(); + sum3 = _mm_setzero_si128(); + + for (j=0;j<(len-7);j+=8) + { + vecX = _mm_loadu_si128((__m128i *)(&x[j + 0])); + vecY0 = _mm_loadu_si128((__m128i *)(&y[j + 0])); + vecY1 = _mm_loadu_si128((__m128i *)(&y[j + 1])); + vecY2 = _mm_loadu_si128((__m128i *)(&y[j + 2])); + vecY3 = _mm_loadu_si128((__m128i *)(&y[j + 3])); + + sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(vecX, vecY0)); + sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(vecX, vecY1)); + sum2 = _mm_add_epi32(sum2, _mm_madd_epi16(vecX, vecY2)); + sum3 = _mm_add_epi32(sum3, _mm_madd_epi16(vecX, vecY3)); + } + + sum0 = _mm_add_epi32(sum0, _mm_unpackhi_epi64( sum0, sum0)); + sum0 = _mm_add_epi32(sum0, _mm_shufflelo_epi16( sum0, 0x0E)); + + sum1 = _mm_add_epi32(sum1, _mm_unpackhi_epi64( sum1, sum1)); + sum1 = _mm_add_epi32(sum1, _mm_shufflelo_epi16( sum1, 0x0E)); + + sum2 = _mm_add_epi32(sum2, _mm_unpackhi_epi64( sum2, sum2)); + sum2 = _mm_add_epi32(sum2, _mm_shufflelo_epi16( sum2, 0x0E)); + + sum3 = _mm_add_epi32(sum3, _mm_unpackhi_epi64( sum3, sum3)); + sum3 = _mm_add_epi32(sum3, _mm_shufflelo_epi16( sum3, 0x0E)); + + vecSum = _mm_unpacklo_epi64(_mm_unpacklo_epi32(sum0, sum1), + _mm_unpacklo_epi32(sum2, sum3)); + + for (;j<(len-3);j+=4) + { + vecX = OP_CVTEPI16_EPI32_M64(&x[j + 0]); + vecX0 = _mm_shuffle_epi32(vecX, 0x00); + vecX1 = _mm_shuffle_epi32(vecX, 0x55); + vecX2 = _mm_shuffle_epi32(vecX, 0xaa); + vecX3 = _mm_shuffle_epi32(vecX, 0xff); + + vecY0 = OP_CVTEPI16_EPI32_M64(&y[j + 0]); + vecY1 = OP_CVTEPI16_EPI32_M64(&y[j + 1]); + vecY2 = OP_CVTEPI16_EPI32_M64(&y[j + 2]); + vecY3 = OP_CVTEPI16_EPI32_M64(&y[j + 3]); + + sum0 = _mm_mullo_epi32(vecX0, vecY0); + sum1 = _mm_mullo_epi32(vecX1, vecY1); + sum2 = _mm_mullo_epi32(vecX2, vecY2); + sum3 = _mm_mullo_epi32(vecX3, vecY3); + + sum0 = _mm_add_epi32(sum0, sum1); + sum2 = _mm_add_epi32(sum2, sum3); + vecSum = _mm_add_epi32(vecSum, sum0); + vecSum = _mm_add_epi32(vecSum, sum2); + } + + for (;j +#include +#include "celt_lpc.h" +#include "stack_alloc.h" +#include "mathops.h" +#include "vq.h" +#include "x86cpu.h" + + +#ifndef FIXED_POINT + +opus_val16 op_pvq_search_sse2(celt_norm *_X, int *iy, int K, int N, int arch) +{ + int i, j; + int pulsesLeft; + float xy, yy; + VARDECL(celt_norm, y); + VARDECL(celt_norm, X); + VARDECL(float, signy); + __m128 signmask; + __m128 sums; + __m128i fours; + SAVE_STACK; + + (void)arch; + /* All bits set to zero, except for the sign bit. */ + signmask = _mm_set_ps1(-0.f); + fours = _mm_set_epi32(4, 4, 4, 4); + ALLOC(y, N+3, celt_norm); + ALLOC(X, N+3, celt_norm); + ALLOC(signy, N+3, float); + + OPUS_COPY(X, _X, N); + X[N] = X[N+1] = X[N+2] = 0; + sums = _mm_setzero_ps(); + for (j=0;j (N>>1)) + { + __m128i pulses_sum; + __m128 yy4, xy4; + __m128 rcp4; + opus_val32 sum = _mm_cvtss_f32(sums); + /* If X is too small, just replace it with a pulse at 0 */ + /* Prevents infinities and NaNs from causing too many pulses + to be allocated. 64 is an approximation of infinity here. */ + if (!(sum > EPSILON && sum < 64)) + { + X[0] = QCONST16(1.f,14); + j=1; do + X[j]=0; + while (++j=0); + + /* This should never happen, but just in case it does (e.g. on silence) + we fill the first bin with pulses. */ + if (pulsesLeft > N+3) + { + opus_val16 tmp = (opus_val16)pulsesLeft; + yy = MAC16_16(yy, tmp, tmp); + yy = MAC16_16(yy, tmp, y[0]); + iy[0] += pulsesLeft; + pulsesLeft=0; + } + + for (i=0;i +static _inline void cpuid(unsigned int CPUInfo[4], unsigned int InfoType) +{ + __cpuid((int*)CPUInfo, InfoType); +} + +#else + +#if defined(CPU_INFO_BY_C) +#include +#endif + +static void cpuid(unsigned int CPUInfo[4], unsigned int InfoType) +{ +#if defined(CPU_INFO_BY_ASM) +#if defined(__i386__) && defined(__PIC__) +/* %ebx is PIC register in 32-bit, so mustn't clobber it. */ + __asm__ __volatile__ ( + "xchg %%ebx, %1\n" + "cpuid\n" + "xchg %%ebx, %1\n": + "=a" (CPUInfo[0]), + "=r" (CPUInfo[1]), + "=c" (CPUInfo[2]), + "=d" (CPUInfo[3]) : + "0" (InfoType) + ); +#else + __asm__ __volatile__ ( + "cpuid": + "=a" (CPUInfo[0]), + "=b" (CPUInfo[1]), + "=c" (CPUInfo[2]), + "=d" (CPUInfo[3]) : + "0" (InfoType) + ); +#endif +#elif defined(CPU_INFO_BY_C) + __get_cpuid(InfoType, &(CPUInfo[0]), &(CPUInfo[1]), &(CPUInfo[2]), &(CPUInfo[3])); +#endif +} + +#endif + +typedef struct CPU_Feature{ + /* SIMD: 128-bit */ + int HW_SSE; + int HW_SSE2; + int HW_SSE41; + /* SIMD: 256-bit */ + int HW_AVX; +} CPU_Feature; + +static void opus_cpu_feature_check(CPU_Feature *cpu_feature) +{ + unsigned int info[4] = {0}; + unsigned int nIds = 0; + + cpuid(info, 0); + nIds = info[0]; + + if (nIds >= 1){ + cpuid(info, 1); + cpu_feature->HW_SSE = (info[3] & (1 << 25)) != 0; + cpu_feature->HW_SSE2 = (info[3] & (1 << 26)) != 0; + cpu_feature->HW_SSE41 = (info[2] & (1 << 19)) != 0; + cpu_feature->HW_AVX = (info[2] & (1 << 28)) != 0; + } + else { + cpu_feature->HW_SSE = 0; + cpu_feature->HW_SSE2 = 0; + cpu_feature->HW_SSE41 = 0; + cpu_feature->HW_AVX = 0; + } +} + +int opus_select_arch(void) +{ + CPU_Feature cpu_feature; + int arch; + + opus_cpu_feature_check(&cpu_feature); + + arch = 0; + if (!cpu_feature.HW_SSE) + { + return arch; + } + arch++; + + if (!cpu_feature.HW_SSE2) + { + return arch; + } + arch++; + + if (!cpu_feature.HW_SSE41) + { + return arch; + } + arch++; + + if (!cpu_feature.HW_AVX) + { + return arch; + } + arch++; + + return arch; +} + +#endif diff --git a/external/opus-1.3.1/celt/x86/x86cpu.h b/external/opus-1.3.1/celt/x86/x86cpu.h new file mode 100644 index 00000000..1e2bf17b --- /dev/null +++ b/external/opus-1.3.1/celt/x86/x86cpu.h @@ -0,0 +1,95 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if !defined(X86CPU_H) +# define X86CPU_H + +# if defined(OPUS_X86_MAY_HAVE_SSE) +# define MAY_HAVE_SSE(name) name ## _sse +# else +# define MAY_HAVE_SSE(name) name ## _c +# endif + +# if defined(OPUS_X86_MAY_HAVE_SSE2) +# define MAY_HAVE_SSE2(name) name ## _sse2 +# else +# define MAY_HAVE_SSE2(name) name ## _c +# endif + +# if defined(OPUS_X86_MAY_HAVE_SSE4_1) +# define MAY_HAVE_SSE4_1(name) name ## _sse4_1 +# else +# define MAY_HAVE_SSE4_1(name) name ## _c +# endif + +# if defined(OPUS_X86_MAY_HAVE_AVX) +# define MAY_HAVE_AVX(name) name ## _avx +# else +# define MAY_HAVE_AVX(name) name ## _c +# endif + +# if defined(OPUS_HAVE_RTCD) +int opus_select_arch(void); +# endif + +/*gcc appears to emit MOVDQA's to load the argument of an _mm_cvtepi8_epi32() + or _mm_cvtepi16_epi32() when optimizations are disabled, even though the + actual PMOVSXWD instruction takes an m32 or m64. Unlike a normal memory + reference, these require 16-byte alignment and load a full 16 bytes (instead + of 4 or 8), possibly reading out of bounds. + + We can insert an explicit MOVD or MOVQ using _mm_cvtsi32_si128() or + _mm_loadl_epi64(), which should have the same semantics as an m32 or m64 + reference in the PMOVSXWD instruction itself, but gcc is not smart enough to + optimize this out when optimizations ARE enabled. + + Clang, in contrast, requires us to do this always for _mm_cvtepi8_epi32 + (which is fair, since technically the compiler is always allowed to do the + dereference before invoking the function implementing the intrinsic). + However, it is smart enough to eliminate the extra MOVD instruction. + For _mm_cvtepi16_epi32, it does the right thing, though does *not* optimize out + the extra MOVQ if it's specified explicitly */ + +# if defined(__clang__) || !defined(__OPTIMIZE__) +# define OP_CVTEPI8_EPI32_M32(x) \ + (_mm_cvtepi8_epi32(_mm_cvtsi32_si128(*(int *)(x)))) +# else +# define OP_CVTEPI8_EPI32_M32(x) \ + (_mm_cvtepi8_epi32(*(__m128i *)(x))) +#endif + +/* similar reasoning about the instruction sequence as in the 32-bit macro above, + */ +# if defined(__clang__) || !defined(__OPTIMIZE__) +# define OP_CVTEPI16_EPI32_M64(x) \ + (_mm_cvtepi16_epi32(_mm_loadl_epi64((__m128i *)(x)))) +# else +# define OP_CVTEPI16_EPI32_M64(x) \ + (_mm_cvtepi16_epi32(*(__m128i *)(x))) +# endif + +#endif diff --git a/external/opus-1.3.1/celt_headers.mk b/external/opus-1.3.1/celt_headers.mk new file mode 100644 index 00000000..706185da --- /dev/null +++ b/external/opus-1.3.1/celt_headers.mk @@ -0,0 +1,53 @@ +CELT_HEAD = \ +celt/arch.h \ +celt/bands.h \ +celt/celt.h \ +celt/cpu_support.h \ +include/opus_types.h \ +include/opus_defines.h \ +include/opus_custom.h \ +celt/cwrs.h \ +celt/ecintrin.h \ +celt/entcode.h \ +celt/entdec.h \ +celt/entenc.h \ +celt/fixed_debug.h \ +celt/fixed_generic.h \ +celt/float_cast.h \ +celt/_kiss_fft_guts.h \ +celt/kiss_fft.h \ +celt/laplace.h \ +celt/mathops.h \ +celt/mdct.h \ +celt/mfrngcod.h \ +celt/modes.h \ +celt/os_support.h \ +celt/pitch.h \ +celt/celt_lpc.h \ +celt/x86/celt_lpc_sse.h \ +celt/quant_bands.h \ +celt/rate.h \ +celt/stack_alloc.h \ +celt/vq.h \ +celt/static_modes_float.h \ +celt/static_modes_fixed.h \ +celt/static_modes_float_arm_ne10.h \ +celt/static_modes_fixed_arm_ne10.h \ +celt/arm/armcpu.h \ +celt/arm/fixed_armv4.h \ +celt/arm/fixed_armv5e.h \ +celt/arm/fixed_arm64.h \ +celt/arm/kiss_fft_armv4.h \ +celt/arm/kiss_fft_armv5e.h \ +celt/arm/pitch_arm.h \ +celt/arm/fft_arm.h \ +celt/arm/mdct_arm.h \ +celt/mips/celt_mipsr1.h \ +celt/mips/fixed_generic_mipsr1.h \ +celt/mips/kiss_fft_mipsr1.h \ +celt/mips/mdct_mipsr1.h \ +celt/mips/pitch_mipsr1.h \ +celt/mips/vq_mipsr1.h \ +celt/x86/pitch_sse.h \ +celt/x86/vq_sse.h \ +celt/x86/x86cpu.h diff --git a/external/opus-1.3.1/celt_sources.mk b/external/opus-1.3.1/celt_sources.mk new file mode 100644 index 00000000..c9dab06e --- /dev/null +++ b/external/opus-1.3.1/celt_sources.mk @@ -0,0 +1,50 @@ +CELT_SOURCES = \ +celt/bands.c \ +celt/celt.c \ +celt/celt_encoder.c \ +celt/celt_decoder.c \ +celt/cwrs.c \ +celt/entcode.c \ +celt/entdec.c \ +celt/entenc.c \ +celt/kiss_fft.c \ +celt/laplace.c \ +celt/mathops.c \ +celt/mdct.c \ +celt/modes.c \ +celt/pitch.c \ +celt/celt_lpc.c \ +celt/quant_bands.c \ +celt/rate.c \ +celt/vq.c + +CELT_SOURCES_SSE = \ +celt/x86/x86cpu.c \ +celt/x86/x86_celt_map.c \ +celt/x86/pitch_sse.c + +CELT_SOURCES_SSE2 = \ +celt/x86/pitch_sse2.c \ +celt/x86/vq_sse2.c + +CELT_SOURCES_SSE4_1 = \ +celt/x86/celt_lpc_sse4_1.c \ +celt/x86/pitch_sse4_1.c + +CELT_SOURCES_ARM = \ +celt/arm/armcpu.c \ +celt/arm/arm_celt_map.c + +CELT_SOURCES_ARM_ASM = \ +celt/arm/celt_pitch_xcorr_arm.s + +CELT_AM_SOURCES_ARM_ASM = \ +celt/arm/armopts.s.in + +CELT_SOURCES_ARM_NEON_INTR = \ +celt/arm/celt_neon_intr.c \ +celt/arm/pitch_neon_intr.c + +CELT_SOURCES_ARM_NE10 = \ +celt/arm/celt_fft_ne10.c \ +celt/arm/celt_mdct_ne10.c diff --git a/external/opusfile-0.10/compile b/external/opus-1.3.1/compile similarity index 97% rename from external/opusfile-0.10/compile rename to external/opus-1.3.1/compile index a85b723c..2ab71e4e 100755 --- a/external/opusfile-0.10/compile +++ b/external/opus-1.3.1/compile @@ -1,9 +1,9 @@ #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. -scriptversion=2012-10-14.11; # UTC +scriptversion=2016-01-11.22; # UTC -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -255,7 +255,8 @@ EOF echo "compile $scriptversion" exit $? ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac @@ -342,6 +343,6 @@ exit $ret # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/external/opusfile-0.10/config.guess b/external/opus-1.3.1/config.guess similarity index 97% rename from external/opusfile-0.10/config.guess rename to external/opus-1.3.1/config.guess index 2e9ad7fe..a7448442 100755 --- a/external/opusfile-0.10/config.guess +++ b/external/opus-1.3.1/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2016 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2016-10-02' +timestamp='2017-08-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2016 Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -259,6 +259,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; + *:Redox:*:*) + echo ${UNAME_MACHINE}-unknown-redox + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -837,10 +840,11 @@ EOF UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin @@ -1303,14 +1307,21 @@ EOF if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub @@ -1334,15 +1345,18 @@ EOF *:QNX:*:4*) echo i386-pc-qnx exit ;; - NEO-?:NONSTOP_KERNEL:*:*) + NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; - NSR-?:NONSTOP_KERNEL:*:*) + NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk${UNAME_RELEASE} + exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; @@ -1418,8 +1432,8 @@ cat >&2 < header file. */ #undef HAVE_ALLOCA_H +/* NE10 library is installed on host. Make sure it is on target! */ +#undef HAVE_ARM_NE10 + /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H -/* Define to 1 if you have the header file. */ -#undef HAVE_GETOPT_H - /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H @@ -63,18 +78,83 @@ /* Define to 1 if you have the `__malloc_hook' function. */ #undef HAVE___MALLOC_HOOK -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ +/* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O +/* Make use of ARM asm optimization */ +#undef OPUS_ARM_ASM + +/* Use generic ARMv4 inline asm optimizations */ +#undef OPUS_ARM_INLINE_ASM + +/* Use ARMv5E inline asm optimizations */ +#undef OPUS_ARM_INLINE_EDSP + +/* Use ARMv6 inline asm optimizations */ +#undef OPUS_ARM_INLINE_MEDIA + +/* Use ARM NEON inline asm optimizations */ +#undef OPUS_ARM_INLINE_NEON + +/* Define if assembler supports EDSP instructions */ +#undef OPUS_ARM_MAY_HAVE_EDSP + +/* Define if assembler supports ARMv6 media instructions */ +#undef OPUS_ARM_MAY_HAVE_MEDIA + +/* Define if compiler supports NEON instructions */ +#undef OPUS_ARM_MAY_HAVE_NEON + +/* Compiler supports ARMv7/Aarch64 Neon Intrinsics */ +#undef OPUS_ARM_MAY_HAVE_NEON_INTR + +/* Define if binary requires Aarch64 Neon Intrinsics */ +#undef OPUS_ARM_PRESUME_AARCH64_NEON_INTR + +/* Define if binary requires EDSP instruction support */ +#undef OPUS_ARM_PRESUME_EDSP + +/* Define if binary requires ARMv6 media instruction support */ +#undef OPUS_ARM_PRESUME_MEDIA + +/* Define if binary requires NEON instruction support */ +#undef OPUS_ARM_PRESUME_NEON + +/* Define if binary requires NEON intrinsics support */ +#undef OPUS_ARM_PRESUME_NEON_INTR /* This is a build of OPUS */ #undef OPUS_BUILD -/* Compile with encoder support */ -#undef OPUS_ENABLE_ENCODER +/* Run bit-exactness checks between optimized and c implementations */ +#undef OPUS_CHECK_ASM + +/* Use run-time CPU capabilities detection */ +#undef OPUS_HAVE_RTCD + +/* Compiler supports X86 AVX Intrinsics */ +#undef OPUS_X86_MAY_HAVE_AVX + +/* Compiler supports X86 SSE Intrinsics */ +#undef OPUS_X86_MAY_HAVE_SSE + +/* Compiler supports X86 SSE2 Intrinsics */ +#undef OPUS_X86_MAY_HAVE_SSE2 + +/* Compiler supports X86 SSE4.1 Intrinsics */ +#undef OPUS_X86_MAY_HAVE_SSE4_1 + +/* Define if binary requires AVX intrinsics support */ +#undef OPUS_X86_PRESUME_AVX + +/* Define if binary requires SSE intrinsics support */ +#undef OPUS_X86_PRESUME_SSE + +/* Define if binary requires SSE2 intrinsics support */ +#undef OPUS_X86_PRESUME_SSE2 + +/* Define if binary requires SSE4.1 intrinsics support */ +#undef OPUS_X86_PRESUME_SSE4_1 /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT @@ -94,18 +174,6 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION -/* The size of `int', as computed by sizeof. */ -#undef SIZEOF_INT - -/* The size of `long', as computed by sizeof. */ -#undef SIZEOF_LONG - -/* The size of `long long', as computed by sizeof. */ -#undef SIZEOF_LONG_LONG - -/* The size of `short', as computed by sizeof. */ -#undef SIZEOF_SHORT - /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS diff --git a/external/opusfile-0.10/config.sub b/external/opus-1.3.1/config.sub similarity index 98% rename from external/opusfile-0.10/config.sub rename to external/opus-1.3.1/config.sub index 3478c1fd..932128b3 100755 --- a/external/opusfile-0.10/config.sub +++ b/external/opus-1.3.1/config.sub @@ -1,8 +1,8 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2016 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2016-11-19' +timestamp='2017-04-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -67,7 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2016 Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -263,7 +263,7 @@ case $basic_machine in | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ - | i370 | i860 | i960 | ia64 \ + | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ @@ -315,6 +315,7 @@ case $basic_machine in | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ + | wasm32 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) @@ -388,7 +389,7 @@ case $basic_machine in | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ @@ -446,6 +447,7 @@ case $basic_machine in | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ + | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -948,6 +950,9 @@ case $basic_machine in nsr-tandem) basic_machine=nsr-tandem ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf @@ -1040,7 +1045,7 @@ case $basic_machine in ;; ppc64) basic_machine=powerpc64-unknown ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown @@ -1243,6 +1248,9 @@ case $basic_machine in basic_machine=a29k-wrs os=-vxworks ;; + wasm32) + basic_machine=wasm32-unknown + ;; w65*) basic_machine=w65-wdc os=-none @@ -1409,7 +1417,7 @@ case $os in | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ - | -onefs* | -tirtos* | -phoenix* | -fuchsia*) + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1638,6 +1646,9 @@ case $basic_machine in sparc-* | *-sun) os=-sunos4.1.1 ;; + pru-*) + os=-elf + ;; *-be) os=-beos ;; diff --git a/external/opus-1.0.3/configure b/external/opus-1.3.1/configure similarity index 73% rename from external/opus-1.0.3/configure rename to external/opus-1.3.1/configure index cb3150ff..66237704 100755 --- a/external/opus-1.0.3/configure +++ b/external/opus-1.3.1/configure @@ -1,13 +1,11 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for opus 1.0.3. +# Generated by GNU Autoconf 2.69 for opus 1.3.1. # # Report bugs to . # # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation @@ -136,6 +134,31 @@ export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh @@ -169,7 +192,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi -test x\$exitcode = x0 || exit 1" +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && @@ -222,21 +246,25 @@ IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - # Preserve -v and -x to the replacement shell. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; - esac - exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi if test x$as_have_required = xno; then : @@ -339,6 +367,14 @@ $as_echo X"$as_dir" | } # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take @@ -460,6 +496,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -494,16 +534,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -515,28 +555,8 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -570,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='opus' PACKAGE_TARNAME='opus' -PACKAGE_VERSION='1.0.3' -PACKAGE_STRING='opus 1.0.3' +PACKAGE_VERSION='1.3.1' +PACKAGE_STRING='opus 1.3.1' PACKAGE_BUGREPORT='opus@xiph.org' PACKAGE_URL='' @@ -616,22 +636,64 @@ ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS -PC_LIBM PC_BUILD -USE_ENCODER_FALSE -USE_ENCODER_TRUE +EXTRA_PROGRAMS_FALSE +EXTRA_PROGRAMS_TRUE +HAVE_DOXYGEN_FALSE +HAVE_DOXYGEN_TRUE +HAVE_DOT +HAVE_DOXYGEN +OPUS_HAVE_RTCD +HAVE_ARM_NE10_FALSE +HAVE_ARM_NE10_TRUE +HAVE_ARM_NEON_INTR_FALSE +HAVE_ARM_NEON_INTR_TRUE +CPU_ARM_FALSE +CPU_ARM_TRUE +OPUS_X86_AVX_CFLAGS +OPUS_X86_SSE4_1_CFLAGS +OPUS_X86_SSE2_CFLAGS +OPUS_X86_SSE_CFLAGS +NE10_LIBS +NE10_CFLAGS +HAVE_ARM_NE10 +OPUS_ARM_NEON_INTR_CFLAGS +ARM_NEON_INTR_CFLAGS +X86_AVX_CFLAGS +X86_SSE4_1_CFLAGS +X86_SSE2_CFLAGS +X86_SSE_CFLAGS +HAVE_AVX_FALSE +HAVE_AVX_TRUE +HAVE_SSE4_1_FALSE +HAVE_SSE4_1_TRUE +HAVE_SSE2_FALSE +HAVE_SSE2_TRUE +HAVE_SSE_FALSE +HAVE_SSE_TRUE +ARM2GNU_PARAMS +OPUS_ARM_MAY_HAVE_NEON +OPUS_ARM_MAY_HAVE_MEDIA +OPUS_ARM_MAY_HAVE_EDSP +OPUS_ARM_EXTERNAL_ASM_FALSE +OPUS_ARM_EXTERNAL_ASM_TRUE +HAVE_PERL +OPUS_ARM_INLINE_ASM_FALSE +OPUS_ARM_INLINE_ASM_TRUE CUSTOM_MODES_FALSE CUSTOM_MODES_TRUE +DISABLE_FLOAT_API_FALSE +DISABLE_FLOAT_API_TRUE FIXED_POINT_FALSE FIXED_POINT_TRUE -SIZE32 -SIZE16 -SYMBOL_VISIBILITY -HAVE_DOXYGEN_FALSE -HAVE_DOXYGEN_TRUE -HAVE_DOXYGEN LIBM +am__fastdepCCAS_FALSE +am__fastdepCCAS_TRUE +CCASDEPMODE +CCASFLAGS +CCAS CPP +LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO @@ -758,18 +820,30 @@ enable_shared enable_static with_pic enable_fast_install +with_aix_soname enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock enable_fixed_point enable_fixed_point_debug +enable_float_api enable_custom_modes enable_float_approx +enable_asm +enable_rtcd +enable_intrinsics +with_NE10 +with_NE10_libraries +with_NE10_includes enable_assertions +enable_hardening enable_fuzzing +enable_check_asm enable_doc -enable_encoder +enable_extra_programs +enable_rfc8251 +enable_stack_protector ' ac_precious_vars='build_alias host_alias @@ -779,7 +853,15 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -CPP' +LT_SYS_LIBRARY_PATH +CPP +CCAS +CCASFLAGS +X86_SSE_CFLAGS +X86_SSE2_CFLAGS +X86_SSE4_1_CFLAGS +X86_AVX_CFLAGS +ARM_NEON_INTR_CFLAGS' # Initialize some variables set by options. @@ -1235,8 +1317,6 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1322,7 +1402,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures opus 1.0.3 to adapt to many kinds of systems. +\`configure' configures opus 1.3.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1392,7 +1472,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of opus 1.0.3:";; + short | recursive ) echo "Configuration of opus 1.3.1:";; esac cat <<\_ACEOF @@ -1400,34 +1480,63 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: `make V=1') - --disable-silent-rules verbose build output (undo: `make V=0') - --disable-maintainer-mode disable make rules and dependencies not useful - (and sometimes confusing) to the casual installer + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --disable-maintainer-mode + disable make rules and dependencies not useful (and + sometimes confusing) to the casual installer --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) - --enable-fixed-point compile without floating point (for machines without a fast enough FPU) - --enable-fixed-point-debug debug fixed-point implementation - --enable-custom-modes enable non-Opus modes, e.g. 44.1 kHz & 2^n frames - --enable-float-approx enable fast approximations for floating point - --enable-assertions enable additional software error checking - --enable-fuzzing causes the encoder to make random decisions + --enable-fixed-point compile without floating point (for machines without + a fast enough FPU) + --enable-fixed-point-debug + debug fixed-point implementation + --disable-float-api compile without the floating point API (for machines + with no float library) + --enable-custom-modes enable non-Opus modes, e.g. 44.1 kHz & 2^n frames + --enable-float-approx enable fast approximations for floating point + --disable-asm Disable assembly optimizations + --disable-rtcd Disable run-time CPU capabilities detection + --disable-intrinsics Disable intrinsics optimizations + --enable-assertions enable additional software error checking + --disable-hardening disable run-time checks that are cheap and safe for + use in production + --enable-fuzzing causes the encoder to make random decisions (do not + use in production) + --enable-check-asm enable bit-exactness checks between optimized and c + implementations --disable-doc Do not build API documentation - --enable-encoder compile with encoder support + --disable-extra-programs + Do not build extra programs (demo and tests) + --disable-rfc8251 Disable bitstream fixes from RFC 8251 + --disable-stack-protector + Disable compiler stack hardening Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-NE10=PFX Prefix where libNE10 is installed (optional) + --with-NE10-libraries=DIR + Directory where libNE10 library is installed + (optional) + --with-NE10-includes=DIR + Directory where libNE10 header files are installed + (optional) Some influential environment variables: CC C compiler command @@ -1437,7 +1546,22 @@ Some influential environment variables: LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. CPP C preprocessor + CCAS assembler compiler command (defaults to CC) + CCASFLAGS assembler compiler flags (defaults to CFLAGS) + X86_SSE_CFLAGS + C compiler flags to compile SSE intrinsics [default=-msse] + X86_SSE2_CFLAGS + C compiler flags to compile SSE2 intrinsics [default=-msse2] + X86_SSE4_1_CFLAGS + C compiler flags to compile SSE4.1 intrinsics [default=-msse4.1] + X86_AVX_CFLAGS + C compiler flags to compile AVX intrinsics [default=-mavx] + ARM_NEON_INTR_CFLAGS + C compiler flags to compile ARM NEON intrinsics + [default=-mfpu=neon / -mfpu=neon -mfloat-abi=softfp] Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1505,10 +1629,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -opus configure 1.0.3 -generated by GNU Autoconf 2.68 +opus configure 1.3.1 +generated by GNU Autoconf 2.69 -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1584,7 +1708,7 @@ $as_echo "$ac_try_echo"; } >&5 test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext + test -x conftest$ac_exeext }; then : ac_retval=0 else @@ -1870,190 +1994,12 @@ fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel - -# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES -# -------------------------------------------- -# Tries to find the compile-time value of EXPR in a program that includes -# INCLUDES, setting VAR accordingly. Returns whether the value could be -# computed -ac_fn_c_compute_int () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=0 ac_mid=0 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid; break -else - as_fn_arith $ac_mid + 1 && ac_lo=$as_val - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=-1 ac_mid=-1 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=$ac_mid; break -else - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - ac_lo= ac_hi= -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid -else - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in #(( -?*) eval "$3=\$ac_lo"; ac_retval=0 ;; -'') ac_retval=1 ;; -esac - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (($2) < 0) - { - long int i = longval (); - if (i != ($2)) - return 1; - fprintf (f, "%ld", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ($2)) - return 1; - fprintf (f, "%lu", i); - } - /* Do not output a trailing newline, as this causes \r\n confusion - on some platforms. */ - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by opus $as_me 1.0.3, which was -generated by GNU Autoconf 2.68. Invocation command line was +It was created by opus $as_me 1.3.1, which was +generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2403,15 +2349,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi -case $enable_silent_rules in -yes) AM_DEFAULT_VERBOSITY=0;; -no) AM_DEFAULT_VERBOSITY=1;; -*) AM_DEFAULT_VERBOSITY=0;; +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 @@ -2443,17 +2390,16 @@ fi AM_BACKSLASH='\' - # For libtool. -OPUS_LT_CURRENT=4 +OPUS_LT_CURRENT=8 OPUS_LT_REVISION=0 -OPUS_LT_AGE=4 +OPUS_LT_AGE=8 -am__api_version='1.11' +am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -2521,7 +2467,7 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -2579,9 +2525,6 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -2592,32 +2535,40 @@ case `pwd` in esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi - + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$2" = conftest.file ) then @@ -2629,6 +2580,16 @@ Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2639,8 +2600,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2651,15 +2612,15 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2668,10 +2629,10 @@ if test x"${install_sh}" != xset; then esac fi -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. +# will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. @@ -2690,7 +2651,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2730,7 +2691,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2781,7 +2742,7 @@ do test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2810,12 +2771,6 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -2834,7 +2789,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2920,7 +2875,7 @@ fi # Define the identity of the package. PACKAGE='opus' - VERSION='1.0.3' + VERSION='1.3.1' # Some tools Automake needs. @@ -2939,12 +2894,22 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' @@ -2952,6 +2917,49 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. @@ -3060,8 +3068,8 @@ esac -macro_version='2.4.2' -macro_revision='1.3337' +macro_version='2.4.6' +macro_revision='2.4.6' @@ -3075,7 +3083,7 @@ macro_revision='1.3337' -ltmain="$ac_aux_dir/ltmain.sh" +ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. @@ -3124,7 +3132,7 @@ func_echo_all () $ECHO "" } -case "$ECHO" in +case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 @@ -3165,7 +3173,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -3231,7 +3239,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3271,7 +3279,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3324,7 +3332,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3365,7 +3373,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -3423,7 +3431,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3467,7 +3475,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3913,8 +3921,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#include -#include +struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -3999,6 +4006,65 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 @@ -4010,8 +4076,8 @@ else # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -4046,16 +4112,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -4064,8 +4130,8 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else @@ -4073,7 +4139,7 @@ else fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -4149,7 +4215,7 @@ do for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue + as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in @@ -4225,7 +4291,7 @@ do for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4291,7 +4357,7 @@ do for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4358,7 +4424,7 @@ do for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue + as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in @@ -4428,19 +4494,19 @@ test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld -if test "$GCC" = yes; then +if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw + # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; @@ -4454,7 +4520,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; } while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done - test -z "$LD" && LD="$ac_prog" + test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. @@ -4465,7 +4531,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; } with_gnu_ld=unknown ;; esac -elif test "$with_gnu_ld" = yes; then +elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else @@ -4476,32 +4542,32 @@ if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" + lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } @@ -4544,33 +4610,38 @@ if ${lt_cv_path_NM+:} false; then : else if test -n "$NM"; then # Let the user override the test. - lt_cv_path_NM="$NM" + lt_cv_path_NM=$NM else - lt_nm_to_check="${ac_tool_prefix}nm" + lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" - break + break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" - break + break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but @@ -4581,15 +4652,15 @@ else esac fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : @@ -4614,7 +4685,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4658,7 +4729,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4695,9 +4766,9 @@ esac fi fi - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) - DUMPBIN="$DUMPBIN -symbols" + DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: @@ -4705,8 +4776,8 @@ fi esac fi - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" + if test : != "$DUMPBIN"; then + NM=$DUMPBIN fi fi test -z "$NM" && NM=nm @@ -4757,7 +4828,7 @@ if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 - teststring="ABCD" + teststring=ABCD case $build_os in msdosdjgpp*) @@ -4797,7 +4868,7 @@ else lt_cv_sys_max_cmd_len=8192; ;; - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` @@ -4847,22 +4918,23 @@ else ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do + for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough + test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring @@ -4880,7 +4952,7 @@ else fi -if test -n $lt_cv_sys_max_cmd_len ; then +if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else @@ -4898,30 +4970,6 @@ max_cmd_len=$lt_cv_sys_max_cmd_len : ${MV="mv -f"} : ${RM="rm -f"} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else @@ -5044,13 +5092,13 @@ esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then + if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi @@ -5082,7 +5130,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5122,7 +5170,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5178,13 +5226,13 @@ lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. +# 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) @@ -5211,8 +5259,7 @@ mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else @@ -5248,10 +5295,6 @@ freebsd* | dragonfly*) fi ;; -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - haiku*) lt_cv_deplibs_check_method=pass_all ;; @@ -5290,7 +5333,7 @@ irix5* | irix6* | nonstopux*) ;; # This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; @@ -5312,8 +5355,8 @@ newos6*) lt_cv_deplibs_check_method=pass_all ;; -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' @@ -5366,6 +5409,9 @@ sysv4 | sysv4.3*) tpf*) lt_cv_deplibs_check_method=pass_all ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; esac fi @@ -5428,7 +5474,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5468,7 +5514,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5523,8 +5569,8 @@ else case $host_os in cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib @@ -5536,7 +5582,7 @@ cygwin* | mingw* | pw32* | cegcc*) ;; *) # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" + lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac @@ -5572,7 +5618,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5616,7 +5662,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5691,7 +5737,7 @@ if ac_fn_c_try_compile "$LINENO"; then : ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - if test "$ac_status" -eq 0; then + if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 @@ -5699,7 +5745,7 @@ if ac_fn_c_try_compile "$LINENO"; then : ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - if test "$ac_status" -ne 0; then + if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi @@ -5712,7 +5758,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } -if test "x$lt_cv_ar_at_file" = xno; then +if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file @@ -5741,7 +5787,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5781,7 +5827,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5840,7 +5886,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5880,7 +5926,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5929,7 +5975,7 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in - openbsd*) + bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) @@ -6019,7 +6065,7 @@ cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; @@ -6052,14 +6098,44 @@ case `$NM -V 2>&1` in symcode='[ABCDGIRSTW]' ;; esac +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= @@ -6077,21 +6153,24 @@ for ac_symprfx in "" "_"; do # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" @@ -6139,11 +6218,11 @@ _LT_EOF if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST -#elif defined(__osf__) +#elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else @@ -6169,7 +6248,7 @@ lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; @@ -6189,13 +6268,13 @@ _LT_EOF mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" + LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then + test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS @@ -6216,7 +6295,7 @@ _LT_EOF rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then + if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= @@ -6258,6 +6337,16 @@ fi + + + + + + + + + + @@ -6281,9 +6370,9 @@ fi lt_sysroot= -case ${with_sysroot} in #( +case $with_sysroot in #( yes) - if test "$GCC" = yes; then + if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( @@ -6293,8 +6382,8 @@ case ${with_sysroot} in #( no|'') ;; #( *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac @@ -6306,44 +6395,126 @@ $as_echo "${lt_sysroot:-no}" >&6; } -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD fi -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) - HPUX_IA64_MODE="32" + HPUX_IA64_MODE=32 ;; *ELF-64*) - HPUX_IA64_MODE="64" + HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then + if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" @@ -6372,9 +6543,50 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 @@ -6388,9 +6600,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) - LD="${LD-ld} -m elf_i386" + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" ;; - ppc64-*linux*|powerpc64-*linux*) + powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -6409,7 +6631,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - ppc*-*linux*|powerpc*-*linux*) + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) @@ -6427,7 +6652,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" + SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } @@ -6467,13 +6692,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then + if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" + CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 @@ -6485,7 +6711,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } case $lt_cv_prog_gnu_ld in yes*) case $host in - i?86-*-solaris*) + i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) @@ -6494,7 +6720,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" + LD=${LD-ld}_sol2 fi ;; *) @@ -6510,7 +6736,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } ;; esac -need_locks="$enable_libtool_lock" +need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. @@ -6529,7 +6755,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6569,7 +6795,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6621,7 +6847,7 @@ else fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then +if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi @@ -6649,7 +6875,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6689,7 +6915,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6741,7 +6967,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6781,7 +7007,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6833,7 +7059,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6873,7 +7099,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6925,7 +7151,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6965,7 +7191,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7017,7 +7243,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7057,7 +7283,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7124,7 +7350,7 @@ if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then + if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the @@ -7142,7 +7368,7 @@ else cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 @@ -7181,7 +7407,7 @@ else fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 @@ -7210,7 +7436,7 @@ _LT_EOF _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 @@ -7223,32 +7449,32 @@ fi $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then + if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= @@ -7256,6 +7482,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; } ;; esac +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -7559,14 +7820,14 @@ if test "${enable_shared+set}" = set; then : *) enable_shared=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac else @@ -7590,14 +7851,14 @@ if test "${enable_static+set}" = set; then : *) enable_static=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac else @@ -7621,14 +7882,14 @@ if test "${with_pic+set}" = set; then : *) pic_mode=default # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac else @@ -7636,8 +7897,6 @@ else fi -test -z "$pic_mode" && pic_mode=default - @@ -7653,14 +7912,14 @@ if test "${enable_fast_install+set}" = set; then : *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac else @@ -7674,11 +7933,63 @@ fi + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + # This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" +LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' @@ -7727,7 +8038,7 @@ test -z "$LN_S" && LN_S="ln -s" -if test -n "${ZSH_VERSION+set}" ; then +if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi @@ -7766,7 +8077,7 @@ aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then + if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -7777,14 +8088,14 @@ esac ofile=libtool can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except MSVC, +# All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a -with_gnu_ld="$lt_cv_prog_gnu_ld" +with_gnu_ld=$lt_cv_prog_gnu_ld -old_CC="$CC" -old_CFLAGS="$CFLAGS" +old_CC=$CC +old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc @@ -7793,15 +8104,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +func_cc_basename $compiler +cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it @@ -7816,22 +8120,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then : else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : @@ -7854,13 +8158,13 @@ _LT_EOF break fi done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } @@ -7882,22 +8186,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then : else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : @@ -7920,13 +8224,13 @@ _LT_EOF break fi done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } @@ -7947,7 +8251,7 @@ esac # Use C for the default configuration in the libtool script -lt_save_CC="$CC" +lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -8009,7 +8313,7 @@ if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; @@ -8025,7 +8329,7 @@ else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins @@ -8055,7 +8359,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : @@ -8073,17 +8377,18 @@ lt_prog_compiler_pic= lt_prog_compiler_static= - if test "$GCC" = yes; then + if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi + lt_prog_compiler_pic='-fPIC' ;; amigaos*) @@ -8094,8 +8399,8 @@ lt_prog_compiler_static= ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac @@ -8111,6 +8416,11 @@ lt_prog_compiler_static= # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac ;; darwin* | rhapsody*) @@ -8181,7 +8491,7 @@ lt_prog_compiler_static= case $host_os in aix*) lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else @@ -8189,10 +8499,29 @@ lt_prog_compiler_static= fi ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac ;; hpux9* | hpux10* | hpux11*) @@ -8208,7 +8537,7 @@ lt_prog_compiler_static= ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' + lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) @@ -8217,9 +8546,9 @@ lt_prog_compiler_static= lt_prog_compiler_static='-non_shared' ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. + # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' @@ -8244,6 +8573,12 @@ lt_prog_compiler_static= lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) @@ -8341,7 +8676,7 @@ lt_prog_compiler_static= ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi @@ -8370,7 +8705,7 @@ lt_prog_compiler_static= fi case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: + # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; @@ -8402,7 +8737,7 @@ else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins @@ -8432,7 +8767,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then +if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; @@ -8464,7 +8799,7 @@ if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then @@ -8483,13 +8818,13 @@ else fi fi $RM -r conftest* - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } -if test x"$lt_cv_prog_compiler_static_works" = xyes; then +if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= @@ -8609,8 +8944,8 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } @@ -8622,9 +8957,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; } ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else @@ -8667,9 +9002,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if @@ -8684,7 +9019,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. - if test "$GCC" != yes; then + if test yes != "$GCC"; then with_gnu_ld=no fi ;; @@ -8692,7 +9027,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; - openbsd*) + openbsd* | bitrig*) with_gnu_ld=no ;; esac @@ -8702,7 +9037,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility @@ -8724,24 +9059,24 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie esac fi - if test "$lt_use_gnu_ld_interface" = yes; then + if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' + wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no - case `$LD -v 2>&1` in + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... @@ -8754,7 +9089,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then + if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 @@ -8773,7 +9108,7 @@ _LT_EOF case $host_cpu in powerpc) # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) @@ -8789,7 +9124,7 @@ _LT_EOF allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi @@ -8799,7 +9134,7 @@ _LT_EOF # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' + export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes @@ -8807,61 +9142,89 @@ _LT_EOF exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no - if test "$host_os" = linux-dietlibc; then + if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no + && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; @@ -8872,42 +9235,47 @@ _LT_EOF lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac @@ -8921,8 +9289,8 @@ _LT_EOF archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; @@ -8940,8 +9308,8 @@ _LT_EOF _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi @@ -8953,7 +9321,7 @@ _LT_EOF ld_shlibs=no cat <<_LT_EOF 1>&2 -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify @@ -8968,9 +9336,9 @@ _LT_EOF # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi @@ -8987,15 +9355,15 @@ _LT_EOF *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac - if test "$ld_shlibs" = no; then + if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= @@ -9011,7 +9379,7 @@ _LT_EOF # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported @@ -9019,34 +9387,57 @@ _LT_EOF ;; aix[4-9]*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' - no_entry_flag="" + no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi ;; esac @@ -9065,13 +9456,21 @@ _LT_EOF hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes - file_list_spec='${wl}-f,' + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac - if test "$GCC" = yes; then + if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` + collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then @@ -9090,35 +9489,42 @@ _LT_EOF ;; esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else # not using gcc - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' else - shared_flag='${wl}-bM:SRE' + shared_flag='$wl-bM:SRE' fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' fi fi - export_dynamic_flag_spec='${wl}-bexpall' + export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then + if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : @@ -9153,7 +9559,7 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" + lt_cv_aix_libpath_=/usr/lib:/lib fi fi @@ -9161,17 +9567,17 @@ fi aix_libpath=$lt_cv_aix_libpath_ fi - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then + if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : @@ -9206,7 +9612,7 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" + lt_cv_aix_libpath_=/usr/lib:/lib fi fi @@ -9214,21 +9620,33 @@ fi aix_libpath=$lt_cv_aix_libpath_ fi - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; @@ -9237,7 +9655,7 @@ fi case $host_cpu in powerpc) # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) @@ -9267,16 +9685,17 @@ fi # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes @@ -9285,18 +9704,18 @@ fi # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' ;; *) # Assume MSVC wrapper @@ -9305,7 +9724,7 @@ fi # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. @@ -9324,24 +9743,24 @@ fi hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" + allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; + ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac - if test "$_lt_dar_can_shared" = "yes"; then + if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no @@ -9383,33 +9802,33 @@ fi ;; hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' + export_dynamic_flag_spec='$wl-E' ;; hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' + export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes @@ -9417,25 +9836,25 @@ fi ;; hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then + if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) @@ -9447,7 +9866,7 @@ if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then @@ -9466,14 +9885,14 @@ else fi fi $RM -r conftest* - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi @@ -9481,8 +9900,8 @@ fi ;; esac fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in @@ -9493,7 +9912,7 @@ fi *) hardcode_direct=yes hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' + export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. @@ -9504,8 +9923,8 @@ fi ;; irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. @@ -9515,8 +9934,8 @@ $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " > if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } @@ -9528,24 +9947,34 @@ else fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out @@ -9560,7 +9989,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; @@ -9568,27 +9997,19 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } *nto* | *qnx*) ;; - openbsd*) + openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no @@ -9599,33 +10020,53 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes ;; osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' @@ -9636,24 +10077,24 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } solaris*) no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi @@ -9663,11 +10104,11 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', + # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi @@ -9677,10 +10118,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } ;; sunos4*) - if test "x$host_vendor" = xsequent; then + if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi @@ -9729,43 +10170,43 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' + no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not + # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' + export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; @@ -9780,10 +10221,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } ;; esac - if test x$host_vendor = xsni; then + if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' + export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi @@ -9791,7 +10232,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no +test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld @@ -9817,7 +10258,7 @@ x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes - if test "$enable_shared" = yes && test "$GCC" = yes; then + if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. @@ -10032,14 +10473,14 @@ esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in @@ -10058,8 +10499,8 @@ if test "$GCC" = yes; then # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - # ...but if some path already ends with the multilib dir we assume - # that all is fine and trust -print-search-dirs as is (GCC 4.2 or newer). + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= @@ -10074,16 +10515,16 @@ if test "$GCC" = yes; then fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; + lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } @@ -10097,7 +10538,7 @@ BEGIN {RS=" "; FS="/|\n";} { # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else @@ -10106,7 +10547,7 @@ fi library_names_spec= libname_spec='lib$name' soname_spec= -shrext_cmds=".so" +shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -10123,14 +10564,16 @@ hardcode_into_libs=no # flags to be left without arguments need_version=unknown + + case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' + soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) @@ -10138,41 +10581,91 @@ aix[4-9]*) need_lib_prefix=no need_version=no hardcode_into_libs=yes - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac shlibpath_var=LIBPATH fi ;; @@ -10182,18 +10675,18 @@ amigaos*) powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) - library_names_spec='${libname}${shared_ext}' + library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; @@ -10201,8 +10694,8 @@ beos*) bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" @@ -10214,7 +10707,7 @@ bsdi[45]*) cygwin* | mingw* | pw32* | cegcc*) version_type=windows - shrext_cmds=".dll" + shrext_cmds=.dll need_version=no need_lib_prefix=no @@ -10223,8 +10716,8 @@ cygwin* | mingw* | pw32* | cegcc*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ @@ -10240,17 +10733,17 @@ cygwin* | mingw* | pw32* | cegcc*) case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' @@ -10259,8 +10752,8 @@ cygwin* | mingw* | pw32* | cegcc*) *,cl*) # Native MSVC libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' case $build_os in mingw*) @@ -10287,7 +10780,7 @@ cygwin* | mingw* | pw32* | cegcc*) sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) - sys_lib_search_path_spec="$LIB" + sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` @@ -10300,8 +10793,8 @@ cygwin* | mingw* | pw32* | cegcc*) esac # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' @@ -10314,7 +10807,7 @@ cygwin* | mingw* | pw32* | cegcc*) *) # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac @@ -10327,8 +10820,8 @@ darwin* | rhapsody*) version_type=darwin need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' @@ -10341,8 +10834,8 @@ dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; @@ -10360,12 +10853,13 @@ freebsd* | dragonfly*) version_type=freebsd-$objformat case $version_type in freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac @@ -10390,26 +10884,15 @@ freebsd* | dragonfly*) esac ;; -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes + shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -10427,14 +10910,15 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -10442,8 +10926,8 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; @@ -10452,8 +10936,8 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... @@ -10466,8 +10950,8 @@ interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -10478,7 +10962,7 @@ irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) - if test "$lt_cv_prog_gnu_ld" = yes; then + if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix @@ -10486,8 +10970,8 @@ irix5* | irix6* | nonstopux*) esac need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= @@ -10506,8 +10990,8 @@ irix5* | irix6* | nonstopux*) esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; @@ -10516,13 +11000,33 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + # This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -10569,11 +11073,15 @@ fi # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" - # Append ld.so.conf contents to the search path + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" - fi # We used to test for /lib/ld.so.1 and disable shared libraries on @@ -10590,12 +11098,12 @@ netbsd*) need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH @@ -10605,7 +11113,7 @@ netbsd*) newsos6) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; @@ -10614,58 +11122,68 @@ newsos6) version_type=qnx need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; -openbsd*) +openbsd* | bitrig*) version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" + sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no else - shlibpath_overrides_runpath=yes + need_version=yes fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' - shrext_cmds=".dll" + version_type=windows + shrext_cmds=.dll + need_version=no need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) @@ -10676,8 +11194,8 @@ solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes @@ -10687,11 +11205,11 @@ solaris*) sunos4*) version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes @@ -10699,8 +11217,8 @@ sunos4*) sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) @@ -10721,24 +11239,24 @@ sysv4 | sysv4.3*) ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf + version_type=sco need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' @@ -10756,7 +11274,7 @@ tpf*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes @@ -10764,8 +11282,8 @@ tpf*) uts4*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; @@ -10775,20 +11293,35 @@ uts4*) esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no +test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then +if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + @@ -10885,15 +11418,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then + test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && + if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else @@ -10908,12 +11441,12 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi @@ -10923,7 +11456,7 @@ fi - if test "x$enable_dlopen" != xyes; then + if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown @@ -10933,23 +11466,23 @@ else case $host_os in beos*) - lt_cv_dlopen="load_add_on" + lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) - lt_cv_dlopen="dlopen" + lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) - # if libdl is installed we need to link against it + # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : @@ -10987,10 +11520,10 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else - lt_cv_dlopen="dyld" + lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes @@ -10998,10 +11531,18 @@ fi ;; + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" + lt_cv_dlopen=shl_load else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } @@ -11040,11 +11581,11 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" + lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } @@ -11083,7 +11624,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } @@ -11122,7 +11663,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } @@ -11161,7 +11702,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi @@ -11182,21 +11723,21 @@ fi ;; esac - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else + if test no = "$lt_cv_dlopen"; then enable_dlopen=no + else + enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - save_LIBS="$LIBS" + save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 @@ -11204,7 +11745,7 @@ $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then : + if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -11251,9 +11792,9 @@ else # endif #endif -/* When -fvisbility=hidden is used, assume the code has been annotated +/* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif @@ -11283,7 +11824,7 @@ _LT_EOF (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -11303,14 +11844,14 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } - if test "x$lt_cv_dlopen_self" = xyes; then + if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then : + if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -11357,9 +11898,9 @@ else # endif #endif -/* When -fvisbility=hidden is used, assume the code has been annotated +/* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif @@ -11389,7 +11930,7 @@ _LT_EOF (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -11410,9 +11951,9 @@ fi $as_echo "$lt_cv_dlopen_self_static" >&6; } fi - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS ;; esac @@ -11456,7 +11997,7 @@ else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) - if test -n "$STRIP" ; then + if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -11484,7 +12025,7 @@ fi - # Report which library types will actually be built + # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 @@ -11492,13 +12033,13 @@ $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' @@ -11506,8 +12047,12 @@ $as_echo_n "checking whether to build shared libraries... " >&6; } ;; aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -11517,7 +12062,7 @@ $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } @@ -11531,7 +12076,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -CC="$lt_save_CC" +CC=$lt_save_CC @@ -11555,154 +12100,29 @@ CC="$lt_save_CC" # Only expand once: -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include +#include +#include +#include +#include -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 -$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } -if ${ac_cv_prog_cc_c99+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c99=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -#include - -// Check varargs macros. These examples are taken from C99 6.10.3.5. -#define debug(...) fprintf (stderr, __VA_ARGS__) -#define showlist(...) puts (#__VA_ARGS__) -#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) -static void -test_varargs_macros (void) +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) { int x = 1234; int y = 5678; @@ -11828,7 +12248,7 @@ main () return 0; } _ACEOF -for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : @@ -11870,11 +12290,11 @@ else int main () { -/* FIXME: Include the comments suggested by Paul. */ + #ifndef __cplusplus - /* Ultrix mips cc rejects this. */ + /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; - const charset cs; + const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; @@ -11891,8 +12311,9 @@ main () ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; @@ -11908,10 +12329,10 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this saying + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; @@ -11982,8 +12403,148 @@ _ACEOF esac +# By default we simply use the C compiler to build assembly code. + +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS + + + +depcc="$CCAS" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CCAS_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CCAS_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CCAS_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } +CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then + am__fastdepCCAS_TRUE= + am__fastdepCCAS_FALSE='#' +else + am__fastdepCCAS_TRUE='#' + am__fastdepCCAS_FALSE= +fi + + + + +$as_echo "#define OPUS_BUILD /**/" >>confdefs.h + + #Use a hacked up version of autoconf's AC_C_RESTRICT because it's not #strong enough a test to detect old buggy versions of GCC (e.g. 2.95.3) +#Note: Both this and the test for variable-size arrays below are also +# done by AC_PROG_CC_C99, but not thoroughly enough apparently. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : @@ -11995,16 +12556,16 @@ else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; - int foo (int_ptr $ac_kw ip, int * $ac_kw baz[]) { - return ip[0]; + int foo (int_ptr $ac_kw ip, int * $ac_kw baz[]) { + return ip[0]; } int main () { int s[1]; - int * $ac_kw t = s; - t[0] = 0; - return foo(t, (void *)0) + int * $ac_kw t = s; + t[0] = 0; + return foo(t, (void *)0) ; return 0; } @@ -12020,7 +12581,9 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } - case $ac_cv_c_restrict in + + +case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; @@ -12028,11 +12591,7 @@ $as_echo "$ac_cv_c_restrict" >&6; } #define restrict $ac_cv_c_restrict _ACEOF ;; - esac - - -$as_echo "#define OPUS_BUILD /**/" >>confdefs.h - +esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99 variable-size arrays" >&5 $as_echo_n "checking for C99 variable-size arrays... " >&6; } @@ -12048,75 +12607,114 @@ static int x; char a[++x]; a[sizeof a - 1] = 0; int N; return a[0]; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - has_var_arrays=yes; -$as_echo "#define VAR_ARRAYS /**/" >>confdefs.h + has_var_arrays=yes + use_alloca="no (using var arrays)" + +$as_echo "#define VAR_ARRAYS 1" >>confdefs.h else - has_var_arrays=no + + has_var_arrays=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_var_arrays" >&5 $as_echo "$has_var_arrays" >&6; } -for ac_header in alloca.h getopt.h +if test "$has_var_arrays" = "no"; then : + + for ac_header in alloca.h do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + ac_fn_c_check_header_mongrel "$LINENO" "alloca.h" "ac_cv_header_alloca_h" "$ac_includes_default" +if test "x$ac_cv_header_alloca_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ALLOCA_H 1 _ACEOF fi done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { - -int foo=10; -int *array = alloca(foo); - +int foo=10; int *array = alloca(foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - -has_alloca=yes; -if test x$has_var_arrays = "xno" ; then + use_alloca=yes; $as_echo "#define USE_ALLOCA /**/" >>confdefs.h -fi else - has_alloca=no + + use_alloca=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_alloca" >&5 -$as_echo "$has_alloca" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_alloca" >&5 +$as_echo "$use_alloca" >&6; } + +fi + +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 +$as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } +if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmw $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_fn_c_check_func "$LINENO" "exp" "ac_cv_func_exp" -if test "x$ac_cv_func_exp" = xyes; then : - fp_libm_not_needed=yes;LIBM= +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char _mwvalidcheckl (); +int +main () +{ +return _mwvalidcheckl (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mw__mwvalidcheckl=yes else - fp_libm_not_needed=dunno + ac_cv_lib_mw__mwvalidcheckl=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 +$as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } +if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : + LIBM=-lmw fi -if test x"$fp_libm_not_needed" = xdunno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exp in -lm" >&5 -$as_echo_n "checking for exp in -lm... " >&6; } -if ${ac_cv_lib_m_exp+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -12130,132 +12728,1794 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char exp (); +char cos (); int main () { -return exp (); +return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_m_exp=yes + ac_cv_lib_m_cos=yes else - ac_cv_lib_m_exp=no + ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_exp" >&5 -$as_echo "$ac_cv_lib_m_exp" >&6; } -if test "x$ac_cv_lib_m_exp" = xyes; then : - LIBS="-lm $LIBS"; LIBM="-lm" -else - LIBM= +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + LIBM="$LIBM -lm" fi -fi + ;; +*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_cos=yes +else + ac_cv_lib_m_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + LIBM=-lm +fi + + ;; +esac + + + +# Check whether --enable-fixed-point was given. +if test "${enable_fixed_point+set}" = set; then : + enableval=$enable_fixed_point; +else + enable_fixed_point=no +fi + + +if test "$enable_fixed_point" = "yes"; then : + + enable_float="no" + +$as_echo "#define FIXED_POINT 1" >>confdefs.h + + PC_BUILD="fixed-point" + +else + + enable_float="yes"; + PC_BUILD="floating-point" + +fi + + if test "$enable_fixed_point" = "yes"; then + FIXED_POINT_TRUE= + FIXED_POINT_FALSE='#' +else + FIXED_POINT_TRUE='#' + FIXED_POINT_FALSE= +fi + + +# Check whether --enable-fixed-point-debug was given. +if test "${enable_fixed_point_debug+set}" = set; then : + enableval=$enable_fixed_point_debug; +else + enable_fixed_point_debug=no +fi + + +if test "$enable_fixed_point_debug" = "yes"; then : + + +$as_echo "#define FIXED_DEBUG 1" >>confdefs.h + + +fi + +# Check whether --enable-float_api was given. +if test "${enable_float_api+set}" = set; then : + enableval=$enable_float_api; +else + enable_float_api=yes +fi + + + if test "$enable_float_api" = "no"; then + DISABLE_FLOAT_API_TRUE= + DISABLE_FLOAT_API_FALSE='#' +else + DISABLE_FLOAT_API_TRUE='#' + DISABLE_FLOAT_API_FALSE= +fi + + +if test "$enable_float_api" = "no"; then : + + +$as_echo "#define DISABLE_FLOAT_API 1" >>confdefs.h + + +fi + +# Check whether --enable-custom-modes was given. +if test "${enable_custom_modes+set}" = set; then : + enableval=$enable_custom_modes; +else + enable_custom_modes=no +fi + + +if test "$enable_custom_modes" = "yes"; then : + + +$as_echo "#define CUSTOM_MODES 1" >>confdefs.h + + PC_BUILD="$PC_BUILD, custom modes" + +fi + + if test "$enable_custom_modes" = "yes"; then + CUSTOM_MODES_TRUE= + CUSTOM_MODES_FALSE='#' +else + CUSTOM_MODES_TRUE='#' + CUSTOM_MODES_FALSE= +fi + + +has_float_approx=no +#case "$host_cpu" in +#i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64) +# has_float_approx=yes +# ;; +#esac + +# Check whether --enable-float-approx was given. +if test "${enable_float_approx+set}" = set; then : + enableval=$enable_float_approx; if test "$enable_float_approx" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Floating point approximations are not supported on all platforms." >&5 +$as_echo "$as_me: WARNING: Floating point approximations are not supported on all platforms." >&2;} + fi + +else + enable_float_approx=$has_float_approx +fi + + +if test "$enable_float_approx" = "yes"; then : + + +$as_echo "#define FLOAT_APPROX 1" >>confdefs.h + + +fi + +# Check whether --enable-asm was given. +if test "${enable_asm+set}" = set; then : + enableval=$enable_asm; +else + enable_asm=yes +fi + + +# Check whether --enable-rtcd was given. +if test "${enable_rtcd+set}" = set; then : + enableval=$enable_rtcd; +else + enable_rtcd=yes +fi + + +# Check whether --enable-intrinsics was given. +if test "${enable_intrinsics+set}" = set; then : + enableval=$enable_intrinsics; +else + enable_intrinsics=yes +fi + + +rtcd_support=no +cpu_arm=no + +if test x"${enable_asm}" = x"yes"; then : + + inline_optimization="No inline ASM for your platform, please send patches" + case $host_cpu in + arm*) + if test "$enable_float" != "yes"; then : + + cpu_arm=yes + +$as_echo "#define OPUS_ARM_ASM /**/" >>confdefs.h + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports gcc-style inline assembly" >&5 +$as_echo_n "checking if compiler supports gcc-style inline assembly... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifdef __GNUC_MINOR__ +#if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 +#error GCC before 3.4 has critical bugs compiling inline assembly +#endif +#endif +__asm__ (""::) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + if test "X$flag_ok" = Xyes ; then + inline_optimization="ARM" + true + else + inline_optimization="disabled" + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if assembler supports EDSP instructions on ARM" >&5 +$as_echo_n "checking if assembler supports EDSP instructions on ARM... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +__asm__("qadd r3,r3,r3") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_ARM_INLINE_EDSP=1 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_ARM_INLINE_EDSP=0 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if assembler supports ARMv6 media instructions on ARM" >&5 +$as_echo_n "checking if assembler supports ARMv6 media instructions on ARM... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +__asm__("shadd8 r3,r3,r3") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_ARM_INLINE_MEDIA=1 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_ARM_INLINE_MEDIA=0 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if assembler supports NEON instructions on ARM" >&5 +$as_echo_n "checking if assembler supports NEON instructions on ARM... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +__asm__("vorr d0,d0,d0") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_ARM_INLINE_NEON=1 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_ARM_INLINE_NEON=0 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + if test x"$inline_optimization" = x"ARM"; then : + + if true; then + OPUS_ARM_INLINE_ASM_TRUE= + OPUS_ARM_INLINE_ASM_FALSE='#' +else + OPUS_ARM_INLINE_ASM_TRUE='#' + OPUS_ARM_INLINE_ASM_FALSE= +fi + + +$as_echo "#define OPUS_ARM_INLINE_ASM 1" >>confdefs.h + + if test x"$OPUS_ARM_INLINE_EDSP" = x"1"; then : + + +$as_echo "#define OPUS_ARM_INLINE_EDSP 1" >>confdefs.h + + inline_optimization="$inline_optimization (EDSP)" + +fi + if test x"$OPUS_ARM_INLINE_MEDIA" = x"1"; then : + + +$as_echo "#define OPUS_ARM_INLINE_MEDIA 1" >>confdefs.h + + inline_optimization="$inline_optimization (Media)" + +fi + if test x"$OPUS_ARM_INLINE_NEON" = x"1"; then : + + +$as_echo "#define OPUS_ARM_INLINE_NEON 1" >>confdefs.h + + inline_optimization="$inline_optimization (NEON)" + +fi + +fi + # Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_PERL"; then + ac_cv_prog_HAVE_PERL="$HAVE_PERL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_PERL="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_PERL" && ac_cv_prog_HAVE_PERL="no" +fi +fi +HAVE_PERL=$ac_cv_prog_HAVE_PERL +if test -n "$HAVE_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_PERL" >&5 +$as_echo "$HAVE_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$HAVE_PERL" = x"yes"; then : + + if true; then + OPUS_ARM_EXTERNAL_ASM_TRUE= + OPUS_ARM_EXTERNAL_ASM_FALSE='#' +else + OPUS_ARM_EXTERNAL_ASM_TRUE='#' + OPUS_ARM_EXTERNAL_ASM_FALSE= +fi + + asm_optimization="ARM" + if test x"$OPUS_ARM_INLINE_EDSP" = x"1"; then : + + OPUS_ARM_PRESUME_EDSP=1 + OPUS_ARM_MAY_HAVE_EDSP=1 + +else + + OPUS_ARM_PRESUME_EDSP=0 + OPUS_ARM_MAY_HAVE_EDSP=0 + +fi + if test x"$OPUS_ARM_INLINE_MEDIA" = x"1"; then : + + OPUS_ARM_PRESUME_MEDIA=1 + OPUS_ARM_MAY_HAVE_MEDIA=1 + +else + + OPUS_ARM_PRESUME_MEDIA=0 + OPUS_ARM_MAY_HAVE_MEDIA=0 + +fi + if test x"$OPUS_ARM_INLINE_NEON" = x"1"; then : + + OPUS_ARM_PRESUME_NEON=1 + OPUS_ARM_MAY_HAVE_NEON=1 + +else + + OPUS_ARM_PRESUME_NEON=0 + OPUS_ARM_MAY_HAVE_NEON=0 + +fi + if test x"$enable_rtcd" = x"yes"; then : + + if test x"$OPUS_ARM_MAY_HAVE_EDSP" != x"1"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: Trying to force-enable armv5e EDSP instructions..." >&5 +$as_echo "$as_me: Trying to force-enable armv5e EDSP instructions..." >&6;} + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if assembler supports EDSP instructions on ARM" >&5 +$as_echo_n "checking if assembler supports EDSP instructions on ARM... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +__asm__(".arch armv5te\n.object_arch armv4t\nqadd r3,r3,r3") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_ARM_MAY_HAVE_EDSP=1 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi + if test x"$OPUS_ARM_MAY_HAVE_MEDIA" != x"1"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: Trying to force-enable ARMv6 media instructions..." >&5 +$as_echo "$as_me: Trying to force-enable ARMv6 media instructions..." >&6;} + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if assembler supports ARMv6 media instructions on ARM" >&5 +$as_echo_n "checking if assembler supports ARMv6 media instructions on ARM... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +__asm__(".arch armv6\n.object_arch armv4t\nshadd8 r3,r3,r3") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_ARM_MAY_HAVE_MEDIA=1 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi + if test x"$OPUS_ARM_MAY_HAVE_NEON" != x"1"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: Trying to force-enable NEON instructions..." >&5 +$as_echo "$as_me: Trying to force-enable NEON instructions..." >&6;} + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if assembler supports NEON instructions on ARM" >&5 +$as_echo_n "checking if assembler supports NEON instructions on ARM... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +__asm__(".arch armv7-a\n.fpu neon\n.object_arch armv4t\nvorr d0,d0,d0") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_ARM_MAY_HAVE_NEON=1 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi + +fi + rtcd_support= + if test x"$OPUS_ARM_MAY_HAVE_EDSP" = x"1"; then : + + +$as_echo "#define OPUS_ARM_MAY_HAVE_EDSP 1" >>confdefs.h + + if test x"$OPUS_ARM_PRESUME_EDSP" = x"1"; then : + + +$as_echo "#define OPUS_ARM_PRESUME_EDSP 1" >>confdefs.h + + asm_optimization="$asm_optimization (EDSP)" + +else + rtcd_support="$rtcd_support (EDSP)" + +fi + +fi + + if test x"$OPUS_ARM_MAY_HAVE_MEDIA" = x"1"; then : + + +$as_echo "#define OPUS_ARM_MAY_HAVE_MEDIA 1" >>confdefs.h + + if test x"$OPUS_ARM_PRESUME_MEDIA" = x"1"; then : + + +$as_echo "#define OPUS_ARM_PRESUME_MEDIA 1" >>confdefs.h + + asm_optimization="$asm_optimization (Media)" + +else + rtcd_support="$rtcd_support (Media)" + +fi + +fi + + if test x"$OPUS_ARM_MAY_HAVE_NEON" = x"1"; then : + + +$as_echo "#define OPUS_ARM_MAY_HAVE_NEON 1" >>confdefs.h + + if test x"$OPUS_ARM_PRESUME_NEON" = x"1"; then : + + +$as_echo "#define OPUS_ARM_PRESUME_NEON 1" >>confdefs.h + + asm_optimization="$asm_optimization (NEON)" + +else + rtcd_support="$rtcd_support (NEON)" + +fi + +fi + + if test x"$rtcd_support" != x""; then : + rtcd_support=ARM"$rtcd_support" +else + rtcd_support="no" + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for apple style tools" >&5 +$as_echo_n "checking for apple style tools... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef __APPLE__ +#error 1 +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; ARM2GNU_PARAMS="--apple" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; }; ARM2GNU_PARAMS="" +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ARM assembly requires perl -- disabling optimizations" >&5 +$as_echo "$as_me: WARNING: *** ARM assembly requires perl -- disabling optimizations" >&2;} + asm_optimization="(missing perl dependency for ARM)" + +fi + +fi + ;; + esac + +else + + inline_optimization="disabled" + asm_optimization="disabled" + +fi + + if test x"${inline_optimization%% *}" = x"ARM"; then + OPUS_ARM_INLINE_ASM_TRUE= + OPUS_ARM_INLINE_ASM_FALSE='#' +else + OPUS_ARM_INLINE_ASM_TRUE='#' + OPUS_ARM_INLINE_ASM_FALSE= +fi + + if test x"${asm_optimization%% *}" = x"ARM"; then + OPUS_ARM_EXTERNAL_ASM_TRUE= + OPUS_ARM_EXTERNAL_ASM_FALSE='#' +else + OPUS_ARM_EXTERNAL_ASM_TRUE='#' + OPUS_ARM_EXTERNAL_ASM_FALSE= +fi + + + if false; then + HAVE_SSE_TRUE= + HAVE_SSE_FALSE='#' +else + HAVE_SSE_TRUE='#' + HAVE_SSE_FALSE= +fi + + if false; then + HAVE_SSE2_TRUE= + HAVE_SSE2_FALSE='#' +else + HAVE_SSE2_TRUE='#' + HAVE_SSE2_FALSE= +fi + + if false; then + HAVE_SSE4_1_TRUE= + HAVE_SSE4_1_FALSE='#' +else + HAVE_SSE4_1_TRUE='#' + HAVE_SSE4_1_FALSE= +fi + + if false; then + HAVE_AVX_TRUE= + HAVE_AVX_FALSE='#' +else + HAVE_AVX_TRUE='#' + HAVE_AVX_FALSE= +fi + + + + + + + +# With GCC on ARM32 softfp architectures (e.g. Android, or older Ubuntu) you need to specify +# -mfloat-abi=softfp for -mfpu=neon to work. However, on ARM32 hardfp architectures (e.g. newer Ubuntu), +# this option will break things. + +# As a heuristic, if host matches arm*eabi* but not arm*hf*, it's probably soft-float. + + +case $host in #( + arm*hf*) : + RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS="-mfpu=neon" ;; #( + arm*eabi*) : + RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS="-mfpu=neon -mfloat-abi=softfp" ;; #( + *) : + RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS="-mfpu=neon" ;; +esac + + + + + + + +if ${X86_SSE_CFLAGS+:} false; then : + +else + X86_SSE_CFLAGS="-msse" +fi +if ${X86_SSE2_CFLAGS+:} false; then : + +else + X86_SSE2_CFLAGS="-msse2" +fi +if ${X86_SSE4_1_CFLAGS+:} false; then : + +else + X86_SSE4_1_CFLAGS="-msse4.1" +fi +if ${X86_AVX_CFLAGS+:} false; then : + +else + X86_AVX_CFLAGS="-mavx" +fi +if ${ARM_NEON_INTR_CFLAGS+:} false; then : + +else + ARM_NEON_INTR_CFLAGS="$RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS" +fi + + + +if test x"$enable_intrinsics" = x"yes"; then : + + intrinsics_support="" + case $host_cpu in #( + arm*|aarch64*) : + + cpu_arm=yes + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports ARM Neon intrinsics" >&5 +$as_echo_n "checking if compiler supports ARM Neon intrinsics... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ + + static float32x4_t A0, A1, SUMM; + SUMM = vmlaq_f32(SUMM, A0, A1); + return (int)vgetq_lane_f32(SUMM, 0); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + OPUS_ARM_MAY_HAVE_NEON_INTR=1 + OPUS_ARM_PRESUME_NEON_INTR=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + OPUS_ARM_PRESUME_NEON_INTR=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports ARM Neon intrinsics with $ARM_NEON_INTR_CFLAGS" >&5 +$as_echo_n "checking if compiler supports ARM Neon intrinsics with $ARM_NEON_INTR_CFLAGS... " >&6; } + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $ARM_NEON_INTR_CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ + + static float32x4_t A0, A1, SUMM; + SUMM = vmlaq_f32(SUMM, A0, A1); + return (int)vgetq_lane_f32(SUMM, 0); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_ARM_MAY_HAVE_NEON_INTR=1 + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_ARM_MAY_HAVE_NEON_INTR=0 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"; then : + + OPUS_ARM_NEON_INTR_CFLAGS="$ARM_NEON_INTR_CFLAGS" + + + +fi + + if test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"; then : + + +$as_echo "#define OPUS_ARM_MAY_HAVE_NEON_INTR 1" >>confdefs.h + + intrinsics_support="$intrinsics_support (NEON)" + + if test x"$enable_rtcd" != x"no" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"; then : + if test x"$rtcd_support" = x"no"; then : + rtcd_support="ARM (NEON Intrinsics)" +else + rtcd_support="$rtcd_support (NEON Intrinsics)" +fi +fi + + if test x"$OPUS_ARM_PRESUME_NEON_INTR" = x"1"; then : + +$as_echo "#define OPUS_ARM_PRESUME_NEON_INTR 1" >>confdefs.h + +fi + + + +# Check whether --with-NE10 was given. +if test "${with_NE10+set}" = set; then : + withval=$with_NE10; NE10_prefix="$withval" +else + NE10_prefix="" +fi + + +# Check whether --with-NE10-libraries was given. +if test "${with_NE10_libraries+set}" = set; then : + withval=$with_NE10_libraries; NE10_libraries="$withval" +else + NE10_libraries="" +fi + + +# Check whether --with-NE10-includes was given. +if test "${with_NE10_includes+set}" = set; then : + withval=$with_NE10_includes; NE10_includes="$withval" +else + NE10_includes="" +fi + + + if test "x$NE10_libraries" != "x" ; then + NE10_LIBS="-L$NE10_libraries" + elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then + NE10_LIBS="" + elif test "x$NE10_prefix" != "x" ; then + NE10_LIBS="-L$NE10_prefix/lib" + elif test "x$prefix" != "xNONE" ; then + NE10_LIBS="-L$prefix/lib" + fi + + if test "x$NE10_prefix" != "xno" ; then + NE10_LIBS="$NE10_LIBS -lNE10" + fi + + if test "x$NE10_includes" != "x" ; then + NE10_CFLAGS="-I$NE10_includes" + elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then + NE10_CFLAGS="" + elif test "x$NE10_prefix" != "x" ; then + NE10_CFLAGS="-I$NE10_prefix/include" + elif test "x$prefix" != "xNONE"; then + NE10_CFLAGS="-I$prefix/include" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NE10" >&5 +$as_echo_n "checking for NE10... " >&6; } + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $NE10_CFLAGS" + save_LIBS="$LIBS"; LIBS="$LIBS $NE10_LIBS $LIBM" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + ne10_fft_cfg_float32_t cfg; + cfg = ne10_fft_alloc_c2c_float32_neon(480); + + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + HAVE_ARM_NE10=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + HAVE_ARM_NE10=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + NE10_CFLAGS="" + NE10_LIBS="" + + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS"; LIBS="$save_LIBS" + #Now we know if libNE10 is installed or not + if test x"$HAVE_ARM_NE10" = x"1"; then : + + +$as_echo "#define HAVE_ARM_NE10 1" >>confdefs.h + + + + + + +fi + + + if test x"$NE10_LIBS" != x""; then : + + intrinsics_support="$intrinsics_support (NE10)" + if test x"enable_rtcd" != x"" \ + && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"; then : + rtcd_support="$rtcd_support (NE10)" +fi + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports Aarch64 Neon intrinsics" >&5 +$as_echo_n "checking if compiler supports Aarch64 Neon intrinsics... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ + + static int32_t IN; + static int16_t OUT; + OUT = vqmovns_s32(IN); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + OPUS_ARM_MAY_HAVE_AARCH64_NEON_INTR=1 + OPUS_ARM_PRESUME_AARCH64_NEON_INTR=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + OPUS_ARM_PRESUME_AARCH64_NEON_INTR=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports Aarch64 Neon intrinsics with $ARM_NEON_INTR_CFLAGS" >&5 +$as_echo_n "checking if compiler supports Aarch64 Neon intrinsics with $ARM_NEON_INTR_CFLAGS... " >&6; } + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $ARM_NEON_INTR_CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ + + static int32_t IN; + static int16_t OUT; + OUT = vqmovns_s32(IN); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_ARM_MAY_HAVE_AARCH64_NEON_INTR=1 + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_ARM_MAY_HAVE_AARCH64_NEON_INTR=0 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + + if test x"$OPUS_ARM_PRESUME_AARCH64_NEON_INTR" = x"1"; then : + + +$as_echo "#define OPUS_ARM_PRESUME_AARCH64_NEON_INTR 1" >>confdefs.h + + intrinsics_support="$intrinsics_support (NEON Aarch64)" + +fi + + if test x"$intrinsics_support" = x""; then : + intrinsics_support=no +else + intrinsics_support="ARM$intrinsics_support" +fi + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Compiler does not support ARM intrinsics" >&5 +$as_echo "$as_me: WARNING: Compiler does not support ARM intrinsics" >&2;} + intrinsics_support=no + +fi + ;; #( + i?86|x86_64) : + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports SSE intrinsics" >&5 +$as_echo_n "checking if compiler supports SSE intrinsics... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ + + __m128 mtest; + mtest = _mm_set1_ps((float)time(NULL)); + mtest = _mm_mul_ps(mtest, mtest); + return _mm_cvtss_si32(mtest); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + OPUS_X86_MAY_HAVE_SSE=1 + OPUS_X86_PRESUME_SSE=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + OPUS_X86_PRESUME_SSE=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports SSE intrinsics with $X86_SSE_CFLAGS" >&5 +$as_echo_n "checking if compiler supports SSE intrinsics with $X86_SSE_CFLAGS... " >&6; } + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $X86_SSE_CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ + + __m128 mtest; + mtest = _mm_set1_ps((float)time(NULL)); + mtest = _mm_mul_ps(mtest, mtest); + return _mm_cvtss_si32(mtest); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_X86_MAY_HAVE_SSE=1 + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_X86_MAY_HAVE_SSE=0 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test x"$OPUS_X86_MAY_HAVE_SSE" = x"1" && test x"$OPUS_X86_PRESUME_SSE" != x"1"; then : + + OPUS_X86_SSE_CFLAGS="$X86_SSE_CFLAGS" + + + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports SSE2 intrinsics" >&5 +$as_echo_n "checking if compiler supports SSE2 intrinsics... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ + + __m128i mtest; + mtest = _mm_set1_epi32((int)time(NULL)); + mtest = _mm_mul_epu32(mtest, mtest); + return _mm_cvtsi128_si32(mtest); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + OPUS_X86_MAY_HAVE_SSE2=1 + OPUS_X86_PRESUME_SSE2=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + OPUS_X86_PRESUME_SSE2=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports SSE2 intrinsics with $X86_SSE2_CFLAGS" >&5 +$as_echo_n "checking if compiler supports SSE2 intrinsics with $X86_SSE2_CFLAGS... " >&6; } + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $X86_SSE2_CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ + + __m128i mtest; + mtest = _mm_set1_epi32((int)time(NULL)); + mtest = _mm_mul_epu32(mtest, mtest); + return _mm_cvtsi128_si32(mtest); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_X86_MAY_HAVE_SSE2=1 + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_X86_MAY_HAVE_SSE2=0 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1" && test x"$OPUS_X86_PRESUME_SSE2" != x"1"; then : + + OPUS_X86_SSE2_CFLAGS="$X86_SSE2_CFLAGS" + + + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports SSE4.1 intrinsics" >&5 +$as_echo_n "checking if compiler supports SSE4.1 intrinsics... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ + + __m128i mtest; + mtest = _mm_set1_epi32((int)time(NULL)); + mtest = _mm_mul_epi32(mtest, mtest); + return _mm_cvtsi128_si32(mtest); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + OPUS_X86_MAY_HAVE_SSE4_1=1 + OPUS_X86_PRESUME_SSE4_1=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + OPUS_X86_PRESUME_SSE4_1=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports SSE4.1 intrinsics with $X86_SSE4_1_CFLAGS" >&5 +$as_echo_n "checking if compiler supports SSE4.1 intrinsics with $X86_SSE4_1_CFLAGS... " >&6; } + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $X86_SSE4_1_CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ + + __m128i mtest; + mtest = _mm_set1_epi32((int)time(NULL)); + mtest = _mm_mul_epi32(mtest, mtest); + return _mm_cvtsi128_si32(mtest); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_X86_MAY_HAVE_SSE4_1=1 + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_X86_MAY_HAVE_SSE4_1=0 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1" && test x"$OPUS_X86_PRESUME_SSE4_1" != x"1"; then : + + OPUS_X86_SSE4_1_CFLAGS="$X86_SSE4_1_CFLAGS" + + + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports AVX intrinsics" >&5 +$as_echo_n "checking if compiler supports AVX intrinsics... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ + + __m256 mtest; + mtest = _mm256_set1_ps((float)time(NULL)); + mtest = _mm256_addsub_ps(mtest, mtest); + return _mm_cvtss_si32(_mm256_extractf128_ps(mtest, 0)); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + OPUS_X86_MAY_HAVE_AVX=1 + OPUS_X86_PRESUME_AVX=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + OPUS_X86_PRESUME_AVX=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports AVX intrinsics with $X86_AVX_CFLAGS" >&5 +$as_echo_n "checking if compiler supports AVX intrinsics with $X86_AVX_CFLAGS... " >&6; } + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $X86_AVX_CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ + + __m256 mtest; + mtest = _mm256_set1_ps((float)time(NULL)); + mtest = _mm256_addsub_ps(mtest, mtest); + return _mm_cvtss_si32(_mm256_extractf128_ps(mtest, 0)); + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPUS_X86_MAY_HAVE_AVX=1 + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + OPUS_X86_MAY_HAVE_AVX=0 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test x"$OPUS_X86_MAY_HAVE_AVX" = x"1" && test x"$OPUS_X86_PRESUME_AVX" != x"1"; then : + OPUS_X86_AVX_CFLAGS="$X86_AVX_CFLAGS" -has_float_approx=no -#case "$host_cpu" in -#i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64) -# has_float_approx=yes -# ;; -#esac -ac_enable_fixed="no"; -ac_enable_float="yes"; -# Check whether --enable-fixed-point was given. -if test "${enable_fixed_point+set}" = set; then : - enableval=$enable_fixed_point; if test "$enableval" = yes; then - ac_enable_fixed="yes"; - ac_enable_float="no"; -$as_echo "#define FIXED_POINT 1" >>confdefs.h +fi + if test x"$rtcd_support" = x"no"; then : + rtcd_support="" +fi + if test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"; then : + + +$as_echo "#define OPUS_X86_MAY_HAVE_SSE 1" >>confdefs.h + + intrinsics_support="$intrinsics_support SSE" + + if test x"$OPUS_X86_PRESUME_SSE" = x"1"; then : + +$as_echo "#define OPUS_X86_PRESUME_SSE 1" >>confdefs.h +else + rtcd_support="$rtcd_support SSE" fi + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Compiler does not support SSE intrinsics" >&5 +$as_echo "$as_me: WARNING: Compiler does not support SSE intrinsics" >&2;} + fi + if test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"; then : -ac_enable_fixed_debug="no" -# Check whether --enable-fixed-point-debug was given. -if test "${enable_fixed_point_debug+set}" = set; then : - enableval=$enable_fixed_point_debug; if test "$enableval" = yes; then - ac_enable_fixed_debug="yes" -$as_echo "#define FIXED_DEBUG /**/" >>confdefs.h +$as_echo "#define OPUS_X86_MAY_HAVE_SSE2 1" >>confdefs.h + + intrinsics_support="$intrinsics_support SSE2" + if test x"$OPUS_X86_PRESUME_SSE2" = x"1"; then : + +$as_echo "#define OPUS_X86_PRESUME_SSE2 1" >>confdefs.h + +else + rtcd_support="$rtcd_support SSE2" fi + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Compiler does not support SSE2 intrinsics" >&5 +$as_echo "$as_me: WARNING: Compiler does not support SSE2 intrinsics" >&2;} + fi + if test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"; then : -ac_enable_custom_modes="no" -# Check whether --enable-custom-modes was given. -if test "${enable_custom_modes+set}" = set; then : - enableval=$enable_custom_modes; if test "$enableval" = yes; then - ac_enable_custom_modes="yes" -$as_echo "#define CUSTOM_MODES /**/" >>confdefs.h +$as_echo "#define OPUS_X86_MAY_HAVE_SSE4_1 1" >>confdefs.h + + intrinsics_support="$intrinsics_support SSE4.1" + + if test x"$OPUS_X86_PRESUME_SSE4_1" = x"1"; then : + +$as_echo "#define OPUS_X86_PRESUME_SSE4_1 1" >>confdefs.h +else + rtcd_support="$rtcd_support SSE4.1" fi + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Compiler does not support SSE4.1 intrinsics" >&5 +$as_echo "$as_me: WARNING: Compiler does not support SSE4.1 intrinsics" >&2;} + fi + if test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"; then : -float_approx=$has_float_approx -# Check whether --enable-float-approx was given. -if test "${enable_float_approx+set}" = set; then : - enableval=$enable_float_approx; if test "$enableval" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Floating point approximations are not supported on all platforms." >&5 -$as_echo "$as_me: WARNING: Floating point approximations are not supported on all platforms." >&2;} - float_approx=yes - else - float_approx=no - fi +$as_echo "#define OPUS_X86_MAY_HAVE_AVX 1" >>confdefs.h + + intrinsics_support="$intrinsics_support AVX" + + if test x"$OPUS_X86_PRESUME_AVX" = x"1"; then : + +$as_echo "#define OPUS_X86_PRESUME_AVX 1" >>confdefs.h + +else + rtcd_support="$rtcd_support AVX" +fi + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Compiler does not support AVX intrinsics" >&5 +$as_echo "$as_me: WARNING: Compiler does not support AVX intrinsics" >&2;} + +fi + + if test x"$intrinsics_support" = x""; then : + intrinsics_support=no +else + intrinsics_support="x86$intrinsics_support" + +fi + if test x"$rtcd_support" = x""; then : + rtcd_support=no +elif rtcd_support="x86$rtcd_support"; then : + +fi + + if test x"$enable_rtcd" = x"yes" && test x"$rtcd_support" != x""; then : + + get_cpuid_by_asm="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking How to get X86 CPU Info" >&5 +$as_echo_n "checking How to get X86 CPU Info... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + unsigned int CPUInfo0; + unsigned int CPUInfo1; + unsigned int CPUInfo2; + unsigned int CPUInfo3; + unsigned int InfoType; + __asm__ __volatile__ ( + "cpuid": + "=a" (CPUInfo0), + "=b" (CPUInfo1), + "=c" (CPUInfo2), + "=d" (CPUInfo3) : + "a" (InfoType), "c" (0) + ); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + get_cpuid_by_asm="yes" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Inline Assembly" >&5 +$as_echo "Inline Assembly" >&6; } + +$as_echo "#define CPU_INFO_BY_ASM 1" >>confdefs.h + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + unsigned int CPUInfo0; + unsigned int CPUInfo1; + unsigned int CPUInfo2; + unsigned int CPUInfo3; + unsigned int InfoType; + __get_cpuid(InfoType, &CPUInfo0, &CPUInfo1, &CPUInfo2, &CPUInfo3); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: C method" >&5 +$as_echo "C method" >&6; } + +$as_echo "#define CPU_INFO_BY_C 1" >>confdefs.h + +else + as_fn_error $? "no supported Get CPU Info method, please disable run-time CPU capabilities detection or intrinsics" "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + ;; #( + *) : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No intrinsics support for your architecture" >&5 +$as_echo "$as_me: WARNING: No intrinsics support for your architecture" >&2;} + intrinsics_support="no" + ;; +esac + +else + + intrinsics_support="no" + +fi + + if test "$cpu_arm" = "yes"; then + CPU_ARM_TRUE= + CPU_ARM_FALSE='#' +else + CPU_ARM_TRUE='#' + CPU_ARM_FALSE= +fi + + if test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"; then + HAVE_ARM_NEON_INTR_TRUE= + HAVE_ARM_NEON_INTR_FALSE='#' +else + HAVE_ARM_NEON_INTR_TRUE='#' + HAVE_ARM_NEON_INTR_FALSE= +fi + + if test x"$HAVE_ARM_NE10" = x"1"; then + HAVE_ARM_NE10_TRUE= + HAVE_ARM_NE10_FALSE='#' +else + HAVE_ARM_NE10_TRUE='#' + HAVE_ARM_NE10_FALSE= +fi + + if test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"; then + HAVE_SSE_TRUE= + HAVE_SSE_FALSE='#' +else + HAVE_SSE_TRUE='#' + HAVE_SSE_FALSE= +fi + + if test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"; then + HAVE_SSE2_TRUE= + HAVE_SSE2_FALSE='#' +else + HAVE_SSE2_TRUE='#' + HAVE_SSE2_FALSE= +fi + + if test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"; then + HAVE_SSE4_1_TRUE= + HAVE_SSE4_1_FALSE='#' +else + HAVE_SSE4_1_TRUE='#' + HAVE_SSE4_1_FALSE= +fi + + if test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"; then + HAVE_AVX_TRUE= + HAVE_AVX_FALSE='#' else - float_approx=$has_float_approx + HAVE_AVX_TRUE='#' + HAVE_AVX_FALSE= fi -if test "x${float_approx}" = "xyes"; then +if test x"$enable_rtcd" = x"yes"; then : + + if test x"$rtcd_support" != x"no"; then : + + +$as_echo "#define OPUS_HAVE_RTCD 1" >>confdefs.h -$as_echo "#define FLOAT_APPROX /**/" >>confdefs.h + OPUS_HAVE_RTCD=1 + + +fi + +else + + rtcd_support="disabled" fi -ac_enable_assertions="no" # Check whether --enable-assertions was given. if test "${enable_assertions+set}" = set; then : - enableval=$enable_assertions; if test "$enableval" = yes; then - ac_enable_assertions="yes" + enableval=$enable_assertions; +else + enable_assertions=no +fi + + +if test "$enable_assertions" = "yes"; then : + + +$as_echo "#define ENABLE_ASSERTIONS 1" >>confdefs.h -$as_echo "#define ENABLE_ASSERTIONS /**/" >>confdefs.h fi + +# Check whether --enable-hardening was given. +if test "${enable_hardening+set}" = set; then : + enableval=$enable_hardening; +else + enable_hardening=yes fi -ac_enable_fuzzing="no" +if test "$enable_hardening" = "yes"; then : + + +$as_echo "#define ENABLE_HARDENING 1" >>confdefs.h + + +fi + # Check whether --enable-fuzzing was given. if test "${enable_fuzzing+set}" = set; then : - enableval=$enable_fuzzing; if test "$enableval" = yes; then - ac_enable_fuzzing="yes" + enableval=$enable_fuzzing; +else + enable_fuzzing=no +fi + + +if test "$enable_fuzzing" = "yes"; then : + + +$as_echo "#define FUZZING 1" >>confdefs.h -$as_echo "#define FUZZING /**/" >>confdefs.h fi + +# Check whether --enable-check-asm was given. +if test "${enable_check_asm+set}" = set; then : + enableval=$enable_check_asm; +else + enable_check_asm=no fi -ac_enable_doc="yes" +if test "$enable_check_asm" = "yes"; then : + + +$as_echo "#define OPUS_CHECK_ASM 1" >>confdefs.h + + +fi + # Check whether --enable-doc was given. if test "${enable_doc+set}" = set; then : - enableval=$enable_doc; ac_enable_doc=$enableval + enableval=$enable_doc; +else + enable_doc=yes fi -# Extract the first word of "doxygen", so it can be a program name with args. + +if test "$enable_doc" = "yes"; then : + + # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } @@ -12271,7 +14531,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_HAVE_DOXYGEN="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -12293,57 +14553,218 @@ $as_echo "no" >&6; } fi -if test "$HAVE_DOXYGEN" != "yes" -o "$ac_enable_doc" != "yes"; then - HAVE_DOXYGEN="false" - ac_enable_doc="no" -fi - if test $HAVE_DOXYGEN = yes; then - HAVE_DOXYGEN_TRUE= - HAVE_DOXYGEN_FALSE='#' + # Extract the first word of "dot", so it can be a program name with args. +set dummy dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_DOT"; then + ac_cv_prog_HAVE_DOT="$HAVE_DOT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_DOT="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_DOT" && ac_cv_prog_HAVE_DOT="no" +fi +fi +HAVE_DOT=$ac_cv_prog_HAVE_DOT +if test -n "$HAVE_DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DOT" >&5 +$as_echo "$HAVE_DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +else + + HAVE_DOXYGEN=no + +fi + + if test "$HAVE_DOXYGEN" = "yes"; then + HAVE_DOXYGEN_TRUE= + HAVE_DOXYGEN_FALSE='#' +else + HAVE_DOXYGEN_TRUE='#' + HAVE_DOXYGEN_FALSE= +fi + + +# Check whether --enable-extra-programs was given. +if test "${enable_extra_programs+set}" = set; then : + enableval=$enable_extra_programs; +else + enable_extra_programs=yes +fi + + + if test "$enable_extra_programs" = "yes"; then + EXTRA_PROGRAMS_TRUE= + EXTRA_PROGRAMS_FALSE='#' +else + EXTRA_PROGRAMS_TRUE='#' + EXTRA_PROGRAMS_FALSE= +fi + + + +# Check whether --enable-rfc8251 was given. +if test "${enable_rfc8251+set}" = set; then : + enableval=$enable_rfc8251; +else + enable_rfc8251=yes +fi + + +if test "$enable_rfc8251" = "no"; then : + + +$as_echo "#define DISABLE_UPDATE_DRAFT 1" >>confdefs.h + + +fi + + +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${CC} supports -fvisibility=hidden" >&5 +$as_echo_n "checking if ${CC} supports -fvisibility=hidden... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +char foo; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +on_x86=no +case "$host_cpu" in +i[3456]86 | x86_64) + on_x86=yes + ;; +esac + +on_windows=no +case $host in +*cygwin*|*mingw*) + on_windows=yes + ;; +esac + +# Check whether --enable-stack-protector was given. +if test "${enable_stack_protector+set}" = set; then : + enableval=$enable_stack_protector; +else + + if test "$ac_cv_c_compiler_gnu" = "yes" && test "$on_x86" = "yes" && test "$on_windows" = "no"; then : + enable_stack_protector=yes else - HAVE_DOXYGEN_TRUE='#' - HAVE_DOXYGEN_FALSE= + enable_stack_protector=no fi +fi + + +if test "$enable_stack_protector" = "yes"; then : + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fstack-protector-strong" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${CC} supports -fstack-protector-strong" >&5 +$as_echo_n "checking if ${CC} supports -fstack-protector-strong... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_enable_encoder="no"; -# Check whether --enable-encoder was given. -if test "${enable_encoder+set}" = set; then : - enableval=$enable_encoder; if test "$enableval" = yes; then - ac_enable_encoder="yes"; +int +main () +{ +char foo; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else -$as_echo "#define OPUS_ENABLE_ENCODER 1" >>confdefs.h + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_stack_protector=no + CFLAGS="$saved_CFLAGS" fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi +if test x$ac_cv_c_compiler_gnu = xyes; then : -saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -fvisibility=hidden" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${CC} supports -fvisibility=hidden" >&5 -$as_echo_n "checking if ${CC} supports -fvisibility=hidden... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to add -D_FORTIFY_SOURCE=2 to CFLAGS" >&5 +$as_echo_n "checking whether to add -D_FORTIFY_SOURCE=2 to CFLAGS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -char foo; + + + int main() { + #ifndef _FORTIFY_SOURCE + return 0; + #else + this_is_an_error; + #endif + } + + _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - SYMBOL_VISIBILITY="-fvisibility=hidden" + CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" + else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } + fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -CFLAGS="$saved_CFLAGS $SYMBOL_VISIBILITY" +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi CFLAGS="$CFLAGS -W" +warn_CFLAGS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${CC} supports -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" >&5 -$as_echo_n "checking if ${CC} supports -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes... " >&6; } +CFLAGS="$CFLAGS $warn_CFLAGS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${CC} supports ${warn_CFLAGS}" >&5 +$as_echo_n "checking if ${CC} supports ${warn_CFLAGS}... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ char foo; @@ -12351,14 +14772,16 @@ _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - EXTRA_WARNS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } + CFLAGS="$saved_CFLAGS" + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -CFLAGS="$saved_CFLAGS $EXTRA_WARNS" +saved_LIBS="$LIBS" +LIBS="$LIBS $LIBM" for ac_func in lrintf do : ac_fn_c_check_func "$LINENO" "lrintf" "ac_cv_func_lrintf" @@ -12381,6 +14804,8 @@ _ACEOF fi done +LIBS="$saved_LIBS" + for ac_func in __malloc_hook do : ac_fn_c_check_func "$LINENO" "__malloc_hook" "ac_cv_func___malloc_hook" @@ -12393,209 +14818,9 @@ fi done -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 -$as_echo_n "checking size of short... " >&6; } -if ${ac_cv_sizeof_short+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_short" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (short) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_short=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 -$as_echo "$ac_cv_sizeof_short" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SHORT $ac_cv_sizeof_short -_ACEOF - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 -$as_echo_n "checking size of int... " >&6; } -if ${ac_cv_sizeof_int+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_int" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (int) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_int=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 -$as_echo "$ac_cv_sizeof_int" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_INT $ac_cv_sizeof_int -_ACEOF - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 -$as_echo_n "checking size of long... " >&6; } -if ${ac_cv_sizeof_long+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (long) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_long=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 -$as_echo "$ac_cv_sizeof_long" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG $ac_cv_sizeof_long -_ACEOF - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 -$as_echo_n "checking size of long long... " >&6; } -if ${ac_cv_sizeof_long_long+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_long_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (long long) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_long_long=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 -$as_echo "$ac_cv_sizeof_long_long" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long -_ACEOF - - - -if test x$has_char16 = "xyes" ; then - case 1 in - $ac_cv_sizeof_short) SIZE16="short";; - $ac_cv_sizeof_int) SIZE16="int";; - esac -else - case 2 in - $ac_cv_sizeof_short) SIZE16="short";; - $ac_cv_sizeof_int) SIZE16="int";; - esac -fi - -if test x$has_char16 = "xyes" ; then - case 2 in - $ac_cv_sizeof_int) SIZE32="int";; - $ac_cv_sizeof_long) SIZE32="long";; - $ac_cv_sizeof_short) SIZE32="short";; - esac -else - case 4 in - $ac_cv_sizeof_int) SIZE32="int";; - $ac_cv_sizeof_long) SIZE32="long";; - $ac_cv_sizeof_short) SIZE32="short";; - esac -fi - - - - - if test x$ac_enable_fixed = xyes; then - FIXED_POINT_TRUE= - FIXED_POINT_FALSE='#' -else - FIXED_POINT_TRUE='#' - FIXED_POINT_FALSE= -fi - - if test x$ac_enable_custom_modes = xyes; then - CUSTOM_MODES_TRUE= - CUSTOM_MODES_FALSE='#' -else - CUSTOM_MODES_TRUE='#' - CUSTOM_MODES_FALSE= -fi - - if test x$ac_enable_encoder = xyes; then - USE_ENCODER_TRUE= - USE_ENCODER_FALSE='#' -else - USE_ENCODER_TRUE='#' - USE_ENCODER_FALSE= -fi - - -if test x$ac_enable_float = xyes; then - PC_BUILD="floating-point" - PC_LIBM=$LIBM -else - PC_BUILD="fixed-point" - PC_LIBM= -fi -if test x$ac_enable_custom_modes = xyes; then - PC_BUILD="${PC_BUILD}, custom modes" - PC_LIBM=$LIBM -fi - - -ac_config_files="$ac_config_files Makefile opus.pc opus-uninstalled.pc doc/Makefile doc/Doxyfile" +ac_config_files="$ac_config_files Makefile opus.pc opus-uninstalled.pc celt/arm/armopts.s doc/Makefile doc/Doxyfile" ac_config_headers="$ac_config_headers config.h" @@ -12709,6 +14934,14 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -12729,20 +14962,88 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${HAVE_DOXYGEN_TRUE}" && test -z "${HAVE_DOXYGEN_FALSE}"; then - as_fn_error $? "conditional \"HAVE_DOXYGEN\" was never defined. +if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FIXED_POINT_TRUE}" && test -z "${FIXED_POINT_FALSE}"; then as_fn_error $? "conditional \"FIXED_POINT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${DISABLE_FLOAT_API_TRUE}" && test -z "${DISABLE_FLOAT_API_FALSE}"; then + as_fn_error $? "conditional \"DISABLE_FLOAT_API\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${CUSTOM_MODES_TRUE}" && test -z "${CUSTOM_MODES_FALSE}"; then as_fn_error $? "conditional \"CUSTOM_MODES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${USE_ENCODER_TRUE}" && test -z "${USE_ENCODER_FALSE}"; then - as_fn_error $? "conditional \"USE_ENCODER\" was never defined. +if test -z "${OPUS_ARM_INLINE_ASM_TRUE}" && test -z "${OPUS_ARM_INLINE_ASM_FALSE}"; then + as_fn_error $? "conditional \"OPUS_ARM_INLINE_ASM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OPUS_ARM_EXTERNAL_ASM_TRUE}" && test -z "${OPUS_ARM_EXTERNAL_ASM_FALSE}"; then + as_fn_error $? "conditional \"OPUS_ARM_EXTERNAL_ASM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OPUS_ARM_INLINE_ASM_TRUE}" && test -z "${OPUS_ARM_INLINE_ASM_FALSE}"; then + as_fn_error $? "conditional \"OPUS_ARM_INLINE_ASM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OPUS_ARM_EXTERNAL_ASM_TRUE}" && test -z "${OPUS_ARM_EXTERNAL_ASM_FALSE}"; then + as_fn_error $? "conditional \"OPUS_ARM_EXTERNAL_ASM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SSE_TRUE}" && test -z "${HAVE_SSE_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SSE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SSE2_TRUE}" && test -z "${HAVE_SSE2_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SSE2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SSE4_1_TRUE}" && test -z "${HAVE_SSE4_1_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SSE4_1\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_AVX_TRUE}" && test -z "${HAVE_AVX_FALSE}"; then + as_fn_error $? "conditional \"HAVE_AVX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CPU_ARM_TRUE}" && test -z "${CPU_ARM_FALSE}"; then + as_fn_error $? "conditional \"CPU_ARM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_ARM_NEON_INTR_TRUE}" && test -z "${HAVE_ARM_NEON_INTR_FALSE}"; then + as_fn_error $? "conditional \"HAVE_ARM_NEON_INTR\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_ARM_NE10_TRUE}" && test -z "${HAVE_ARM_NE10_FALSE}"; then + as_fn_error $? "conditional \"HAVE_ARM_NE10\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SSE_TRUE}" && test -z "${HAVE_SSE_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SSE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SSE2_TRUE}" && test -z "${HAVE_SSE2_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SSE2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SSE4_1_TRUE}" && test -z "${HAVE_SSE4_1_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SSE4_1\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_AVX_TRUE}" && test -z "${HAVE_AVX_FALSE}"; then + as_fn_error $? "conditional \"HAVE_AVX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_DOXYGEN_TRUE}" && test -z "${HAVE_DOXYGEN_FALSE}"; then + as_fn_error $? "conditional \"HAVE_DOXYGEN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${EXTRA_PROGRAMS_TRUE}" && test -z "${EXTRA_PROGRAMS_FALSE}"; then + as_fn_error $? "conditional \"EXTRA_PROGRAMS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi @@ -13043,16 +15344,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -13112,28 +15413,16 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -13154,8 +15443,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by opus $as_me 1.0.3, which was -generated by GNU Autoconf 2.68. Invocation command line was +This file was extended by opus $as_me 1.3.1, which was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -13220,11 +15509,11 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -opus config.status 1.0.3 -configured by $0, generated by GNU Autoconf 2.68, +opus config.status 1.3.1 +configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -13315,7 +15604,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -13355,6 +15644,7 @@ enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' @@ -13404,10 +15694,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' @@ -13472,7 +15765,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' @@ -13523,9 +15817,12 @@ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ nm_file_list_spec \ +lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ @@ -13560,7 +15857,7 @@ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -13587,10 +15884,11 @@ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -13599,19 +15897,16 @@ sys_lib_dlsearch_path_spec; do done ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' -# See if we are running on zsh, and set the options which allow our +# See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then +if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' @@ -13631,6 +15926,7 @@ do "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "opus.pc") CONFIG_FILES="$CONFIG_FILES opus.pc" ;; "opus-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES opus-uninstalled.pc" ;; + "celt/arm/armopts.s") CONFIG_FILES="$CONFIG_FILES celt/arm/armopts.s" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/Doxyfile") CONFIG_FILES="$CONFIG_FILES doc/Doxyfile" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; @@ -14230,7 +16526,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -14243,7 +16539,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -14277,21 +16573,19 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || @@ -14326,55 +16620,53 @@ $as_echo X"$file" | ;; "libtool":C) - # See if we are running on zsh, and set the options which allow our + # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then + if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi - cfgfile="${ofile}T" + cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. # -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . # The names of the tagged configurations supported by this script. -available_tags="" +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG @@ -14394,6 +16686,9 @@ pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + # Shell to use when invoking shell scripts. SHELL=$lt_SHELL @@ -14511,18 +16806,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec -# The root where to search for dependent libraries,and in which our libraries should be installed. +# The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + # The name of the directory that contains temporary libtool files. objdir=$objdir @@ -14613,8 +16917,11 @@ hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen @@ -14707,13 +17014,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute @@ -14763,6 +17070,65 @@ hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in @@ -14771,7 +17137,7 @@ _LT_EOF # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then +if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -14780,7 +17146,7 @@ _LT_EOF esac -ltmain="$ac_aux_dir/ltmain.sh" +ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if @@ -14790,165 +17156,6 @@ ltmain="$ac_aux_dir/ltmain.sh" sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" @@ -14993,7 +17200,7 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: +{ $as_echo "$as_me:${as_lineno-$LINENO}: ------------------------------------------------------------------------ $PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK. @@ -15001,22 +17208,31 @@ fi C99 var arrays: ................ ${has_var_arrays} C99 lrintf: .................... ${ac_cv_func_lrintf} - Alloca: ........................ ${has_alloca} + Use alloca: .................... ${use_alloca} General configuration: - Floating point support: ........ ${ac_enable_float} - Fast float approximations: ..... ${float_approx} - Fixed point debugging: ......... ${ac_enable_fixed_debug} - Encoder support: ............... ${ac_enable_encoder} - Custom modes: .................. ${ac_enable_custom_modes} - Assertion checking: ............ ${ac_enable_assertions} - Fuzzing: ....................... ${ac_enable_fuzzing} - - API documentation: ............. ${ac_enable_doc} + Floating point support: ........ ${enable_float} + Fast float approximations: ..... ${enable_float_approx} + Fixed point debugging: ......... ${enable_fixed_point_debug} + Inline Assembly Optimizations: . ${inline_optimization} + External Assembly Optimizations: ${asm_optimization} + Intrinsics Optimizations: ...... ${intrinsics_support} + Run-time CPU detection: ........ ${rtcd_support} + Custom modes: .................. ${enable_custom_modes} + Assertion checking: ............ ${enable_assertions} + Hardening: ..................... ${enable_hardening} + Fuzzing: ....................... ${enable_fuzzing} + Check ASM: ..................... ${enable_check_asm} + + API documentation: ............. ${enable_doc} + Extra programs: ................ ${enable_extra_programs} ------------------------------------------------------------------------ + + Type \"make; make install\" to compile and install + Type \"make check\" to run the test suite " >&5 -$as_echo " +$as_echo "$as_me: ------------------------------------------------------------------------ $PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK. @@ -15024,21 +17240,28 @@ $as_echo " C99 var arrays: ................ ${has_var_arrays} C99 lrintf: .................... ${ac_cv_func_lrintf} - Alloca: ........................ ${has_alloca} + Use alloca: .................... ${use_alloca} General configuration: - Floating point support: ........ ${ac_enable_float} - Fast float approximations: ..... ${float_approx} - Fixed point debugging: ......... ${ac_enable_fixed_debug} - Encoder support: ............... ${ac_enable_encoder} - Custom modes: .................. ${ac_enable_custom_modes} - Assertion checking: ............ ${ac_enable_assertions} - Fuzzing: ....................... ${ac_enable_fuzzing} - - API documentation: ............. ${ac_enable_doc} + Floating point support: ........ ${enable_float} + Fast float approximations: ..... ${enable_float_approx} + Fixed point debugging: ......... ${enable_fixed_point_debug} + Inline Assembly Optimizations: . ${inline_optimization} + External Assembly Optimizations: ${asm_optimization} + Intrinsics Optimizations: ...... ${intrinsics_support} + Run-time CPU detection: ........ ${rtcd_support} + Custom modes: .................. ${enable_custom_modes} + Assertion checking: ............ ${enable_assertions} + Hardening: ..................... ${enable_hardening} + Fuzzing: ....................... ${enable_fuzzing} + Check ASM: ..................... ${enable_check_asm} + + API documentation: ............. ${enable_doc} + Extra programs: ................ ${enable_extra_programs} ------------------------------------------------------------------------ -" >&6; } -echo "Type \"make; make install\" to compile and install"; -echo "Type \"make check\" to run the test suite"; + Type \"make; make install\" to compile and install + Type \"make check\" to run the test suite +" >&6;} + diff --git a/external/opus-1.3.1/configure.ac b/external/opus-1.3.1/configure.ac new file mode 100644 index 00000000..18ece291 --- /dev/null +++ b/external/opus-1.3.1/configure.ac @@ -0,0 +1,933 @@ +dnl Process this file with autoconf to produce a configure script. -*-m4-*- + +dnl The package_version file will be automatically synced to the git revision +dnl by the update_version script when configured in the repository, but will +dnl remain constant in tarball releases unless it is manually edited. +m4_define([CURRENT_VERSION], + m4_esyscmd([ ./update_version 2>/dev/null || true + if test -e package_version; then + . ./package_version + printf "$PACKAGE_VERSION" + else + printf "unknown" + fi ])) + +AC_INIT([opus],[CURRENT_VERSION],[opus@xiph.org]) + +AC_CONFIG_SRCDIR(src/opus_encoder.c) +AC_CONFIG_MACRO_DIR([m4]) + +dnl enable silent rules on automake 1.11 and later +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +# For libtool. +dnl Please update these for releases. +OPUS_LT_CURRENT=8 +OPUS_LT_REVISION=0 +OPUS_LT_AGE=8 + +AC_SUBST(OPUS_LT_CURRENT) +AC_SUBST(OPUS_LT_REVISION) +AC_SUBST(OPUS_LT_AGE) + +AM_INIT_AUTOMAKE([no-define]) +AM_MAINTAINER_MODE([enable]) + +AC_CANONICAL_HOST +AC_MINGW32 +AM_PROG_LIBTOOL +AM_PROG_CC_C_O + +AC_PROG_CC_C99 +AC_C_CONST +AC_C_INLINE + +AM_PROG_AS + +AC_DEFINE([OPUS_BUILD], [], [This is a build of OPUS]) + +#Use a hacked up version of autoconf's AC_C_RESTRICT because it's not +#strong enough a test to detect old buggy versions of GCC (e.g. 2.95.3) +#Note: Both this and the test for variable-size arrays below are also +# done by AC_PROG_CC_C99, but not thoroughly enough apparently. +AC_CACHE_CHECK([for C/C++ restrict keyword], ac_cv_c_restrict, + [ac_cv_c_restrict=no + # The order here caters to the fact that C++ does not require restrict. + for ac_kw in __restrict __restrict__ _Restrict restrict; do + AC_COMPILE_IFELSE([AC_LANG_PROGRAM( + [[typedef int * int_ptr; + int foo (int_ptr $ac_kw ip, int * $ac_kw baz[]) { + return ip[0]; + }]], + [[int s[1]; + int * $ac_kw t = s; + t[0] = 0; + return foo(t, (void *)0)]])], + [ac_cv_c_restrict=$ac_kw]) + test "$ac_cv_c_restrict" != no && break + done + ]) + +AH_VERBATIM([restrict], +[/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#undef restrict +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif]) + +case $ac_cv_c_restrict in + restrict) ;; + no) AC_DEFINE([restrict], []) ;; + *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;; +esac + +AC_MSG_CHECKING(for C99 variable-size arrays) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], + [[static int x; char a[++x]; a[sizeof a - 1] = 0; int N; return a[0];]])], + [ has_var_arrays=yes + use_alloca="no (using var arrays)" + AC_DEFINE([VAR_ARRAYS], [1], [Use C99 variable-size arrays]) + ],[ + has_var_arrays=no + ]) +AC_MSG_RESULT([$has_var_arrays]) + +AS_IF([test "$has_var_arrays" = "no"], + [ + AC_CHECK_HEADERS([alloca.h]) + AC_MSG_CHECKING(for alloca) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int foo=10; int *array = alloca(foo);]])], + [ use_alloca=yes; + AC_DEFINE([USE_ALLOCA], [], [Make use of alloca]) + ],[ + use_alloca=no + ]) + AC_MSG_RESULT([$use_alloca]) + ]) + +LT_LIB_M + +AC_ARG_ENABLE([fixed-point], + [AS_HELP_STRING([--enable-fixed-point], + [compile without floating point (for machines without a fast enough FPU)])],, + [enable_fixed_point=no]) + +AS_IF([test "$enable_fixed_point" = "yes"],[ + enable_float="no" + AC_DEFINE([FIXED_POINT], [1], [Compile as fixed-point (for machines without a fast enough FPU)]) + PC_BUILD="fixed-point" +],[ + enable_float="yes"; + PC_BUILD="floating-point" +]) + +AM_CONDITIONAL([FIXED_POINT], [test "$enable_fixed_point" = "yes"]) + +AC_ARG_ENABLE([fixed-point-debug], + [AS_HELP_STRING([--enable-fixed-point-debug], [debug fixed-point implementation])],, + [enable_fixed_point_debug=no]) + +AS_IF([test "$enable_fixed_point_debug" = "yes"],[ + AC_DEFINE([FIXED_DEBUG], [1], [Debug fixed-point implementation]) +]) + +AC_ARG_ENABLE([float_api], + [AS_HELP_STRING([--disable-float-api], + [compile without the floating point API (for machines with no float library)])],, + [enable_float_api=yes]) + +AM_CONDITIONAL([DISABLE_FLOAT_API], [test "$enable_float_api" = "no"]) + +AS_IF([test "$enable_float_api" = "no"],[ + AC_DEFINE([DISABLE_FLOAT_API], [1], [Do not build the float API]) +]) + +AC_ARG_ENABLE([custom-modes], + [AS_HELP_STRING([--enable-custom-modes], [enable non-Opus modes, e.g. 44.1 kHz & 2^n frames])],, + [enable_custom_modes=no]) + +AS_IF([test "$enable_custom_modes" = "yes"],[ + AC_DEFINE([CUSTOM_MODES], [1], [Custom modes]) + PC_BUILD="$PC_BUILD, custom modes" +]) + +AM_CONDITIONAL([CUSTOM_MODES], [test "$enable_custom_modes" = "yes"]) + +has_float_approx=no +#case "$host_cpu" in +#i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64) +# has_float_approx=yes +# ;; +#esac + +AC_ARG_ENABLE([float-approx], + [AS_HELP_STRING([--enable-float-approx], [enable fast approximations for floating point])], + [if test "$enable_float_approx" = "yes"; then + AC_WARN([Floating point approximations are not supported on all platforms.]) + fi + ], + [enable_float_approx=$has_float_approx]) + +AS_IF([test "$enable_float_approx" = "yes"],[ + AC_DEFINE([FLOAT_APPROX], [1], [Float approximations]) +]) + +AC_ARG_ENABLE([asm], + [AS_HELP_STRING([--disable-asm], [Disable assembly optimizations])],, + [enable_asm=yes]) + +AC_ARG_ENABLE([rtcd], + [AS_HELP_STRING([--disable-rtcd], [Disable run-time CPU capabilities detection])],, + [enable_rtcd=yes]) + +AC_ARG_ENABLE([intrinsics], + [AS_HELP_STRING([--disable-intrinsics], [Disable intrinsics optimizations])],, + [enable_intrinsics=yes]) + +rtcd_support=no +cpu_arm=no + +AS_IF([test x"${enable_asm}" = x"yes"],[ + inline_optimization="No inline ASM for your platform, please send patches" + case $host_cpu in + arm*) + dnl Currently we only have asm for fixed-point + AS_IF([test "$enable_float" != "yes"],[ + cpu_arm=yes + AC_DEFINE([OPUS_ARM_ASM], [], [Make use of ARM asm optimization]) + AS_GCC_INLINE_ASSEMBLY( + [inline_optimization="ARM"], + [inline_optimization="disabled"] + ) + AS_ASM_ARM_EDSP([OPUS_ARM_INLINE_EDSP=1],[OPUS_ARM_INLINE_EDSP=0]) + AS_ASM_ARM_MEDIA([OPUS_ARM_INLINE_MEDIA=1], + [OPUS_ARM_INLINE_MEDIA=0]) + AS_ASM_ARM_NEON([OPUS_ARM_INLINE_NEON=1],[OPUS_ARM_INLINE_NEON=0]) + AS_IF([test x"$inline_optimization" = x"ARM"],[ + AM_CONDITIONAL([OPUS_ARM_INLINE_ASM],[true]) + AC_DEFINE([OPUS_ARM_INLINE_ASM], 1, + [Use generic ARMv4 inline asm optimizations]) + AS_IF([test x"$OPUS_ARM_INLINE_EDSP" = x"1"],[ + AC_DEFINE([OPUS_ARM_INLINE_EDSP], [1], + [Use ARMv5E inline asm optimizations]) + inline_optimization="$inline_optimization (EDSP)" + ]) + AS_IF([test x"$OPUS_ARM_INLINE_MEDIA" = x"1"],[ + AC_DEFINE([OPUS_ARM_INLINE_MEDIA], [1], + [Use ARMv6 inline asm optimizations]) + inline_optimization="$inline_optimization (Media)" + ]) + AS_IF([test x"$OPUS_ARM_INLINE_NEON" = x"1"],[ + AC_DEFINE([OPUS_ARM_INLINE_NEON], 1, + [Use ARM NEON inline asm optimizations]) + inline_optimization="$inline_optimization (NEON)" + ]) + ]) + dnl We need Perl to translate RVCT-syntax asm to gas syntax. + AC_CHECK_PROG([HAVE_PERL], perl, yes, no) + AS_IF([test x"$HAVE_PERL" = x"yes"],[ + AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM],[true]) + asm_optimization="ARM" + AS_IF([test x"$OPUS_ARM_INLINE_EDSP" = x"1"], [ + OPUS_ARM_PRESUME_EDSP=1 + OPUS_ARM_MAY_HAVE_EDSP=1 + ], + [ + OPUS_ARM_PRESUME_EDSP=0 + OPUS_ARM_MAY_HAVE_EDSP=0 + ]) + AS_IF([test x"$OPUS_ARM_INLINE_MEDIA" = x"1"], [ + OPUS_ARM_PRESUME_MEDIA=1 + OPUS_ARM_MAY_HAVE_MEDIA=1 + ], + [ + OPUS_ARM_PRESUME_MEDIA=0 + OPUS_ARM_MAY_HAVE_MEDIA=0 + ]) + AS_IF([test x"$OPUS_ARM_INLINE_NEON" = x"1"], [ + OPUS_ARM_PRESUME_NEON=1 + OPUS_ARM_MAY_HAVE_NEON=1 + ], + [ + OPUS_ARM_PRESUME_NEON=0 + OPUS_ARM_MAY_HAVE_NEON=0 + ]) + AS_IF([test x"$enable_rtcd" = x"yes"],[ + AS_IF([test x"$OPUS_ARM_MAY_HAVE_EDSP" != x"1"],[ + AC_MSG_NOTICE( + [Trying to force-enable armv5e EDSP instructions...]) + AS_ASM_ARM_EDSP_FORCE([OPUS_ARM_MAY_HAVE_EDSP=1]) + ]) + AS_IF([test x"$OPUS_ARM_MAY_HAVE_MEDIA" != x"1"],[ + AC_MSG_NOTICE( + [Trying to force-enable ARMv6 media instructions...]) + AS_ASM_ARM_MEDIA_FORCE([OPUS_ARM_MAY_HAVE_MEDIA=1]) + ]) + AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON" != x"1"],[ + AC_MSG_NOTICE( + [Trying to force-enable NEON instructions...]) + AS_ASM_ARM_NEON_FORCE([OPUS_ARM_MAY_HAVE_NEON=1]) + ]) + ]) + rtcd_support= + AS_IF([test x"$OPUS_ARM_MAY_HAVE_EDSP" = x"1"],[ + AC_DEFINE(OPUS_ARM_MAY_HAVE_EDSP, 1, + [Define if assembler supports EDSP instructions]) + AS_IF([test x"$OPUS_ARM_PRESUME_EDSP" = x"1"],[ + AC_DEFINE(OPUS_ARM_PRESUME_EDSP, 1, + [Define if binary requires EDSP instruction support]) + asm_optimization="$asm_optimization (EDSP)" + ], + [rtcd_support="$rtcd_support (EDSP)"] + ) + ]) + AC_SUBST(OPUS_ARM_MAY_HAVE_EDSP) + AS_IF([test x"$OPUS_ARM_MAY_HAVE_MEDIA" = x"1"],[ + AC_DEFINE(OPUS_ARM_MAY_HAVE_MEDIA, 1, + [Define if assembler supports ARMv6 media instructions]) + AS_IF([test x"$OPUS_ARM_PRESUME_MEDIA" = x"1"],[ + AC_DEFINE(OPUS_ARM_PRESUME_MEDIA, 1, + [Define if binary requires ARMv6 media instruction support]) + asm_optimization="$asm_optimization (Media)" + ], + [rtcd_support="$rtcd_support (Media)"] + ) + ]) + AC_SUBST(OPUS_ARM_MAY_HAVE_MEDIA) + AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON" = x"1"],[ + AC_DEFINE(OPUS_ARM_MAY_HAVE_NEON, 1, + [Define if compiler supports NEON instructions]) + AS_IF([test x"$OPUS_ARM_PRESUME_NEON" = x"1"], [ + AC_DEFINE(OPUS_ARM_PRESUME_NEON, 1, + [Define if binary requires NEON instruction support]) + asm_optimization="$asm_optimization (NEON)" + ], + [rtcd_support="$rtcd_support (NEON)"] + ) + ]) + AC_SUBST(OPUS_ARM_MAY_HAVE_NEON) + dnl Make sure turning on RTCD gets us at least one + dnl instruction set. + AS_IF([test x"$rtcd_support" != x""], + [rtcd_support=ARM"$rtcd_support"], + [rtcd_support="no"] + ) + AC_MSG_CHECKING([for apple style tools]) + AC_PREPROC_IFELSE([AC_LANG_PROGRAM([ +#ifndef __APPLE__ +#error 1 +#endif],[])], + [AC_MSG_RESULT([yes]); ARM2GNU_PARAMS="--apple"], + [AC_MSG_RESULT([no]); ARM2GNU_PARAMS=""]) + AC_SUBST(ARM2GNU_PARAMS) + ], + [ + AC_MSG_WARN( + [*** ARM assembly requires perl -- disabling optimizations]) + asm_optimization="(missing perl dependency for ARM)" + ]) + ]) + ;; + esac +],[ + inline_optimization="disabled" + asm_optimization="disabled" +]) + +AM_CONDITIONAL([OPUS_ARM_INLINE_ASM], + [test x"${inline_optimization%% *}" = x"ARM"]) +AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM], + [test x"${asm_optimization%% *}" = x"ARM"]) + +AM_CONDITIONAL([HAVE_SSE], [false]) +AM_CONDITIONAL([HAVE_SSE2], [false]) +AM_CONDITIONAL([HAVE_SSE4_1], [false]) +AM_CONDITIONAL([HAVE_AVX], [false]) + +m4_define([DEFAULT_X86_SSE_CFLAGS], [-msse]) +m4_define([DEFAULT_X86_SSE2_CFLAGS], [-msse2]) +m4_define([DEFAULT_X86_SSE4_1_CFLAGS], [-msse4.1]) +m4_define([DEFAULT_X86_AVX_CFLAGS], [-mavx]) +m4_define([DEFAULT_ARM_NEON_INTR_CFLAGS], [-mfpu=neon]) +# With GCC on ARM32 softfp architectures (e.g. Android, or older Ubuntu) you need to specify +# -mfloat-abi=softfp for -mfpu=neon to work. However, on ARM32 hardfp architectures (e.g. newer Ubuntu), +# this option will break things. + +# As a heuristic, if host matches arm*eabi* but not arm*hf*, it's probably soft-float. +m4_define([DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS], [-mfpu=neon -mfloat-abi=softfp]) + +AS_CASE([$host], + [arm*hf*], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_INTR_CFLAGS")], + [arm*eabi*], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS")], + [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_INTR_CFLAGS")]) + +AC_ARG_VAR([X86_SSE_CFLAGS], [C compiler flags to compile SSE intrinsics @<:@default=]DEFAULT_X86_SSE_CFLAGS[@:>@]) +AC_ARG_VAR([X86_SSE2_CFLAGS], [C compiler flags to compile SSE2 intrinsics @<:@default=]DEFAULT_X86_SSE2_CFLAGS[@:>@]) +AC_ARG_VAR([X86_SSE4_1_CFLAGS], [C compiler flags to compile SSE4.1 intrinsics @<:@default=]DEFAULT_X86_SSE4_1_CFLAGS[@:>@]) +AC_ARG_VAR([X86_AVX_CFLAGS], [C compiler flags to compile AVX intrinsics @<:@default=]DEFAULT_X86_AVX_CFLAGS[@:>@]) +AC_ARG_VAR([ARM_NEON_INTR_CFLAGS], [C compiler flags to compile ARM NEON intrinsics @<:@default=]DEFAULT_ARM_NEON_INTR_CFLAGS / DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS[@:>@]) + +AS_VAR_SET_IF([X86_SSE_CFLAGS], [], [AS_VAR_SET([X86_SSE_CFLAGS], "DEFAULT_X86_SSE_CFLAGS")]) +AS_VAR_SET_IF([X86_SSE2_CFLAGS], [], [AS_VAR_SET([X86_SSE2_CFLAGS], "DEFAULT_X86_SSE2_CFLAGS")]) +AS_VAR_SET_IF([X86_SSE4_1_CFLAGS], [], [AS_VAR_SET([X86_SSE4_1_CFLAGS], "DEFAULT_X86_SSE4_1_CFLAGS")]) +AS_VAR_SET_IF([X86_AVX_CFLAGS], [], [AS_VAR_SET([X86_AVX_CFLAGS], "DEFAULT_X86_AVX_CFLAGS")]) +AS_VAR_SET_IF([ARM_NEON_INTR_CFLAGS], [], [AS_VAR_SET([ARM_NEON_INTR_CFLAGS], ["$RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS"])]) + +AC_DEFUN([OPUS_PATH_NE10], + [ + AC_ARG_WITH(NE10, + AC_HELP_STRING([--with-NE10=PFX],[Prefix where libNE10 is installed (optional)]), + NE10_prefix="$withval", NE10_prefix="") + AC_ARG_WITH(NE10-libraries, + AC_HELP_STRING([--with-NE10-libraries=DIR], + [Directory where libNE10 library is installed (optional)]), + NE10_libraries="$withval", NE10_libraries="") + AC_ARG_WITH(NE10-includes, + AC_HELP_STRING([--with-NE10-includes=DIR], + [Directory where libNE10 header files are installed (optional)]), + NE10_includes="$withval", NE10_includes="") + + if test "x$NE10_libraries" != "x" ; then + NE10_LIBS="-L$NE10_libraries" + elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then + NE10_LIBS="" + elif test "x$NE10_prefix" != "x" ; then + NE10_LIBS="-L$NE10_prefix/lib" + elif test "x$prefix" != "xNONE" ; then + NE10_LIBS="-L$prefix/lib" + fi + + if test "x$NE10_prefix" != "xno" ; then + NE10_LIBS="$NE10_LIBS -lNE10" + fi + + if test "x$NE10_includes" != "x" ; then + NE10_CFLAGS="-I$NE10_includes" + elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then + NE10_CFLAGS="" + elif test "x$NE10_prefix" != "x" ; then + NE10_CFLAGS="-I$NE10_prefix/include" + elif test "x$prefix" != "xNONE"; then + NE10_CFLAGS="-I$prefix/include" + fi + + AC_MSG_CHECKING(for NE10) + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $NE10_CFLAGS" + save_LIBS="$LIBS"; LIBS="$LIBS $NE10_LIBS $LIBM" + AC_LINK_IFELSE( + [ + AC_LANG_PROGRAM( + [[#include + ]], + [[ + ne10_fft_cfg_float32_t cfg; + cfg = ne10_fft_alloc_c2c_float32_neon(480); + ]] + ) + ],[ + HAVE_ARM_NE10=1 + AC_MSG_RESULT([yes]) + ],[ + HAVE_ARM_NE10=0 + AC_MSG_RESULT([no]) + NE10_CFLAGS="" + NE10_LIBS="" + ] + ) + CFLAGS="$save_CFLAGS"; LIBS="$save_LIBS" + #Now we know if libNE10 is installed or not + AS_IF([test x"$HAVE_ARM_NE10" = x"1"], + [ + AC_DEFINE([HAVE_ARM_NE10], 1, [NE10 library is installed on host. Make sure it is on target!]) + AC_SUBST(HAVE_ARM_NE10) + AC_SUBST(NE10_CFLAGS) + AC_SUBST(NE10_LIBS) + ] + ) + ] +) + +AS_IF([test x"$enable_intrinsics" = x"yes"],[ + intrinsics_support="" + AS_CASE([$host_cpu], + [arm*|aarch64*], + [ + cpu_arm=yes + OPUS_CHECK_INTRINSICS( + [ARM Neon], + [$ARM_NEON_INTR_CFLAGS], + [OPUS_ARM_MAY_HAVE_NEON_INTR], + [OPUS_ARM_PRESUME_NEON_INTR], + [[#include + ]], + [[ + static float32x4_t A0, A1, SUMM; + SUMM = vmlaq_f32(SUMM, A0, A1); + return (int)vgetq_lane_f32(SUMM, 0); + ]] + ) + AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"], + [ + OPUS_ARM_NEON_INTR_CFLAGS="$ARM_NEON_INTR_CFLAGS" + AC_SUBST([OPUS_ARM_NEON_INTR_CFLAGS]) + ] + ) + + AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"], + [ + AC_DEFINE([OPUS_ARM_MAY_HAVE_NEON_INTR], 1, [Compiler supports ARMv7/Aarch64 Neon Intrinsics]) + intrinsics_support="$intrinsics_support (NEON)" + + AS_IF([test x"$enable_rtcd" != x"no" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"], + [AS_IF([test x"$rtcd_support" = x"no"], + [rtcd_support="ARM (NEON Intrinsics)"], + [rtcd_support="$rtcd_support (NEON Intrinsics)"])]) + + AS_IF([test x"$OPUS_ARM_PRESUME_NEON_INTR" = x"1"], + [AC_DEFINE([OPUS_ARM_PRESUME_NEON_INTR], 1, [Define if binary requires NEON intrinsics support])]) + + OPUS_PATH_NE10() + AS_IF([test x"$NE10_LIBS" != x""], + [ + intrinsics_support="$intrinsics_support (NE10)" + AS_IF([test x"enable_rtcd" != x"" \ + && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"], + [rtcd_support="$rtcd_support (NE10)"]) + ]) + + OPUS_CHECK_INTRINSICS( + [Aarch64 Neon], + [$ARM_NEON_INTR_CFLAGS], + [OPUS_ARM_MAY_HAVE_AARCH64_NEON_INTR], + [OPUS_ARM_PRESUME_AARCH64_NEON_INTR], + [[#include + ]], + [[ + static int32_t IN; + static int16_t OUT; + OUT = vqmovns_s32(IN); + ]] + ) + + AS_IF([test x"$OPUS_ARM_PRESUME_AARCH64_NEON_INTR" = x"1"], + [ + AC_DEFINE([OPUS_ARM_PRESUME_AARCH64_NEON_INTR], 1, [Define if binary requires Aarch64 Neon Intrinsics]) + intrinsics_support="$intrinsics_support (NEON [Aarch64])" + ]) + + AS_IF([test x"$intrinsics_support" = x""], + [intrinsics_support=no], + [intrinsics_support="ARM$intrinsics_support"]) + ], + [ + AC_MSG_WARN([Compiler does not support ARM intrinsics]) + intrinsics_support=no + ]) + ], + [i?86|x86_64], + [ + OPUS_CHECK_INTRINSICS( + [SSE], + [$X86_SSE_CFLAGS], + [OPUS_X86_MAY_HAVE_SSE], + [OPUS_X86_PRESUME_SSE], + [[#include + #include + ]], + [[ + __m128 mtest; + mtest = _mm_set1_ps((float)time(NULL)); + mtest = _mm_mul_ps(mtest, mtest); + return _mm_cvtss_si32(mtest); + ]] + ) + AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE" = x"1" && test x"$OPUS_X86_PRESUME_SSE" != x"1"], + [ + OPUS_X86_SSE_CFLAGS="$X86_SSE_CFLAGS" + AC_SUBST([OPUS_X86_SSE_CFLAGS]) + ] + ) + OPUS_CHECK_INTRINSICS( + [SSE2], + [$X86_SSE2_CFLAGS], + [OPUS_X86_MAY_HAVE_SSE2], + [OPUS_X86_PRESUME_SSE2], + [[#include + #include + ]], + [[ + __m128i mtest; + mtest = _mm_set1_epi32((int)time(NULL)); + mtest = _mm_mul_epu32(mtest, mtest); + return _mm_cvtsi128_si32(mtest); + ]] + ) + AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1" && test x"$OPUS_X86_PRESUME_SSE2" != x"1"], + [ + OPUS_X86_SSE2_CFLAGS="$X86_SSE2_CFLAGS" + AC_SUBST([OPUS_X86_SSE2_CFLAGS]) + ] + ) + OPUS_CHECK_INTRINSICS( + [SSE4.1], + [$X86_SSE4_1_CFLAGS], + [OPUS_X86_MAY_HAVE_SSE4_1], + [OPUS_X86_PRESUME_SSE4_1], + [[#include + #include + ]], + [[ + __m128i mtest; + mtest = _mm_set1_epi32((int)time(NULL)); + mtest = _mm_mul_epi32(mtest, mtest); + return _mm_cvtsi128_si32(mtest); + ]] + ) + AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1" && test x"$OPUS_X86_PRESUME_SSE4_1" != x"1"], + [ + OPUS_X86_SSE4_1_CFLAGS="$X86_SSE4_1_CFLAGS" + AC_SUBST([OPUS_X86_SSE4_1_CFLAGS]) + ] + ) + OPUS_CHECK_INTRINSICS( + [AVX], + [$X86_AVX_CFLAGS], + [OPUS_X86_MAY_HAVE_AVX], + [OPUS_X86_PRESUME_AVX], + [[#include + #include + ]], + [[ + __m256 mtest; + mtest = _mm256_set1_ps((float)time(NULL)); + mtest = _mm256_addsub_ps(mtest, mtest); + return _mm_cvtss_si32(_mm256_extractf128_ps(mtest, 0)); + ]] + ) + AS_IF([test x"$OPUS_X86_MAY_HAVE_AVX" = x"1" && test x"$OPUS_X86_PRESUME_AVX" != x"1"], + [ + OPUS_X86_AVX_CFLAGS="$X86_AVX_CFLAGS" + AC_SUBST([OPUS_X86_AVX_CFLAGS]) + ] + ) + AS_IF([test x"$rtcd_support" = x"no"], [rtcd_support=""]) + AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"], + [ + AC_DEFINE([OPUS_X86_MAY_HAVE_SSE], 1, [Compiler supports X86 SSE Intrinsics]) + intrinsics_support="$intrinsics_support SSE" + + AS_IF([test x"$OPUS_X86_PRESUME_SSE" = x"1"], + [AC_DEFINE([OPUS_X86_PRESUME_SSE], 1, [Define if binary requires SSE intrinsics support])], + [rtcd_support="$rtcd_support SSE"]) + ], + [ + AC_MSG_WARN([Compiler does not support SSE intrinsics]) + ]) + + AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"], + [ + AC_DEFINE([OPUS_X86_MAY_HAVE_SSE2], 1, [Compiler supports X86 SSE2 Intrinsics]) + intrinsics_support="$intrinsics_support SSE2" + + AS_IF([test x"$OPUS_X86_PRESUME_SSE2" = x"1"], + [AC_DEFINE([OPUS_X86_PRESUME_SSE2], 1, [Define if binary requires SSE2 intrinsics support])], + [rtcd_support="$rtcd_support SSE2"]) + ], + [ + AC_MSG_WARN([Compiler does not support SSE2 intrinsics]) + ]) + + AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"], + [ + AC_DEFINE([OPUS_X86_MAY_HAVE_SSE4_1], 1, [Compiler supports X86 SSE4.1 Intrinsics]) + intrinsics_support="$intrinsics_support SSE4.1" + + AS_IF([test x"$OPUS_X86_PRESUME_SSE4_1" = x"1"], + [AC_DEFINE([OPUS_X86_PRESUME_SSE4_1], 1, [Define if binary requires SSE4.1 intrinsics support])], + [rtcd_support="$rtcd_support SSE4.1"]) + ], + [ + AC_MSG_WARN([Compiler does not support SSE4.1 intrinsics]) + ]) + AS_IF([test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"], + [ + AC_DEFINE([OPUS_X86_MAY_HAVE_AVX], 1, [Compiler supports X86 AVX Intrinsics]) + intrinsics_support="$intrinsics_support AVX" + + AS_IF([test x"$OPUS_X86_PRESUME_AVX" = x"1"], + [AC_DEFINE([OPUS_X86_PRESUME_AVX], 1, [Define if binary requires AVX intrinsics support])], + [rtcd_support="$rtcd_support AVX"]) + ], + [ + AC_MSG_WARN([Compiler does not support AVX intrinsics]) + ]) + + AS_IF([test x"$intrinsics_support" = x""], + [intrinsics_support=no], + [intrinsics_support="x86$intrinsics_support"] + ) + AS_IF([test x"$rtcd_support" = x""], + [rtcd_support=no], + [rtcd_support="x86$rtcd_support"], + ) + + AS_IF([test x"$enable_rtcd" = x"yes" && test x"$rtcd_support" != x""],[ + get_cpuid_by_asm="no" + AC_MSG_CHECKING([How to get X86 CPU Info]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + #include + ]],[[ + unsigned int CPUInfo0; + unsigned int CPUInfo1; + unsigned int CPUInfo2; + unsigned int CPUInfo3; + unsigned int InfoType; + __asm__ __volatile__ ( + "cpuid": + "=a" (CPUInfo0), + "=b" (CPUInfo1), + "=c" (CPUInfo2), + "=d" (CPUInfo3) : + "a" (InfoType), "c" (0) + ); + ]])], + [get_cpuid_by_asm="yes" + AC_MSG_RESULT([Inline Assembly]) + AC_DEFINE([CPU_INFO_BY_ASM], [1], [Get CPU Info by asm method])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + #include + ]],[[ + unsigned int CPUInfo0; + unsigned int CPUInfo1; + unsigned int CPUInfo2; + unsigned int CPUInfo3; + unsigned int InfoType; + __get_cpuid(InfoType, &CPUInfo0, &CPUInfo1, &CPUInfo2, &CPUInfo3); + ]])], + [AC_MSG_RESULT([C method]) + AC_DEFINE([CPU_INFO_BY_C], [1], [Get CPU Info by c method])], + [AC_MSG_ERROR([no supported Get CPU Info method, please disable run-time CPU capabilities detection or intrinsics])])])]) + ], + [ + AC_MSG_WARN([No intrinsics support for your architecture]) + intrinsics_support="no" + ]) +], +[ + intrinsics_support="no" +]) + +AM_CONDITIONAL([CPU_ARM], [test "$cpu_arm" = "yes"]) +AM_CONDITIONAL([HAVE_ARM_NEON_INTR], + [test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"]) +AM_CONDITIONAL([HAVE_ARM_NE10], + [test x"$HAVE_ARM_NE10" = x"1"]) +AM_CONDITIONAL([HAVE_SSE], + [test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"]) +AM_CONDITIONAL([HAVE_SSE2], + [test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"]) +AM_CONDITIONAL([HAVE_SSE4_1], + [test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"]) +AM_CONDITIONAL([HAVE_AVX], + [test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"]) + +AS_IF([test x"$enable_rtcd" = x"yes"],[ + AS_IF([test x"$rtcd_support" != x"no"],[ + AC_DEFINE([OPUS_HAVE_RTCD], [1], + [Use run-time CPU capabilities detection]) + OPUS_HAVE_RTCD=1 + AC_SUBST(OPUS_HAVE_RTCD) + ]) +],[ + rtcd_support="disabled" +]) + +AC_ARG_ENABLE([assertions], + [AS_HELP_STRING([--enable-assertions],[enable additional software error checking])],, + [enable_assertions=no]) + +AS_IF([test "$enable_assertions" = "yes"], [ + AC_DEFINE([ENABLE_ASSERTIONS], [1], [Assertions]) +]) + +AC_ARG_ENABLE([hardening], + [AS_HELP_STRING([--disable-hardening],[disable run-time checks that are cheap and safe for use in production])],, + [enable_hardening=yes]) + +AS_IF([test "$enable_hardening" = "yes"], [ + AC_DEFINE([ENABLE_HARDENING], [1], [Hardening]) +]) + +AC_ARG_ENABLE([fuzzing], + [AS_HELP_STRING([--enable-fuzzing],[causes the encoder to make random decisions (do not use in production)])],, + [enable_fuzzing=no]) + +AS_IF([test "$enable_fuzzing" = "yes"], [ + AC_DEFINE([FUZZING], [1], [Fuzzing]) +]) + +AC_ARG_ENABLE([check-asm], + [AS_HELP_STRING([--enable-check-asm], + [enable bit-exactness checks between optimized and c implementations])],, + [enable_check_asm=no]) + +AS_IF([test "$enable_check_asm" = "yes"], [ + AC_DEFINE([OPUS_CHECK_ASM], [1], [Run bit-exactness checks between optimized and c implementations]) +]) + +AC_ARG_ENABLE([doc], + [AS_HELP_STRING([--disable-doc], [Do not build API documentation])],, + [enable_doc=yes]) + +AS_IF([test "$enable_doc" = "yes"], [ + AC_CHECK_PROG(HAVE_DOXYGEN, [doxygen], [yes], [no]) + AC_CHECK_PROG(HAVE_DOT, [dot], [yes], [no]) +],[ + HAVE_DOXYGEN=no +]) + +AM_CONDITIONAL([HAVE_DOXYGEN], [test "$HAVE_DOXYGEN" = "yes"]) + +AC_ARG_ENABLE([extra-programs], + [AS_HELP_STRING([--disable-extra-programs], [Do not build extra programs (demo and tests)])],, + [enable_extra_programs=yes]) + +AM_CONDITIONAL([EXTRA_PROGRAMS], [test "$enable_extra_programs" = "yes"]) + + +AC_ARG_ENABLE([rfc8251], + AS_HELP_STRING([--disable-rfc8251], [Disable bitstream fixes from RFC 8251]),, + [enable_rfc8251=yes]) + +AS_IF([test "$enable_rfc8251" = "no"], [ + AC_DEFINE([DISABLE_UPDATE_DRAFT], [1], [Disable bitstream fixes from RFC 8251]) +]) + + +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden" +AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) + +on_x86=no +case "$host_cpu" in +i[[3456]]86 | x86_64) + on_x86=yes + ;; +esac + +on_windows=no +case $host in +*cygwin*|*mingw*) + on_windows=yes + ;; +esac + +dnl Enable stack-protector-all only on x86 where it's well supported. +dnl on some platforms it causes crashes. Hopefully the OS's default's +dnl include this on platforms that work but have been missed here. +AC_ARG_ENABLE([stack-protector], + [AS_HELP_STRING([--disable-stack-protector],[Disable compiler stack hardening])],, + [ + AS_IF([test "$ac_cv_c_compiler_gnu" = "yes" && test "$on_x86" = "yes" && test "$on_windows" = "no"], + [enable_stack_protector=yes],[enable_stack_protector=no]) + ]) + +AS_IF([test "$enable_stack_protector" = "yes"], + [ + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fstack-protector-strong" + AC_MSG_CHECKING([if ${CC} supports -fstack-protector-strong]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ + AC_MSG_RESULT([no]) + enable_stack_protector=no + CFLAGS="$saved_CFLAGS" + ]) + ]) + +AS_IF([test x$ac_cv_c_compiler_gnu = xyes], + [AX_ADD_FORTIFY_SOURCE] +) + +CFLAGS="$CFLAGS -W" + +warn_CFLAGS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $warn_CFLAGS" +AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) + +saved_LIBS="$LIBS" +LIBS="$LIBS $LIBM" +AC_CHECK_FUNCS([lrintf]) +AC_CHECK_FUNCS([lrint]) +LIBS="$saved_LIBS" + +AC_CHECK_FUNCS([__malloc_hook]) + +AC_SUBST([PC_BUILD]) + +AC_CONFIG_FILES([ + Makefile + opus.pc + opus-uninstalled.pc + celt/arm/armopts.s + doc/Makefile + doc/Doxyfile +]) +AC_CONFIG_HEADERS([config.h]) + +AC_OUTPUT + +AC_MSG_NOTICE([ +------------------------------------------------------------------------ + $PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK. + + Compiler support: + + C99 var arrays: ................ ${has_var_arrays} + C99 lrintf: .................... ${ac_cv_func_lrintf} + Use alloca: .................... ${use_alloca} + + General configuration: + + Floating point support: ........ ${enable_float} + Fast float approximations: ..... ${enable_float_approx} + Fixed point debugging: ......... ${enable_fixed_point_debug} + Inline Assembly Optimizations: . ${inline_optimization} + External Assembly Optimizations: ${asm_optimization} + Intrinsics Optimizations: ...... ${intrinsics_support} + Run-time CPU detection: ........ ${rtcd_support} + Custom modes: .................. ${enable_custom_modes} + Assertion checking: ............ ${enable_assertions} + Hardening: ..................... ${enable_hardening} + Fuzzing: ....................... ${enable_fuzzing} + Check ASM: ..................... ${enable_check_asm} + + API documentation: ............. ${enable_doc} + Extra programs: ................ ${enable_extra_programs} +------------------------------------------------------------------------ + + Type "make; make install" to compile and install + Type "make check" to run the test suite +]) + diff --git a/external/opusfile-0.10/depcomp b/external/opus-1.3.1/depcomp similarity index 99% rename from external/opusfile-0.10/depcomp rename to external/opus-1.3.1/depcomp index fc98710e..b39f98f9 100755 --- a/external/opusfile-0.10/depcomp +++ b/external/opus-1.3.1/depcomp @@ -1,9 +1,9 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2013-05-30.07; # UTC +scriptversion=2016-01-11.22; # UTC -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -786,6 +786,6 @@ exit 0 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/external/opus-1.3.1/doc/Doxyfile.in b/external/opus-1.3.1/doc/Doxyfile.in new file mode 100644 index 00000000..36eee0b5 --- /dev/null +++ b/external/opus-1.3.1/doc/Doxyfile.in @@ -0,0 +1,335 @@ +# Doxyfile 1.8.10 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +# Only non-default options are included below to improve portability +# between doxygen versions. +# +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = Opus + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = @VERSION@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Opus audio codec (RFC 6716): API and operations manual" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = YES + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 8 + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = @top_srcdir@/include/opus.h \ + @top_srcdir@/include/opus_types.h \ + @top_srcdir@/include/opus_defines.h \ + @top_srcdir@/include/opus_multistream.h \ + @top_srcdir@/include/opus_custom.h + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = @top_srcdir@/doc/header.html + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = @top_srcdir@/doc/footer.html + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = @top_srcdir@/doc/customdoxygen.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = @top_srcdir@/doc/opus_logo.svg + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 0 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = https://www.mathjax.org/mathjax + +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# The PAPER_TYPE tag can be used to set the paper type that is used by the +# printer. +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x +# 14 inches) and executive (7.25 x 10.5 inches). +# The default value is: a4. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PAPER_TYPE = letter + +#--------------------------------------------------------------------------- +# Configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# classes and files. +# The default value is: NO. + +GENERATE_MAN = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be +# performed. Macro expansion can be done in a controlled way by setting +# EXPAND_ONLY_PREDEF to YES. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then +# the macro expansion is limited to the macros specified with the PREDEFINED and +# EXPAND_AS_DEFINED tags. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_ONLY_PREDEF = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by the +# preprocessor. +# This tag requires that the tag SEARCH_INCLUDES is set to YES. + +INCLUDE_PATH = + +# The PREDEFINED tag can be used to specify one or more macro names that are +# defined before the preprocessor is started (similar to the -D option of e.g. +# gcc). The argument of the tag is a list of macros of the form: name or +# name=definition (no spaces). If the definition and the "=" are omitted, "=1" +# is assumed. To prevent a macro definition from being undefined via #undef or +# recursively expanded use the := operator instead of the = operator. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +PREDEFINED = OPUS_EXPORT= \ + OPUS_CUSTOM_EXPORT= \ + OPUS_CUSTOM_EXPORT_STATIC= \ + OPUS_WARN_UNUSED_RESULT= \ + OPUS_ARG_NONNULL(_x)= + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz (see: +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# Bell Labs. + +# Debian defaults to YES here, while Fedora and Homebrew default to NO. +# So we set this based on whether the graphviz package is available at +# configure time. +# +HAVE_DOT = @HAVE_DOT@ diff --git a/external/opus-1.0.3/doc/Makefile.am b/external/opus-1.3.1/doc/Makefile.am similarity index 93% rename from external/opus-1.0.3/doc/Makefile.am rename to external/opus-1.3.1/doc/Makefile.am index 02f34931..31fddab4 100644 --- a/external/opus-1.0.3/doc/Makefile.am +++ b/external/opus-1.3.1/doc/Makefile.am @@ -9,7 +9,8 @@ DOCINPUTS = $(top_srcdir)/include/opus.h \ $(top_srcdir)/doc/footer.html \ $(top_srcdir)/doc/customdoxygen.css -EXTRA_DIST = customdoxygen.css Doxyfile.in footer.html header.html opus_logo.svg +EXTRA_DIST = customdoxygen.css Doxyfile.in footer.html header.html \ + opus_logo.svg trivial_example.c if HAVE_DOXYGEN @@ -35,6 +36,7 @@ clean-local: $(RM) -r latex $(RM) -r man $(RM) doxygen-build.stamp + $(RM) doxygen_sqlite3.db uninstall-local: $(RM) -r $(DESTDIR)$(docdir)/html diff --git a/external/opus-1.0.3/doc/Makefile.in b/external/opus-1.3.1/doc/Makefile.in similarity index 73% rename from external/opus-1.0.3/doc/Makefile.in rename to external/opus-1.3.1/doc/Makefile.in index d856efbd..a3264e1a 100644 --- a/external/opus-1.0.3/doc/Makefile.in +++ b/external/opus-1.3.1/doc/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,23 +14,61 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ esac; \ - test $$am__dry = yes; \ - } + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -51,25 +88,32 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc -DIST_COMMON = $(srcdir)/Doxyfile.in $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ - $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ - $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/m4/ax_add_fortify_source.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/opus-intrinsics.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = Doxyfile CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -77,16 +121,23 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Doxyfile.in $(srcdir)/Makefile.in TODO DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +ARM2GNU_PARAMS = @ARM2GNU_PARAMS@ +ARM_NEON_INTR_CFLAGS = @ARM_NEON_INTR_CFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ @@ -104,7 +155,10 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ +HAVE_ARM_NE10 = @HAVE_ARM_NE10@ +HAVE_DOT = @HAVE_DOT@ HAVE_DOXYGEN = @HAVE_DOXYGEN@ +HAVE_PERL = @HAVE_PERL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -119,17 +173,29 @@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NE10_CFLAGS = @NE10_CFLAGS@ +NE10_LIBS = @NE10_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OPUS_ARM_MAY_HAVE_EDSP = @OPUS_ARM_MAY_HAVE_EDSP@ +OPUS_ARM_MAY_HAVE_MEDIA = @OPUS_ARM_MAY_HAVE_MEDIA@ +OPUS_ARM_MAY_HAVE_NEON = @OPUS_ARM_MAY_HAVE_NEON@ +OPUS_ARM_NEON_INTR_CFLAGS = @OPUS_ARM_NEON_INTR_CFLAGS@ +OPUS_HAVE_RTCD = @OPUS_HAVE_RTCD@ OPUS_LT_AGE = @OPUS_LT_AGE@ OPUS_LT_CURRENT = @OPUS_LT_CURRENT@ OPUS_LT_REVISION = @OPUS_LT_REVISION@ +OPUS_X86_AVX_CFLAGS = @OPUS_X86_AVX_CFLAGS@ +OPUS_X86_SSE2_CFLAGS = @OPUS_X86_SSE2_CFLAGS@ +OPUS_X86_SSE4_1_CFLAGS = @OPUS_X86_SSE4_1_CFLAGS@ +OPUS_X86_SSE_CFLAGS = @OPUS_X86_SSE_CFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ @@ -141,16 +207,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PC_BUILD = @PC_BUILD@ -PC_LIBM = @PC_LIBM@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ -SIZE16 = @SIZE16@ -SIZE32 = @SIZE32@ STRIP = @STRIP@ -SYMBOL_VISIBILITY = @SYMBOL_VISIBILITY@ VERSION = @VERSION@ +X86_AVX_CFLAGS = @X86_AVX_CFLAGS@ +X86_SSE2_CFLAGS = @X86_SSE2_CFLAGS@ +X86_SSE4_1_CFLAGS = @X86_SSE4_1_CFLAGS@ +X86_SSE_CFLAGS = @X86_SSE_CFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -212,7 +278,9 @@ DOCINPUTS = $(top_srcdir)/include/opus.h \ $(top_srcdir)/doc/footer.html \ $(top_srcdir)/doc/customdoxygen.css -EXTRA_DIST = customdoxygen.css Doxyfile.in footer.html header.html opus_logo.svg +EXTRA_DIST = customdoxygen.css Doxyfile.in footer.html header.html \ + opus_logo.svg trivial_example.c + all: all-am .SUFFIXES: @@ -228,7 +296,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -254,11 +321,11 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: + +ctags CTAGS: -ctags: CTAGS -CTAGS: +cscope cscopelist: distdir: $(DISTFILES) @@ -326,8 +393,8 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -@HAVE_DOXYGEN_FALSE@uninstall-local: @HAVE_DOXYGEN_FALSE@install-data-local: +@HAVE_DOXYGEN_FALSE@uninstall-local: @HAVE_DOXYGEN_FALSE@clean-local: clean: clean-am @@ -398,17 +465,19 @@ uninstall-am: uninstall-local .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ - clean-libtool clean-local distclean distclean-generic \ - distclean-libtool distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am \ - install-data-local install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ + clean-libtool clean-local cscopelist-am ctags-am distclean \ + distclean-generic distclean-libtool distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-local + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-local + +.PRECIOUS: Makefile @HAVE_DOXYGEN_TRUE@all-local: doxygen-build.stamp @@ -432,6 +501,7 @@ uninstall-am: uninstall-local @HAVE_DOXYGEN_TRUE@ $(RM) -r latex @HAVE_DOXYGEN_TRUE@ $(RM) -r man @HAVE_DOXYGEN_TRUE@ $(RM) doxygen-build.stamp +@HAVE_DOXYGEN_TRUE@ $(RM) doxygen_sqlite3.db @HAVE_DOXYGEN_TRUE@uninstall-local: @HAVE_DOXYGEN_TRUE@ $(RM) -r $(DESTDIR)$(docdir)/html diff --git a/external/opus-1.3.1/doc/TODO b/external/opus-1.3.1/doc/TODO new file mode 100644 index 00000000..9e1c2d51 --- /dev/null +++ b/external/opus-1.3.1/doc/TODO @@ -0,0 +1,7 @@ +define audio bandwidth as frequency range + +repeat padding recommendation + +ptime: refer to RFC + +Opus does not provide any confidentiality or integrity protection diff --git a/external/opus-1.0.3/doc/customdoxygen.css b/external/opus-1.3.1/doc/customdoxygen.css similarity index 57% rename from external/opus-1.0.3/doc/customdoxygen.css rename to external/opus-1.3.1/doc/customdoxygen.css index 4bce44db..70047787 100644 --- a/external/opus-1.0.3/doc/customdoxygen.css +++ b/external/opus-1.3.1/doc/customdoxygen.css @@ -1,62 +1,62 @@ /* The standard CSS for doxygen */ body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 13px; - line-height: 1.3; + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 13px; + line-height: 1.3; } /* @group Heading Levels */ h1 { - font-size: 150%; + font-size: 150%; } .title { - font-size: 150%; - font-weight: bold; - margin: 10px 2px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; } h2 { - font-size: 120%; + font-size: 120%; } h3 { - font-size: 100%; + font-size: 100%; } dt { - font-weight: bold; + font-weight: bold; } div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { - margin-top: 2px; + margin-top: 2px; } p.endli { - margin-bottom: 0px; + margin-bottom: 0px; } p.enddd { - margin-bottom: 4px; + margin-bottom: 4px; } p.endtd { - margin-bottom: 2px; + margin-bottom: 2px; } /* @end */ caption { - font-weight: bold; + font-weight: bold; } span.legend { @@ -70,45 +70,45 @@ h3.version { } div.qindex, div.navtab{ - background-color: #F1F1F1; - border: 1px solid #BDBDBD; - text-align: center; + background-color: #F1F1F1; + border: 1px solid #BDBDBD; + text-align: center; } div.qindex, div.navpath { - width: 100%; - line-height: 140%; + width: 100%; + line-height: 140%; } div.navtab { - margin-right: 15px; + margin-right: 15px; } /* @group Link Styling */ a { - color: #646464; - font-weight: normal; - text-decoration: none; + color: #646464; + font-weight: normal; + text-decoration: none; } .contents a:visited { - color: #747474; + color: #747474; } a:hover { - text-decoration: underline; + text-decoration: underline; } a.qindex { - font-weight: bold; + font-weight: bold; } a.qindexHL { - font-weight: bold; - background-color: #B8B8B8; - color: #ffffff; - border: 1px double #A8A8A8; + font-weight: bold; + background-color: #B8B8B8; + color: #ffffff; + border: 1px double #A8A8A8; } .contents a.qindexHL:visited { @@ -116,181 +116,181 @@ a.qindexHL { } a.el { - font-weight: bold; + font-weight: bold; } a.elRef { } a.code, a.code:visited { - color: #4665A2; + color: #4665A2; } a.codeRef, a.codeRef:visited { - color: #4665A2; + color: #4665A2; } /* @end */ dl.el { - margin-left: -1cm; + margin-left: -1cm; } .fragment { - font-family: monospace, fixed; - font-size: 105%; + font-family: monospace, fixed; + font-size: 105%; } pre.fragment { - border: 1px solid #D5D5D5; - background-color: #FCFCFC; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; + border: 1px solid #D5D5D5; + background-color: #FCFCFC; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; } div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; + margin-left: 16px; + margin-top: 12px; + font-weight: bold; } div.groupText { - margin-left: 16px; - font-style: italic; + margin-left: 16px; + font-style: italic; } body { - background-color: white; - color: black; + background-color: white; + color: black; margin: 0; } div.contents { - margin-top: 10px; - margin-left: 8px; - margin-right: 8px; + margin-top: 10px; + margin-left: 8px; + margin-right: 8px; } td.indexkey { - background-color: #F1F1F1; - font-weight: bold; - border: 1px solid #D5D5D5; - margin: 2px 0px 2px 0; - padding: 2px 10px; + background-color: #F1F1F1; + font-weight: bold; + border: 1px solid #D5D5D5; + margin: 2px 0px 2px 0; + padding: 2px 10px; white-space: nowrap; vertical-align: top; } td.indexvalue { - background-color: #F1F1F1; - border: 1px solid #D5D5D5; - padding: 2px 10px; - margin: 2px 0px; + background-color: #F1F1F1; + border: 1px solid #D5D5D5; + padding: 2px 10px; + margin: 2px 0px; } tr.memlist { - background-color: #F2F2F2; + background-color: #F2F2F2; } p.formulaDsp { - text-align: center; + text-align: center; } img.formulaDsp { - + } img.formulaInl { - vertical-align: middle; + vertical-align: middle; } div.center { - text-align: center; + text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { - border: 0px; + border: 0px; } address.footer { - text-align: right; - padding-right: 12px; + text-align: right; + padding-right: 12px; } img.footer { - border: 0px; - vertical-align: middle; + border: 0px; + vertical-align: middle; } /* @group Code Colorization */ span.keyword { - color: #008000 + color: #008000 } span.keywordtype { - color: #604020 + color: #604020 } span.keywordflow { - color: #e08000 + color: #e08000 } span.comment { - color: #800000 + color: #800000 } span.preprocessor { - color: #806020 + color: #806020 } span.stringliteral { - color: #002080 + color: #002080 } span.charliteral { - color: #008080 + color: #008080 } -span.vhdldigit { - color: #ff00ff +span.vhdldigit { + color: #ff00ff } -span.vhdlchar { - color: #000000 +span.vhdlchar { + color: #000000 } -span.vhdlkeyword { - color: #700070 +span.vhdlkeyword { + color: #700070 } -span.vhdllogic { - color: #ff0000 +span.vhdllogic { + color: #ff0000 } blockquote { @@ -304,71 +304,71 @@ blockquote { /* .search { - color: #003399; - font-weight: bold; + color: #003399; + font-weight: bold; } form.search { - margin-bottom: 0px; - margin-top: 0px; + margin-bottom: 0px; + margin-top: 0px; } input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } */ td.tiny { - font-size: 75%; + font-size: 75%; } .dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #BDBDBD; + padding: 4px; + border-collapse: collapse; + border: 1px solid #BDBDBD; } th.dirtab { - background: #F1F1F1; - font-weight: bold; + background: #F1F1F1; + font-weight: bold; } hr { - height: 0px; - border: none; - border-top: 1px solid #7A7A7A; + height: 0px; + border: none; + border-top: 1px solid #7A7A7A; } hr.footer { - height: 1px; + height: 1px; } /* @group Member Descriptions */ table.memberdecls { - border-spacing: 0px; - padding: 0px; + border-spacing: 0px; + padding: 0px; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #FAFAFA; - border: none; - margin: 4px; - padding: 1px 0 0 8px; + background-color: #FAFAFA; + border: none; + margin: 4px; + padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; + padding: 0px 8px 4px 8px; + color: #555; } .memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #D5D5D5; + border-top: 1px solid #D5D5D5; } .memItemLeft, .memTemplItemLeft { @@ -376,11 +376,11 @@ table.memberdecls { } .memItemRight { - width: 100%; + width: 100%; } .memTemplParams { - color: #747474; + color: #747474; white-space: nowrap; } @@ -391,29 +391,29 @@ table.memberdecls { /* Styles for detailed member documentation */ .memtemplate { - font-size: 80%; - color: #747474; - font-weight: normal; - margin-left: 9px; + font-size: 80%; + color: #747474; + font-weight: normal; + margin-left: 9px; } .memnav { - background-color: #F1F1F1; - border: 1px solid #BDBDBD; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; + background-color: #F1F1F1; + border: 1px solid #BDBDBD; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; } .mempage { - width: 100%; + width: 100%; } .memitem { - padding: 0; - margin-bottom: 10px; - margin-right: 5px; + padding: 0; + margin-bottom: 10px; + margin-right: 5px; } .memname { @@ -449,9 +449,9 @@ table.memberdecls { } .memdoc, dl.reflist dd { - border-bottom: 1px solid #C0C0C0; - border-left: 1px solid #C0C0C0; - border-right: 1px solid #C0C0C0; + border-bottom: 1px solid #C0C0C0; + border-left: 1px solid #C0C0C0; + border-right: 1px solid #C0C0C0; padding: 2px 5px; background-color: #FCFCFC; border-top-width: 0; @@ -481,35 +481,35 @@ dl.reflist dd { } .paramkey { - text-align: right; + text-align: right; } .paramtype { - white-space: nowrap; + white-space: nowrap; } .paramname { - color: #602020; - white-space: nowrap; + color: #602020; + white-space: nowrap; } .paramname em { - font-style: normal; + font-style: normal; } .params, .retval, .exception, .tparams { border-spacing: 6px 2px; -} +} .params .paramname, .retval .paramname { font-weight: bold; vertical-align: top; } - + .params .paramtype { font-style: italic; vertical-align: top; -} - +} + .params .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; @@ -525,22 +525,22 @@ dl.reflist dd { /* for the tree view */ .ftvtree { - font-family: sans-serif; - margin: 0px; + font-family: sans-serif; + margin: 0px; } /* these are for tree view when used as main index */ .directory { - font-size: 9pt; - font-weight: bold; - margin: 5px; + font-size: 9pt; + font-weight: bold; + margin: 5px; } .directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + margin: 0px; + margin-top: 1em; + font-size: 11pt; } /* @@ -552,62 +552,62 @@ proper pixel height of your image. /* .directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); } .directory h3.swap span { - display: none; + display: none; } */ .directory > h3 { - margin-top: 0; + margin-top: 0; } .directory p { - margin: 0px; - white-space: nowrap; + margin: 0px; + white-space: nowrap; } .directory div { - display: none; - margin: 0px; + display: none; + margin: 0px; } .directory img { - vertical-align: -30%; + vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { - font-size: 100%; - font-weight: bold; + font-size: 100%; + font-weight: bold; } .directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + margin: 0px; + margin-top: 1em; + font-size: 11pt; } .directory-alt > h3 { - margin-top: 0; + margin-top: 0; } .directory-alt p { - margin: 0px; - white-space: nowrap; + margin: 0px; + white-space: nowrap; } .directory-alt div { - display: none; - margin: 0px; + display: none; + margin: 0px; } .directory-alt img { - vertical-align: -30%; + vertical-align: -30%; } /* @end */ @@ -617,27 +617,27 @@ div.dynheader { } address { - font-style: normal; - color: #464646; + font-style: normal; + color: #464646; } table.doxtable { - border-collapse:collapse; + border-collapse:collapse; margin-top: 4px; margin-bottom: 4px; } table.doxtable td, table.doxtable th { - border: 1px solid #4A4A4A; - padding: 3px 7px 2px; + border: 1px solid #4A4A4A; + padding: 3px 7px 2px; } table.doxtable th { - background-color: #5B5B5B; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; + background-color: #5B5B5B; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; } table.fieldtable { @@ -693,52 +693,52 @@ table.fieldtable { .tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; } .navpath ul { - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - height:30px; - line-height:30px; - color:#ABABAB; - border:solid 1px #D3D3D3; - overflow:hidden; - margin:0px; - padding:0px; + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + height:30px; + line-height:30px; + color:#ABABAB; + border:solid 1px #D3D3D3; + overflow:hidden; + margin:0px; + padding:0px; } .navpath li { - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#595959; + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#595959; } .navpath li.navelem a { - height:32px; - display:block; - text-decoration: none; - outline: none; + height:32px; + display:block; + text-decoration: none; + outline: none; } .navpath li.navelem a:hover { - color:#929292; + color:#929292; } .navpath li.footer @@ -757,44 +757,44 @@ table.fieldtable { div.summary { - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} div.summary a { - white-space: nowrap; + white-space: nowrap; } div.ingroups { - margin-left: 5px; - font-size: 8pt; - padding-left: 5px; - width: 50%; - text-align: left; + margin-left: 5px; + font-size: 8pt; + padding-left: 5px; + width: 50%; + text-align: left; } div.ingroups a { - white-space: nowrap; + white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; - background-color: #FAFAFA; - margin: 0px; - border-bottom: 1px solid #D5D5D5; + background-color: #FAFAFA; + margin: 0px; + border-bottom: 1px solid #D5D5D5; } div.headertitle { - padding: 5px 5px 5px 7px; + padding: 5px 5px 5px 7px; } dl @@ -845,49 +845,49 @@ dl.bug } dl.section dd { - margin-bottom: 6px; + margin-bottom: 6px; } #projectlogo { - text-align: center; - vertical-align: bottom; - border-collapse: separate; + text-align: center; + vertical-align: bottom; + border-collapse: separate; } - + #projectlogo img -{ - border: 0px none; +{ + border: 0px none; } - + #projectname { - font: 300% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 2px 0px; + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; } - + #projectbrief { - font: 120% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; } #projectnumber { - font: 100% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; + font: 100% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; } #titlearea { - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid #848484; + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #848484; } .image @@ -907,12 +907,12 @@ dl.section dd { .caption { - font-weight: bold; + font-weight: bold; } div.zoom { - border: 1px solid #AFAFAF; + border: 1px solid #AFAFAF; } dl.citelist { @@ -953,7 +953,7 @@ div.toc li { div.toc h3 { font: bold 12px/1.2 Arial,FreeSans,sans-serif; - color: #747474; + color: #747474; border-bottom: 0 none; margin: 0; } @@ -962,7 +962,7 @@ div.toc ul { list-style: none outside none; border: medium none; padding: 0px; -} +} div.toc li.level1 { margin-left: 0px; @@ -1009,4 +1009,3 @@ div.toc li.level4 { word-wrap: break-word; /* IE 5.5+ */ } } - diff --git a/external/opus-1.3.1/doc/footer.html b/external/opus-1.3.1/doc/footer.html new file mode 100644 index 00000000..ad4a9259 --- /dev/null +++ b/external/opus-1.3.1/doc/footer.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + +
+For more information visit the Opus Website. + + +
+ + + diff --git a/external/opus-1.0.3/doc/header.html b/external/opus-1.3.1/doc/header.html similarity index 100% rename from external/opus-1.0.3/doc/header.html rename to external/opus-1.3.1/doc/header.html diff --git a/external/opus-1.0.3/doc/opus_logo.svg b/external/opus-1.3.1/doc/opus_logo.svg similarity index 98% rename from external/opus-1.0.3/doc/opus_logo.svg rename to external/opus-1.3.1/doc/opus_logo.svg index 97112afd..db2879ef 100644 --- a/external/opus-1.0.3/doc/opus_logo.svg +++ b/external/opus-1.3.1/doc/opus_logo.svg @@ -59,11 +59,11 @@ y1="95.107399" x2="194.53169" y2="9.9475983e-14"> - - @@ -76,11 +76,11 @@ y1="116.208" x2="229.61819" y2="164.46291"> - - @@ -93,11 +93,11 @@ y1="115.4395" x2="43.9897" y2="165.2314"> - - @@ -110,11 +110,11 @@ y1="115.7188" x2="311.2847" y2="165.2822"> - - @@ -127,11 +127,11 @@ y1="115.5791" x2="129.1987" y2="204.4863"> - - diff --git a/external/opus-1.3.1/doc/trivial_example.c b/external/opus-1.3.1/doc/trivial_example.c new file mode 100644 index 00000000..047ca0a2 --- /dev/null +++ b/external/opus-1.3.1/doc/trivial_example.c @@ -0,0 +1,160 @@ +/* Copyright (c) 2013 Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This is meant to be a simple example of encoding and decoding audio + using Opus. It should make it easy to understand how the Opus API + works. For more information, see the full API documentation at: + https://www.opus-codec.org/docs/ */ + +#include +#include +#include +#include +#include + +/*The frame size is hardcoded for this sample code but it doesn't have to be*/ +#define FRAME_SIZE 960 +#define SAMPLE_RATE 48000 +#define CHANNELS 2 +#define APPLICATION OPUS_APPLICATION_AUDIO +#define BITRATE 64000 + +#define MAX_FRAME_SIZE 6*960 +#define MAX_PACKET_SIZE (3*1276) + +int main(int argc, char **argv) +{ + char *inFile; + FILE *fin; + char *outFile; + FILE *fout; + opus_int16 in[FRAME_SIZE*CHANNELS]; + opus_int16 out[MAX_FRAME_SIZE*CHANNELS]; + unsigned char cbits[MAX_PACKET_SIZE]; + int nbBytes; + /*Holds the state of the encoder and decoder */ + OpusEncoder *encoder; + OpusDecoder *decoder; + int err; + + if (argc != 3) + { + fprintf(stderr, "usage: trivial_example input.pcm output.pcm\n"); + fprintf(stderr, "input and output are 16-bit little-endian raw files\n"); + return EXIT_FAILURE; + } + + /*Create a new encoder state */ + encoder = opus_encoder_create(SAMPLE_RATE, CHANNELS, APPLICATION, &err); + if (err<0) + { + fprintf(stderr, "failed to create an encoder: %s\n", opus_strerror(err)); + return EXIT_FAILURE; + } + /* Set the desired bit-rate. You can also set other parameters if needed. + The Opus library is designed to have good defaults, so only set + parameters you know you need. Doing otherwise is likely to result + in worse quality, but better. */ + err = opus_encoder_ctl(encoder, OPUS_SET_BITRATE(BITRATE)); + if (err<0) + { + fprintf(stderr, "failed to set bitrate: %s\n", opus_strerror(err)); + return EXIT_FAILURE; + } + inFile = argv[1]; + fin = fopen(inFile, "r"); + if (fin==NULL) + { + fprintf(stderr, "failed to open input file: %s\n", strerror(errno)); + return EXIT_FAILURE; + } + + + /* Create a new decoder state. */ + decoder = opus_decoder_create(SAMPLE_RATE, CHANNELS, &err); + if (err<0) + { + fprintf(stderr, "failed to create decoder: %s\n", opus_strerror(err)); + return EXIT_FAILURE; + } + outFile = argv[2]; + fout = fopen(outFile, "w"); + if (fout==NULL) + { + fprintf(stderr, "failed to open output file: %s\n", strerror(errno)); + return EXIT_FAILURE; + } + + while (1) + { + int i; + unsigned char pcm_bytes[MAX_FRAME_SIZE*CHANNELS*2]; + int frame_size; + + /* Read a 16 bits/sample audio frame. */ + fread(pcm_bytes, sizeof(short)*CHANNELS, FRAME_SIZE, fin); + if (feof(fin)) + break; + /* Convert from little-endian ordering. */ + for (i=0;i>8)&0xFF; + } + /* Write the decoded audio to file. */ + fwrite(pcm_bytes, sizeof(short), frame_size*CHANNELS, fout); + } + /*Destroy the encoder state*/ + opus_encoder_destroy(encoder); + opus_decoder_destroy(decoder); + fclose(fin); + fclose(fout); + return EXIT_SUCCESS; +} diff --git a/external/opus-1.0.3/include/opus.h b/external/opus-1.3.1/include/opus.h similarity index 90% rename from external/opus-1.0.3/include/opus.h rename to external/opus-1.3.1/include/opus.h index ce860388..d282f21d 100644 --- a/external/opus-1.0.3/include/opus.h +++ b/external/opus-1.3.1/include/opus.h @@ -142,7 +142,7 @@ extern "C" { * * opus_encode() and opus_encode_float() return the number of bytes actually written to the packet. * The return value can be negative, which indicates that an error has occurred. If the return value - * is 1 byte, then the packet does not need to be transmitted (DTX). + * is 2 bytes or less, then the packet does not need to be transmitted (DTX). * * Once the encoder state if no longer needed, it can be destroyed with * @@ -531,7 +531,7 @@ OPUS_EXPORT int opus_packet_parse( const unsigned char *frames[48], opus_int16 size[48], int *payload_offset -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5); /** Gets the bandwidth of an Opus packet. * @param [in] data char*: Opus packet @@ -592,6 +592,20 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigne * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); + +/** Applies soft-clipping to bring a float signal within the [-1,1] range. If + * the signal is already in that range, nothing is done. If there are values + * outside of [-1,1], then the signal is clipped as smoothly as possible to + * both fit in the range and avoid creating excessive distortion in the + * process. + * @param [in,out] pcm float*: Input PCM and modified PCM + * @param [in] frame_size int Number of samples per channel to process + * @param [in] channels int: Number of channels + * @param [in,out] softclip_mem float*: State memory for the soft clipping process (one float per channel, initialized to zero) + */ +OPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem); + + /**@}*/ /** @defgroup opus_repacketizer Repacketizer @@ -602,7 +616,10 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDe * merged. Splitting valid Opus packets is always guaranteed to succeed, * whereas merging valid packets only succeeds if all frames have the same * mode, bandwidth, and frame size, and when the total duration of the merged - * packet is no more than 120 ms. + * packet is no more than 120 ms. The 120 ms limit comes from the + * specification and limits decoder memory requirements at a point where + * framing overhead becomes negligible. + * * The repacketizer currently only operates on elementary Opus * streams. It will not manipualte multistream packets successfully, except in * the degenerate case where they consist of data from a single stream. @@ -897,6 +914,64 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepa */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1); +/** Pads a given Opus packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len); + +/** Remove all padding from a given Opus packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len); + +/** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams); + +/** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams); + /**@}*/ #ifdef __cplusplus diff --git a/external/opus-1.0.3/include/opus_custom.h b/external/opus-1.3.1/include/opus_custom.h similarity index 97% rename from external/opus-1.0.3/include/opus_custom.h rename to external/opus-1.3.1/include/opus_custom.h index e7861d6f..41f36bf2 100644 --- a/external/opus-1.0.3/include/opus_custom.h +++ b/external/opus-1.3.1/include/opus_custom.h @@ -42,15 +42,15 @@ extern "C" { #endif #ifdef CUSTOM_MODES -#define OPUS_CUSTOM_EXPORT OPUS_EXPORT -#define OPUS_CUSTOM_EXPORT_STATIC OPUS_EXPORT +# define OPUS_CUSTOM_EXPORT OPUS_EXPORT +# define OPUS_CUSTOM_EXPORT_STATIC OPUS_EXPORT #else -#define OPUS_CUSTOM_EXPORT -#ifdef CELT_C -#define OPUS_CUSTOM_EXPORT_STATIC static inline -#else -#define OPUS_CUSTOM_EXPORT_STATIC -#endif +# define OPUS_CUSTOM_EXPORT +# ifdef OPUS_BUILD +# define OPUS_CUSTOM_EXPORT_STATIC static OPUS_INLINE +# else +# define OPUS_CUSTOM_EXPORT_STATIC +# endif #endif /** @defgroup opus_custom Opus Custom @@ -126,6 +126,9 @@ OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomMode *opus_custom_mode_crea */ OPUS_CUSTOM_EXPORT void opus_custom_mode_destroy(OpusCustomMode *mode); + +#if !defined(OPUS_BUILD) || defined(CELT_ENCODER_C) + /* Encoder */ /** Gets the size of an OpusCustomEncoder structure. * @param [in] mode OpusCustomMode *: Mode configuration @@ -137,21 +140,7 @@ OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_encoder_get_si int channels ) OPUS_ARG_NONNULL(1); -/** Creates a new encoder state. Each stream needs its own encoder - * state (can't be shared across simultaneous streams). - * @param [in] mode OpusCustomMode*: Contains all the information about the characteristics of - * the stream (must be the same characteristics as used for the - * decoder) - * @param [in] channels int: Number of channels - * @param [out] error int*: Returns an error code - * @return Newly created encoder state. -*/ -OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomEncoder *opus_custom_encoder_create( - const OpusCustomMode *mode, - int channels, - int *error -) OPUS_ARG_NONNULL(1); - +# ifdef CUSTOM_MODES /** Initializes a previously allocated encoder state * The memory pointed to by st must be the size returned by opus_custom_encoder_get_size. * This is intended for applications which use their own allocator instead of malloc. @@ -164,11 +153,30 @@ OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomEncoder *opus_custom_encode * @param [in] channels int: Number of channels * @return OPUS_OK Success or @ref opus_errorcodes */ -OPUS_CUSTOM_EXPORT_STATIC int opus_custom_encoder_init( +OPUS_CUSTOM_EXPORT int opus_custom_encoder_init( OpusCustomEncoder *st, const OpusCustomMode *mode, int channels ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); +# endif +#endif + + +/** Creates a new encoder state. Each stream needs its own encoder + * state (can't be shared across simultaneous streams). + * @param [in] mode OpusCustomMode*: Contains all the information about the characteristics of + * the stream (must be the same characteristics as used for the + * decoder) + * @param [in] channels int: Number of channels + * @param [out] error int*: Returns an error code + * @return Newly created encoder state. +*/ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomEncoder *opus_custom_encoder_create( + const OpusCustomMode *mode, + int channels, + int *error +) OPUS_ARG_NONNULL(1); + /** Destroys a an encoder state. * @param[in] st OpusCustomEncoder*: State to be freed. @@ -229,6 +237,8 @@ OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode( */ OPUS_CUSTOM_EXPORT int opus_custom_encoder_ctl(OpusCustomEncoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1); + +#if !defined(OPUS_BUILD) || defined(CELT_DECODER_C) /* Decoder */ /** Gets the size of an OpusCustomDecoder structure. @@ -241,20 +251,6 @@ OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_decoder_get_si int channels ) OPUS_ARG_NONNULL(1); -/** Creates a new decoder state. Each stream needs its own decoder state (can't - * be shared across simultaneous streams). - * @param [in] mode OpusCustomMode: Contains all the information about the characteristics of the - * stream (must be the same characteristics as used for the encoder) - * @param [in] channels int: Number of channels - * @param [out] error int*: Returns an error code - * @return Newly created decoder state. - */ -OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomDecoder *opus_custom_decoder_create( - const OpusCustomMode *mode, - int channels, - int *error -) OPUS_ARG_NONNULL(1); - /** Initializes a previously allocated decoder state * The memory pointed to by st must be the size returned by opus_custom_decoder_get_size. * This is intended for applications which use their own allocator instead of malloc. @@ -273,6 +269,23 @@ OPUS_CUSTOM_EXPORT_STATIC int opus_custom_decoder_init( int channels ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); +#endif + + +/** Creates a new decoder state. Each stream needs its own decoder state (can't + * be shared across simultaneous streams). + * @param [in] mode OpusCustomMode: Contains all the information about the characteristics of the + * stream (must be the same characteristics as used for the encoder) + * @param [in] channels int: Number of channels + * @param [out] error int*: Returns an error code + * @return Newly created decoder state. + */ +OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomDecoder *opus_custom_decoder_create( + const OpusCustomMode *mode, + int channels, + int *error +) OPUS_ARG_NONNULL(1); + /** Destroys a an decoder state. * @param[in] st OpusCustomDecoder*: State to be freed. */ diff --git a/external/opus-1.0.3/include/opus_defines.h b/external/opus-1.3.1/include/opus_defines.h similarity index 78% rename from external/opus-1.0.3/include/opus_defines.h rename to external/opus-1.3.1/include/opus_defines.h index 965ce030..ceee5b84 100644 --- a/external/opus-1.0.3/include/opus_defines.h +++ b/external/opus-1.3.1/include/opus_defines.h @@ -46,7 +46,7 @@ extern "C" { #define OPUS_OK 0 /** One or more invalid/out of range arguments @hideinitializer*/ #define OPUS_BAD_ARG -1 -/** The mode struct passed is invalid @hideinitializer*/ +/** Not enough bytes allocated in the buffer @hideinitializer*/ #define OPUS_BUFFER_TOO_SMALL -2 /** An internal error was detected @hideinitializer*/ #define OPUS_INTERNAL_ERROR -3 @@ -98,6 +98,18 @@ extern "C" { # define OPUS_RESTRICT restrict #endif +#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if OPUS_GNUC_PREREQ(2,7) +# define OPUS_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define OPUS_INLINE __inline +# else +# define OPUS_INLINE +# endif +#else +# define OPUS_INLINE inline +#endif + /**Warning attributes for opus functions * NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out * some paranoid null checks. */ @@ -148,15 +160,24 @@ extern "C" { #define OPUS_GET_GAIN_REQUEST 4045 /* Should have been 4035 */ #define OPUS_SET_LSB_DEPTH_REQUEST 4036 #define OPUS_GET_LSB_DEPTH_REQUEST 4037 - #define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039 - +#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040 +#define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041 +#define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042 +#define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043 /* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */ +#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046 +#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047 +#define OPUS_GET_IN_DTX_REQUEST 4049 + +/** Defines for the presence of extended APIs. */ +#define OPUS_HAVE_OPUS_PROJECTION_H /* Macros to trigger compilation errors when the wrong types are provided to a CTL */ #define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x)) #define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr))) #define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr))) +#define __opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr))) /** @endcond */ /** @defgroup opus_ctlvalues Pre-defined values for CTL interface @@ -185,6 +206,17 @@ extern "C" { #define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12 kHz bandpass @hideinitializer*/ #define OPUS_BANDWIDTH_FULLBAND 1105 /**<20 kHz bandpass @hideinitializer*/ +#define OPUS_FRAMESIZE_ARG 5000 /**< Select frame size from the argument (default) */ +#define OPUS_FRAMESIZE_2_5_MS 5001 /**< Use 2.5 ms frames */ +#define OPUS_FRAMESIZE_5_MS 5002 /**< Use 5 ms frames */ +#define OPUS_FRAMESIZE_10_MS 5003 /**< Use 10 ms frames */ +#define OPUS_FRAMESIZE_20_MS 5004 /**< Use 20 ms frames */ +#define OPUS_FRAMESIZE_40_MS 5005 /**< Use 40 ms frames */ +#define OPUS_FRAMESIZE_60_MS 5006 /**< Use 60 ms frames */ +#define OPUS_FRAMESIZE_80_MS 5007 /**< Use 80 ms frames */ +#define OPUS_FRAMESIZE_100_MS 5008 /**< Use 100 ms frames */ +#define OPUS_FRAMESIZE_120_MS 5009 /**< Use 120 ms frames */ + /**@}*/ @@ -250,7 +282,6 @@ extern "C" { /** Enables or disables variable bitrate (VBR) in the encoder. * The configured bitrate may not be met exactly because frames must * be an integer number of bytes in length. - * @warning Only the MDCT mode of Opus can provide hard CBR behavior. * @see OPUS_GET_VBR * @see OPUS_SET_VBR_CONSTRAINT * @param[in] x opus_int32: Allowed values: @@ -430,14 +461,6 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_int_ptr(x) -/** Gets the sampling rate the encoder or decoder was initialized with. - * This simply returns the Fs value passed to opus_encoder_init() - * or opus_decoder_init(). - * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. - * @hideinitializer - */ -#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) - /** Gets the total samples of delay added by the entire codec. * This can be queried by the encoder and then the provided number of samples can be * skipped on from the start of the decoder's output to provide time aligned input @@ -474,9 +497,9 @@ extern "C" { #define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_int_ptr(x) /** Configures the encoder's expected packet loss percentage. - * Higher values with trigger progressively more loss resistant behavior in the encoder - * at the expense of quality at a given bitrate in the lossless case, but greater quality - * under loss. + * Higher values trigger progressively more loss resistant behavior in the encoder + * at the expense of quality at a given bitrate in the absence of packet loss, but + * greater quality under loss. * @see OPUS_GET_PACKET_LOSS_PERC * @param[in] x opus_int32: Loss percentage in the range 0-100, inclusive (default: 0). * @hideinitializer */ @@ -508,7 +531,19 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x) /** Configures the depth of signal being encoded. + * * This is a hint which helps the encoder identify silence and near-silence. + * It represents the number of significant bits of linear intensity below + * which the signal contains ignorable quantization or other noise. + * + * For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting + * for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate + * for 16-bit linear pcm input with opus_encode_float(). + * + * When using opus_encode() instead of opus_encode_float(), or when libopus + * is compiled for fixed-point, the encoder uses the minimum of the value + * set here and the value 16. + * * @see OPUS_GET_LSB_DEPTH * @param[in] x opus_int32: Input precision in bits, between 8 and 24 * (default: 24). @@ -521,10 +556,68 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, __opus_check_int_ptr(x) -/** Gets the duration (in samples) of the last packet successfully decoded or concealed. - * @param[out] x opus_int32 *: Number of samples (at current sampling rate). +/** Configures the encoder's use of variable duration frames. + * When variable duration is enabled, the encoder is free to use a shorter frame + * size than the one requested in the opus_encode*() call. + * It is then the user's responsibility + * to verify how much audio was encoded by checking the ToC byte of the encoded + * packet. The part of the audio that was not encoded needs to be resent to the + * encoder for the next call. Do not use this option unless you really + * know what you are doing. + * @see OPUS_GET_EXPERT_FRAME_DURATION + * @param[in] x opus_int32: Allowed values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
+ *
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
+ *
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
+ *
* @hideinitializer */ -#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) +#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured use of variable duration frames. + * @see OPUS_SET_EXPERT_FRAME_DURATION + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
+ *
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
+ *
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
+ *
+ * @hideinitializer */ +#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables almost all use of prediction, making frames almost + * completely independent. This reduces quality. + * @see OPUS_GET_PREDICTION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable prediction (default).
+ *
1
Disable prediction.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured prediction status. + * @see OPUS_SET_PREDICTION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Prediction enabled (default).
+ *
1
Prediction disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_genericctls Generic CTLs @@ -578,18 +671,6 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_uint_ptr(x) -/** Gets the pitch of the last decoded frame, if available. - * This can be used for any post-processing algorithm requiring the use of pitch, - * e.g. time stretching/shortening. If the last frame was not voiced, or if the - * pitch was not coded in the frame, then zero is returned. - * - * This CTL is only implemented for decoder instances. - * - * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) - * - * @hideinitializer */ -#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) - /** Gets the encoder's configured bandpass or the decoder's last bandpass. * @see OPUS_SET_BANDWIDTH * @param[out] x opus_int32 *: Returns one of the following values: @@ -604,6 +685,48 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x) +/** Gets the sampling rate the encoder or decoder was initialized with. + * This simply returns the Fs value passed to opus_encoder_init() + * or opus_decoder_init(). + * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. + * @hideinitializer + */ +#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables the use of phase inversion for intensity stereo, + * improving the quality of mono downmixes, but slightly reducing normal + * stereo quality. Disabling phase inversion in the decoder does not comply + * with RFC 6716, although it does not cause any interoperability issue and + * is expected to become part of the Opus standard once RFC 6716 is updated + * by draft-ietf-codec-opus-update. + * @see OPUS_GET_PHASE_INVERSION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable phase inversion (default).
+ *
1
Disable phase inversion.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured phase inversion status. + * @see OPUS_SET_PHASE_INVERSION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Stereo phase inversion enabled (default).
+ *
1
Stereo phase inversion disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int_ptr(x) +/** Gets the DTX state of the encoder. + * Returns whether the last encoded frame was either a comfort noise update + * during DTX or not encoded because of DTX. + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
The encoder is not in DTX.
+ *
1
The encoder is in DTX.
+ *
+ * @hideinitializer */ +#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_decoderctls Decoder related CTLs @@ -628,6 +751,23 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x) +/** Gets the duration (in samples) of the last packet successfully decoded or concealed. + * @param[out] x opus_int32 *: Number of samples (at current sampling rate). + * @hideinitializer */ +#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** Gets the pitch of the last decoded frame, if available. + * This can be used for any post-processing algorithm requiring the use of pitch, + * e.g. time stretching/shortening. If the last frame was not voiced, or if the + * pitch was not coded in the frame, then zero is returned. + * + * This CTL is only implemented for decoder instances. + * + * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) + * + * @hideinitializer */ +#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_libinfo Opus library information functions @@ -642,6 +782,10 @@ extern "C" { OPUS_EXPORT const char *opus_strerror(int error); /** Gets the libopus version string. + * + * Applications may look for the substring "-fixed" in the version string to + * determine whether they have a fixed-point or floating-point build at + * runtime. * * @returns Version string */ diff --git a/external/opus-1.0.3/include/opus_multistream.h b/external/opus-1.3.1/include/opus_multistream.h similarity index 98% rename from external/opus-1.0.3/include/opus_multistream.h rename to external/opus-1.3.1/include/opus_multistream.h index ae599793..babcee69 100644 --- a/external/opus-1.0.3/include/opus_multistream.h +++ b/external/opus-1.3.1/include/opus_multistream.h @@ -110,10 +110,10 @@ extern "C" { * packets produced by the encoder. Some basic information, such as packet * duration, can be computed without any special negotiation. * - * The format for multistream Opus packets is defined in the - * Ogg - * encapsulation specification and is based on the self-delimited Opus - * framing described in Appendix B of RFC 6716. + * The format for multistream Opus packets is defined in + * RFC 7845 + * and is based on the self-delimited Opus framing described in Appendix B of + * RFC 6716. * Normal Opus packets are just a degenerate case of multistream Opus packets, * and can be encoded or decoded with the multistream API by setting * streams to 1 when initializing the encoder or @@ -140,7 +140,7 @@ extern "C" { * * The output channels specified by the encoder * should use the - * Vorbis + * Vorbis * channel ordering. A decoder may wish to apply an additional permutation * to the mapping the encoder used to achieve a different output channel * order (e.g. for outputing in WAV order). @@ -273,7 +273,7 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_enc unsigned char *mapping, int application, int *error -) OPUS_ARG_NONNULL(5); +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); /** Initialize a previously allocated multistream encoder state. * The memory pointed to by \a st must be at least the size returned by @@ -342,7 +342,7 @@ OPUS_EXPORT int opus_multistream_surround_encoder_init( int *coupled_streams, unsigned char *mapping, int application -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7); /** Encodes a multistream Opus frame. * @param st OpusMSEncoder*: Multistream encoder state. diff --git a/external/opus-1.3.1/include/opus_projection.h b/external/opus-1.3.1/include/opus_projection.h new file mode 100644 index 00000000..9dabf4e8 --- /dev/null +++ b/external/opus-1.3.1/include/opus_projection.h @@ -0,0 +1,568 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * @file opus_projection.h + * @brief Opus projection reference API + */ + +#ifndef OPUS_PROJECTION_H +#define OPUS_PROJECTION_H + +#include "opus_multistream.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond OPUS_INTERNAL_DOC */ + +/** These are the actual encoder and decoder CTL ID numbers. + * They should not be used directly by applications.c + * In general, SETs should be even and GETs should be odd.*/ +/**@{*/ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005 +/**@}*/ + + +/** @endcond */ + +/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs + * + * These are convenience macros that are specific to the + * opus_projection_encoder_ctl() and opus_projection_decoder_ctl() + * interface. + * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, + * @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a + * projection encoder or decoder as well. + */ +/**@{*/ + +/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the gain (in dB. S7.8-format) + * of the demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, __opus_check_int_ptr(x) + + +/** Gets the size in bytes of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the size in bytes of the + * demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, __opus_check_int_ptr(x) + + +/** Copies the demixing matrix to the supplied pointer location. + * @param[out] x unsigned char *: Returns the demixing matrix to the + * supplied pointer location. + * @param y opus_int32: The size in bytes of the reserved memory at the + * pointer location. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, __opus_check_int(y) + + +/**@}*/ + +/** Opus projection encoder state. + * This contains the complete state of a projection Opus encoder. + * It is position independent and can be freely copied. + * @see opus_projection_ambisonics_encoder_create + */ +typedef struct OpusProjectionEncoder OpusProjectionEncoder; + + +/** Opus projection decoder state. + * This contains the complete state of a projection Opus decoder. + * It is position independent and can be freely copied. + * @see opus_projection_decoder_create + * @see opus_projection_decoder_init + */ +typedef struct OpusProjectionDecoder OpusProjectionDecoder; + + +/**\name Projection encoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionEncoder structure. + * @param channels int: The total number of input channels to encode. + * This must be no more than 255. + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size( + int channels, + int mapping_family +); + + +/** Allocates and initializes a projection encoder state. + * Call opus_projection_encoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @param[out] streams int *: The total number of streams that will + * be encoded from the input. + * @param[out] coupled_streams int *: Number of coupled (2 channel) + * streams that will be encoded from the input. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionEncoder *opus_projection_ambisonics_encoder_create( + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application, + int *error +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5); + + +/** Initialize a previously allocated projection encoder state. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_ambisonics_encoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_ambisonics_encoder_create + * @see opus_projection_ambisonics_encoder_get_size + * @param st OpusProjectionEncoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param streams int: The total number of streams to encode from the + * input. + * This must be no more than the number of channels. + * @param coupled_streams int: Number of coupled (2 channel) streams + * to encode. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * encoded channels (streams + + * coupled_streams) must be no + * more than the number of input channels. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_ambisonics_encoder_init( + OpusProjectionEncoder *st, + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); + + +/** Encodes a projection Opus frame. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const opus_int16*: The input signal as interleaved + * samples. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode( + OpusProjectionEncoder *st, + const opus_int16 *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Encodes a projection Opus frame from floating point input. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const float*: The input signal as interleaved + * samples with a normal range of + * +/-1.0. + * Samples with a range beyond +/-1.0 + * are supported but will be clipped by + * decoders using the integer API and + * should only be used if it is known + * that the far end supports extended + * dynamic range. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float( + OpusProjectionEncoder *st, + const float *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Frees an OpusProjectionEncoder allocated by + * opus_projection_ambisonics_encoder_create(). + * @param st OpusProjectionEncoder*: Projection encoder state to be freed. + */ +OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st); + + +/** Perform a CTL function on a projection Opus encoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_encoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls + * @see opus_genericctls + * @see opus_encoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/**@}*/ + +/**\name Projection decoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionDecoder structure. + * @param channels int: The total number of output channels. + * This must be no more than 255. + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size( + int channels, + int streams, + int coupled_streams +); + + +/** Allocates and initializes a projection decoder state. + * Call opus_projection_decoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size, + int *error +) OPUS_ARG_NONNULL(5); + + +/** Intialize a previously allocated projection decoder state object. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_decoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_decoder_create + * @see opus_projection_deocder_get_size + * @param st OpusProjectionDecoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_decoder_init( + OpusProjectionDecoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); + + +/** Decode a projection Opus packet. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + opus_int16 *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Decode a projection Opus packet with floating point output. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + float *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Perform a CTL function on a projection Opus decoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_decoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls. + * @see opus_genericctls + * @see opus_decoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/** Frees an OpusProjectionDecoder allocated by + * opus_projection_decoder_create(). + * @param st OpusProjectionDecoder: Projection decoder state to be freed. + */ +OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st); + + +/**@}*/ + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_PROJECTION_H */ diff --git a/external/opus-1.0.3/include/opus_types.h b/external/opus-1.3.1/include/opus_types.h similarity index 92% rename from external/opus-1.0.3/include/opus_types.h rename to external/opus-1.3.1/include/opus_types.h index b28e03ae..7cf67558 100644 --- a/external/opus-1.0.3/include/opus_types.h +++ b/external/opus-1.3.1/include/opus_types.h @@ -33,14 +33,29 @@ #ifndef OPUS_TYPES_H #define OPUS_TYPES_H +#define opus_int int /* used for counters etc; at least 16 bits */ +#define opus_int64 long long +#define opus_int8 signed char + +#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ +#define opus_uint64 unsigned long long +#define opus_uint8 unsigned char + /* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ -#if (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) +#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) #include - +# undef opus_int64 +# undef opus_int8 +# undef opus_uint64 +# undef opus_uint8 + typedef int8_t opus_int8; + typedef uint8_t opus_uint8; typedef int16_t opus_int16; typedef uint16_t opus_uint16; typedef int32_t opus_int32; typedef uint32_t opus_uint32; + typedef int64_t opus_int64; + typedef uint64_t opus_uint64; #elif defined(_WIN32) # if defined(__CYGWIN__) @@ -148,12 +163,4 @@ #endif -#define opus_int int /* used for counters etc; at least 16 bits */ -#define opus_int64 long long -#define opus_int8 signed char - -#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ -#define opus_uint64 unsigned long long -#define opus_uint8 unsigned char - #endif /* OPUS_TYPES_H */ diff --git a/external/opusfile-0.10/install-sh b/external/opus-1.3.1/install-sh similarity index 99% rename from external/opusfile-0.10/install-sh rename to external/opus-1.3.1/install-sh index 0b0fdcbb..0360b79e 100755 --- a/external/opusfile-0.10/install-sh +++ b/external/opus-1.3.1/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2013-12-25.23; # UTC +scriptversion=2016-01-11.22; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -496,6 +496,6 @@ done # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/external/opus-1.0.3/ltmain.sh b/external/opus-1.3.1/ltmain.sh similarity index 65% rename from external/opus-1.0.3/ltmain.sh rename to external/opus-1.3.1/ltmain.sh index 63ae69dc..0f0a2da3 100644 --- a/external/opus-1.0.3/ltmain.sh +++ b/external/opus-1.3.1/ltmain.sh @@ -1,9 +1,12 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 -# libtool (GNU libtool) 2.4.2 +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# Copyright (C) 1996-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -23,881 +26,2112 @@ # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . -# Usage: $progname [OPTION]... [MODE-ARG]... -# -# Provide generalized library-building support services. -# -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --no-quiet, --no-silent -# print informational messages (default) -# --no-warn don't display warning messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print more informational messages than default -# --no-verbose don't print the extra informational messages -# --version print version information -# -h, --help, --help-all print short, long, or detailed help message -# -# MODE must be one of the following: -# -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory -# -# MODE-ARGS vary depending on the MODE. When passed as first option, -# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. -# Try `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4.2 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to . -# GNU libtool home page: . -# General help using GNU software: . PROGRAM=libtool PACKAGE=libtool -VERSION=2.4.2 -TIMESTAMP="" -package_revision=1.3337 +VERSION=2.4.6 +package_revision=2.4.6 -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} -# NLS nuisances: We save the old values to restore during execute mode. -lt_user_locale= -lt_safe_locale= -for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do - eval "if test \"\${$lt_var+set}\" = set; then - save_$lt_var=\$$lt_var - $lt_var=C - export $lt_var - lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" - lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done -LC_ALL=C -LANGUAGE=C -export LANGUAGE LC_ALL -$lt_unset CDPATH +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. : ${CP="cp -f"} -test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -exit_status=$EXIT_SUCCESS - -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" -dirname="s,/[^/]*$,," -basename="s,^.*/,," -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} # func_dirname may be replaced by extended shell implementation +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` -} # func_dirname_and_basename may be replaced by extended shell implementation +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname may be replaced by extended shell implementation +## ----------------- ## +## Global variables. ## +## ----------------- ## -# These SED scripts presuppose an absolute path with a trailing slash. -pathcar='s,^/\([^/]*\).*$,\1,' -pathcdr='s,^/[^/]*,,' -removedotparts=':dotsl - s@/\./@/@g - t dotsl - s,/\.$,/,' -collapseslashes='s@/\{1,\}@/@g' -finalslash='s,/*$,/,' +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. -# func_normal_abspath PATH -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -# value returned in "$func_normal_abspath_result" -func_normal_abspath () -{ - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` - while :; do - # Processed it all yet? - if test "$func_normal_abspath_tpath" = / ; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result" ; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. -# func_relative_path SRCDIR DSTDIR -# generates a relative path from SRCDIR to DSTDIR, with a trailing -# slash if non-empty, suitable for immediately appending a filename -# without needing to append a separator. -# value returned in "$func_relative_path_result" -func_relative_path () -{ - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=${func_dirname_result} - if test "x$func_relative_path_tlibdir" = x ; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test "x$func_stripname_result" != x ; then - func_relative_path_result=${func_relative_path_result}/${func_stripname_result} - fi +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS - # Normalisation. If bindir is libdir, return empty string, - # else relative path ending with a slash; either way, target - # file name can be directly appended. - if test ! -z "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result/" - func_relative_path_result=$func_stripname_result - fi -} +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 -# The name of this program: -func_dirname_and_basename "$progpath" -progname=$func_basename_result +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` -# Make sure we have an absolute path for reexecution: +# Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) - progdir=$func_dirname_result + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" + progpath=$progdir/$progname ;; *) - save_IFS="$IFS" + _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do - IFS="$save_IFS" + IFS=$_G_IFS test -x "$progdir/$progname" && break done - IFS="$save_IFS" + IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" + progpath=$progdir/$progname ;; esac -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed="${SED}"' -e 1s/^X//' -sed_quote_subst='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' +## ----------------- ## +## Standard options. ## +## ----------------- ## -# Sed substitution that converts a w32 file name or path -# which contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. -# Standard options: opt_dry_run=false -opt_help=false opt_quiet=false opt_verbose=false -opt_warning=: -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -} +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -} +## -------------------- ## +## Resource management. ## +## -------------------- ## -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. - # bash bug again: - : -} -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () { - func_error ${1+"$@"} - exit $EXIT_FAILURE -} + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" + require_term_colors=: } -help="Try \`$progname --help' for more information." ## default -# func_grep expression filename +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { + $debug_cmd + $GREP "$1" "$2" >/dev/null 2>&1 } -# func_mkdir_p directory-path +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { - my_directory_path="$1" - my_dir_list= + $debug_cmd - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + _G_directory_path=$1 + _G_dir_list= - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do + while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" + _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac + case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done - my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : + $MKDIR "$_G_dir" 2>/dev/null || : done - IFS="$save_mkdir_p_IFS" + IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" fi } -# func_mktempdir [string] +# func_mktempdir [BASENAME] +# ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If -# given, STRING is the basename for that directory. +# given, BASENAME is the basename for that directory. func_mktempdir () { - my_template="${TMPDIR-/tmp}/${1-$progname}" + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} - if test "$opt_dry_run" = ":"; then + if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode - my_tmpdir="${my_template}-$$" + _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` - if test ! -d "$my_tmpdir"; then + if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" + _G_tmpdir=$_G_template-${RANDOM-0}$$ - save_mktempdir_umask=`umask` + func_mktempdir_umask=`umask` umask 0077 - $MKDIR "$my_tmpdir" - umask $save_mktempdir_umask + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result fi - $ECHO "$my_tmpdir" + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result } -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () { - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac + $debug_cmd - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result } -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () { - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "$1" | $SED \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac + $debug_cmd - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac + func_parse_options_result= - func_quote_for_expand_result="$my_arg" -} + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result } -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () { - my_cmd="$1" - my_fail_exp="${2-:}" + $debug_cmd - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} + func_run_hooks func_validate_options ${1+"$@"} -# func_tr_sh -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result } -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $opt_debug - $SED -n '/(C)/!b go - :more - /\./!{ - N - s/\n# / / - b more - } - :go - /^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} +## ----------------- ## +## Helper functions. ## +## ----------------- ## -# func_usage -# Echo short help message to standard output and exit. -func_usage () +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () { - $opt_debug + $debug_cmd - $SED -n '/^# Usage:/,/^# *.*--help/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - echo - $ECHO "run \`$progname --help | more' for full usage" - exit $? + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE } -# func_help [NOEXIT] -# Echo long help message to standard output and exit, -# unless 'noexit' is passed as argument. + +# func_help +# --------- +# Echo long help message to standard output and exit. func_help () { - $opt_debug - - $SED -n '/^# Usage:/,/# Report bugs to/ { - :print - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ - p - d - } - /^# .* home page:/b print - /^# General help using/b print - ' < "$progpath" - ret=$? - if test -z "$1"; then - exit $ret - fi + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 } -# func_missing_arg argname + +# func_missing_arg ARGNAME +# ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { - $opt_debug + $debug_cmd - func_error "missing argument for $1." + func_error "Missing argument for '$1'." exit_cmd=exit } -# func_split_short_opt shortopt +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. -func_split_short_opt () +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () { - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + $debug_cmd - func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` - func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` -} # func_split_short_opt may be replaced by extended shell implementation + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} -# func_split_long_opt longopt -# Set func_split_long_opt_name and func_split_long_opt_arg shell -# variables after splitting LONGOPT at the `=' sign. -func_split_long_opt () +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () { - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' + $debug_cmd - func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` - func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` -} # func_split_long_opt may be replaced by extended shell implementation + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} -exit_cmd=: +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + exit $? +} -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: -# Global variables. -nonopt= -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () { - eval "${1}=\$${1}\${2}" -} # func_append may be replaced by extended shell implementation + $debug_cmd -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () -{ - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation + _G_message=$* + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} -# func_arith arithmetic-term... -func_arith () + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () { - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation + $debug_cmd + $warning_func ${1+"$@"} +} -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" -# func_lo2o object -func_lo2o () +# Additional text appended to 'usage_message' in response to '--help'. +func_help () { - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` -} # func_xform may be replaced by extended shell implementation +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi -# func_fatal_configuration arg... +# func_fatal_configuration ARG... +# ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { - func_error ${1+"$@"} - func_error "See the $PACKAGE documentation for more information." - func_fatal_error "Fatal configuration error." + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." } # func_config +# ----------- # Display the configuration for all the tags in this script. func_config () { @@ -915,17 +2149,19 @@ func_config () exit $? } + # func_features +# ------------- # Display the features supported by this script. func_features () { echo "host: $host" - if test "$build_libtool_libs" = yes; then + if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi - if test "$build_old_libs" = yes; then + if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" @@ -934,314 +2170,350 @@ func_features () exit $? } -# func_enable_tag tagname + +# func_enable_tag TAGNAME +# ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { - # Global variable: - tagname="$1" + # Global variable: + tagname=$1 - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf="/$re_begincf/,/$re_endcf/p" + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac } + # func_check_version_match +# ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF - else - cat >&2 <<_LT_EOF + else + cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF - fi - else - cat >&2 <<_LT_EOF + fi + else + cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF - fi + fi - exit $EXIT_MISMATCH - fi + exit $EXIT_MISMATCH + fi } -# Shorthand for --mode=foo, only valid as the first argument -case $1 in -clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; -compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; -execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; -finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; -install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; -link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; -uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; -esac +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + nonopt= + preserve_args= -# Option defaults: -opt_debug=: -opt_dry_run=false -opt_config=false -opt_preserve_dup_deps=false -opt_features=false -opt_finish=false -opt_help=false -opt_help_all=false -opt_silent=: -opt_warning=: -opt_verbose=: -opt_silent=false -opt_verbose=false + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep -# Parse options once, thoroughly. This comes as soon as possible in the -# script to make things like `--version' happen as quickly as we can. +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () { - # this just eases exit handling - while test $# -gt 0; do - opt="$1" - shift - case $opt in - --debug|-x) opt_debug='set -x' - func_echo "enabling shell trace mode" - $opt_debug - ;; - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - --config) - opt_config=: -func_config - ;; - --dlopen|-dlopen) - optarg="$1" - opt_dlopen="${opt_dlopen+$opt_dlopen -}$optarg" - shift - ;; - --preserve-dup-deps) - opt_preserve_dup_deps=: - ;; - --features) - opt_features=: -func_features - ;; - --finish) - opt_finish=: -set dummy --mode finish ${1+"$@"}; shift - ;; - --help) - opt_help=: - ;; - --help-all) - opt_help_all=: -opt_help=': help-all' - ;; - --mode) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_mode="$optarg" -case $optarg in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; -esac - shift - ;; - --no-silent|--no-quiet) - opt_silent=false -func_append preserve_args " $opt" - ;; - --no-warning|--no-warn) - opt_warning=false -func_append preserve_args " $opt" - ;; - --no-verbose) - opt_verbose=false -func_append preserve_args " $opt" - ;; - --silent|--quiet) - opt_silent=: -func_append preserve_args " $opt" - opt_verbose=false - ;; - --verbose|-v) - opt_verbose=: -func_append preserve_args " $opt" -opt_silent=false - ;; - --tag) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_tag="$optarg" -func_append preserve_args " $opt $optarg" -func_enable_tag "$optarg" - shift - ;; - - -\?|-h) func_usage ;; - --help) func_help ;; - --version) func_version ;; - - # Separate optargs to long options: - --*=*) - func_split_long_opt "$opt" - set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-n*|-v*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognized option \`$opt'" ;; - *) set dummy "$opt" ${1+"$@"}; shift; break ;; - esac - done + $debug_cmd - # Validate options: + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - $opt_help || { - # Sanity checks first: - func_check_version_match - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift fi - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test "$opt_mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result } +func_add_hook func_validate_options libtool_validate_options +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + ## ----------- ## ## Main. ## ## ----------- ## +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + # func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. +# True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. +# True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. +# fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no @@ -1249,13 +2521,13 @@ func_lalib_unsafe_p () for lalib_p_l in 1 2 3 4 do read lalib_p_line - case "$lalib_p_line" in + case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi - test "$lalib_p" = yes + test yes = "$lalib_p" } # func_ltwrapper_script_p file @@ -1264,7 +2536,8 @@ func_lalib_unsafe_p () # determined imposters. func_ltwrapper_script_p () { - func_lalib_p "$1" + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file @@ -1289,7 +2562,7 @@ func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file @@ -1308,11 +2581,13 @@ func_ltwrapper_p () # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { - $opt_debug + $debug_cmd + save_ifs=$IFS; IFS='~' for cmd in $1; do - IFS=$save_ifs + IFS=$sp$nl eval cmd=\"$cmd\" + IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs @@ -1324,10 +2599,11 @@ func_execute_cmds () # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing -# `FILE.' does not work on cygwin managed mounts. +# 'FILE.' does not work on cygwin managed mounts. func_source () { - $opt_debug + $debug_cmd + case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; @@ -1354,10 +2630,10 @@ func_resolve_sysroot () # store the result into func_replace_sysroot_result. func_replace_sysroot () { - case "$lt_sysroot:$1" in + case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" + func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. @@ -1374,7 +2650,8 @@ func_replace_sysroot () # arg is usually of the form 'gcc ...' func_infer_tag () { - $opt_debug + $debug_cmd + if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do @@ -1393,7 +2670,7 @@ func_infer_tag () for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. @@ -1418,7 +2695,7 @@ func_infer_tag () # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" + func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi @@ -1434,15 +2711,15 @@ func_infer_tag () # but don't create it if we're doing a dry run. func_write_libtool_object () { - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' else write_lobj=none fi - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' else write_oldobj=none fi @@ -1450,7 +2727,7 @@ func_write_libtool_object () $opt_dry_run || { cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$lt_sed_naive_backslashify"` + $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi @@ -1514,18 +2792,19 @@ func_convert_core_file_wine_to_w32 () # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { - $opt_debug + $debug_cmd + # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" + func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi @@ -1554,7 +2833,8 @@ func_convert_core_path_wine_to_w32 () # environment variable; do not put it in $PATH. func_cygpath () { - $opt_debug + $debug_cmd + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then @@ -1563,7 +2843,7 @@ func_cygpath () fi else func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath @@ -1574,10 +2854,11 @@ func_cygpath () # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { - $opt_debug + $debug_cmd + # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 @@ -1588,13 +2869,14 @@ func_convert_core_msys_to_w32 () # func_to_host_file_result to ARG1). func_convert_file_check () { - $opt_debug - if test -z "$2" && test -n "$1" ; then + $debug_cmd + + if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" - func_error " \`$1'" + func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: - func_to_host_file_result="$1" + func_to_host_file_result=$1 fi } # end func_convert_file_check @@ -1606,10 +2888,11 @@ func_convert_file_check () # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { - $opt_debug + $debug_cmd + if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" - func_error " \`$3'" + func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. @@ -1618,7 +2901,7 @@ func_convert_path_check () func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else - func_to_host_path_result="$3" + func_to_host_path_result=$3 fi fi } @@ -1630,9 +2913,10 @@ func_convert_path_check () # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { - $opt_debug + $debug_cmd + case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" + $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in @@ -1646,7 +2930,7 @@ func_convert_path_front_back_pathsep () ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## -# invoked via `$to_host_file_cmd ARG' +# invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. @@ -1657,7 +2941,8 @@ func_convert_path_front_back_pathsep () # in func_to_host_file_result. func_to_host_file () { - $opt_debug + $debug_cmd + $to_host_file_cmd "$1" } # end func_to_host_file @@ -1669,7 +2954,8 @@ func_to_host_file () # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { - $opt_debug + $debug_cmd + case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 @@ -1687,7 +2973,7 @@ func_to_tool_file () # Copy ARG to func_to_host_file_result. func_convert_file_noop () { - func_to_host_file_result="$1" + func_to_host_file_result=$1 } # end func_convert_file_noop @@ -1698,11 +2984,12 @@ func_convert_file_noop () # func_to_host_file_result. func_convert_file_msys_to_w32 () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" - func_to_host_file_result="$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } @@ -1714,8 +3001,9 @@ func_convert_file_msys_to_w32 () # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. @@ -1731,11 +3019,12 @@ func_convert_file_cygwin_to_w32 () # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } @@ -1747,12 +3036,13 @@ func_convert_file_nix_to_w32 () # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result="$func_cygpath_result" + func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } @@ -1765,13 +3055,14 @@ func_convert_file_msys_to_cygwin () # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result="$func_cygpath_result" + func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } @@ -1781,7 +3072,7 @@ func_convert_file_nix_to_cygwin () ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# -# invoked via `$to_host_path_cmd ARG' +# invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. @@ -1805,10 +3096,11 @@ func_convert_file_nix_to_cygwin () to_host_path_cmd= func_init_to_host_path_cmd () { - $opt_debug + $debug_cmd + if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd="func_convert_path_${func_stripname_result}" + to_host_path_cmd=func_convert_path_$func_stripname_result fi } @@ -1818,7 +3110,8 @@ func_init_to_host_path_cmd () # in func_to_host_path_result. func_to_host_path () { - $opt_debug + $debug_cmd + func_init_to_host_path_cmd $to_host_path_cmd "$1" } @@ -1829,7 +3122,7 @@ func_to_host_path () # Copy ARG to func_to_host_path_result. func_convert_path_noop () { - func_to_host_path_result="$1" + func_to_host_path_result=$1 } # end func_convert_path_noop @@ -1840,8 +3133,9 @@ func_convert_path_noop () # func_to_host_path_result. func_convert_path_msys_to_w32 () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; @@ -1849,7 +3143,7 @@ func_convert_path_msys_to_w32 () func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" @@ -1863,8 +3157,9 @@ func_convert_path_msys_to_w32 () # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" @@ -1883,14 +3178,15 @@ func_convert_path_cygwin_to_w32 () # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" @@ -1904,15 +3200,16 @@ func_convert_path_nix_to_w32 () # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result="$func_cygpath_result" + func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" @@ -1927,8 +3224,9 @@ func_convert_path_msys_to_cygwin () # func_to_host_file_result. func_convert_path_nix_to_cygwin () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them @@ -1937,7 +3235,7 @@ func_convert_path_nix_to_cygwin () func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result="$func_cygpath_result" + func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" @@ -1946,13 +3244,31 @@ func_convert_path_nix_to_cygwin () # end func_convert_path_nix_to_cygwin +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + # func_mode_compile arg... func_mode_compile () { - $opt_debug + $debug_cmd + # Get the compilation command and the source file. base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" + srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal @@ -1965,12 +3281,12 @@ func_mode_compile () case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile - lastarg="$arg" + lastarg=$arg arg_mode=normal ;; target ) - libobj="$arg" + libobj=$arg arg_mode=normal continue ;; @@ -1980,7 +3296,7 @@ func_mode_compile () case $arg in -o) test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" + func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; @@ -2009,12 +3325,12 @@ func_mode_compile () func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= - save_ifs="$IFS"; IFS=',' + save_ifs=$IFS; IFS=, for arg in $args; do - IFS="$save_ifs" + IFS=$save_ifs func_append_quoted lastarg "$arg" done - IFS="$save_ifs" + IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result @@ -2027,8 +3343,8 @@ func_mode_compile () # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # - lastarg="$srcfile" - srcfile="$arg" + lastarg=$srcfile + srcfile=$arg ;; esac # case $arg ;; @@ -2043,13 +3359,13 @@ func_mode_compile () func_fatal_error "you must specify an argument for -Xcompile" ;; target) - func_fatal_error "you must specify a target with \`-o'" + func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" - libobj="$func_basename_result" + libobj=$func_basename_result } ;; esac @@ -2069,7 +3385,7 @@ func_mode_compile () case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) - func_fatal_error "cannot determine name of library object from \`$libobj'" + func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac @@ -2078,8 +3394,8 @@ func_mode_compile () for arg in $later; do case $arg in -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; @@ -2105,17 +3421,17 @@ func_mode_compile () func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." + && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" - lobj=${xdir}$objdir/$objname + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. - if test "$build_old_libs" = yes; then + if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" @@ -2127,16 +3443,16 @@ func_mode_compile () pic_mode=default ;; esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock else output_obj= need_locks=no @@ -2145,12 +3461,12 @@ func_mode_compile () # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then + if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done - elif test "$need_locks" = warn; then + elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: @@ -2158,7 +3474,7 @@ func_mode_compile () This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you +your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." @@ -2180,11 +3496,11 @@ compiler." qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then + if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile - if test "$pic_mode" != no; then + if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code @@ -2201,7 +3517,7 @@ compiler." func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - if test "$need_locks" = warn && + if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: @@ -2212,7 +3528,7 @@ $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you +your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." @@ -2228,20 +3544,20 @@ compiler." fi # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then + if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi - if test "$compiler_c_o" = yes; then + if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi @@ -2250,7 +3566,7 @@ compiler." func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - if test "$need_locks" = warn && + if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: @@ -2261,7 +3577,7 @@ $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you +your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." @@ -2281,7 +3597,7 @@ compiler." func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked - if test "$need_locks" != no; then + if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi @@ -2291,7 +3607,7 @@ compiler." } $opt_help || { - test "$opt_mode" = compile && func_mode_compile ${1+"$@"} + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () @@ -2311,7 +3627,7 @@ func_mode_help () Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated @@ -2330,16 +3646,16 @@ This mode accepts the following additional options: -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only - -shared do not build a \`.o' file suitable for static linking - -static only build a \`.o' file suitable for static linking + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler -COMPILE-COMMAND is a command to be used in creating a \`standard' object file +COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." ;; execute) @@ -2352,7 +3668,7 @@ This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path -This mode sets the library path environment variable according to \`-dlopen' +This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated @@ -2371,7 +3687,7 @@ Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." +the '--dry-run' option if you just want to see what would be executed." ;; install) @@ -2381,7 +3697,7 @@ the \`--dry-run' option if you just want to see what would be executed." Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. +either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: @@ -2407,7 +3723,7 @@ The following components of LINK-COMMAND are treated specially: -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE @@ -2421,7 +3737,8 @@ The following components of LINK-COMMAND are treated specially: -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information @@ -2441,20 +3758,20 @@ The following components of LINK-COMMAND are treated specially: -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) -All other options (arguments beginning with \`-') are ignored. +All other options (arguments beginning with '-') are ignored. -Every other argument is treated as a filename. Files ending in \`.la' are +Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; @@ -2465,7 +3782,7 @@ is created, otherwise an executable program is created." Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. @@ -2473,17 +3790,17 @@ Otherwise, only FILE itself is deleted using RM." ;; *) - func_fatal_help "invalid operation mode \`$opt_mode'" + func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo - $ECHO "Try \`$progname --help' for more information about other modes." + $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then - if test "$opt_help" = :; then + if test : = "$opt_help"; then func_mode_help else { @@ -2491,7 +3808,7 @@ if $opt_help; then for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done - } | sed -n '1p; 2,$s/^Usage:/ or: /p' + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do @@ -2499,7 +3816,7 @@ if $opt_help; then func_mode_help done } | - sed '1d + $SED '1d /^When reporting/,/^Report/{ H d @@ -2516,16 +3833,17 @@ fi # func_mode_execute arg... func_mode_execute () { - $opt_debug + $debug_cmd + # The first argument is the command name. - cmd="$nonopt" + cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ - || func_fatal_help "\`$file' is not a file" + || func_fatal_help "'$file' is not a file" dir= case $file in @@ -2535,7 +3853,7 @@ func_mode_execute () # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$lib' is not a valid libtool archive" + || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= @@ -2546,18 +3864,18 @@ func_mode_execute () if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ - func_warning "\`$file' was not linked with \`-export-dynamic'" + func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." - dir="$func_dirname_result" + dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; @@ -2565,18 +3883,18 @@ func_mode_execute () *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." - dir="$func_dirname_result" + dir=$func_dirname_result ;; *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" + test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then @@ -2588,7 +3906,7 @@ func_mode_execute () # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. - libtool_execute_magic="$magic" + libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= @@ -2601,12 +3919,12 @@ func_mode_execute () if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. - file="$progdir/$program" + file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. - file="$progdir/$program" + file=$progdir/$program fi ;; esac @@ -2614,7 +3932,15 @@ func_mode_execute () func_append_quoted args "$file" done - if test "X$opt_dry_run" = Xfalse; then + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" @@ -2631,25 +3957,18 @@ func_mode_execute () done # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - echo "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS + exec_cmd=\$cmd$args fi } -test "$opt_mode" = execute && func_mode_execute ${1+"$@"} +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { - $opt_debug + $debug_cmd + libs= libdirs= admincmds= @@ -2663,11 +3982,11 @@ func_mode_finish () if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else - func_warning "\`$opt' is not a valid libtool archive" + func_warning "'$opt' is not a valid libtool archive" fi else - func_fatal_error "invalid argument \`$opt'" + func_fatal_error "invalid argument '$opt'" fi done @@ -2682,12 +4001,12 @@ func_mode_finish () # Remove sysroot references if $opt_dry_run; then for lib in $libs; do - echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do - sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done @@ -2712,7 +4031,7 @@ func_mode_finish () fi # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS + $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" @@ -2723,27 +4042,27 @@ func_mode_finish () echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" - $ECHO " - use the \`$flag' linker flag" + $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo @@ -2762,18 +4081,20 @@ func_mode_finish () exit $EXIT_SUCCESS } -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { - $opt_debug + $debug_cmd + # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac; then + case $nonopt in *shtool*) :;; *) false;; esac + then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " @@ -2800,7 +4121,7 @@ func_mode_install () opts= prev= install_type= - isdir=no + isdir=false stripme= no_mode=: for arg @@ -2813,7 +4134,7 @@ func_mode_install () fi case $arg in - -d) isdir=yes ;; + -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg @@ -2831,7 +4152,7 @@ func_mode_install () *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then - if test "x$prev" = x-m && test -n "$install_override_mode"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi @@ -2856,7 +4177,7 @@ func_mode_install () func_fatal_help "you must specify an install program" test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" + func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else @@ -2878,19 +4199,19 @@ func_mode_install () dest=$func_stripname_result # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" + destdir=$func_dirname_result + destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" + func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; @@ -2899,7 +4220,7 @@ func_mode_install () case $file in *.lo) ;; *) - func_fatal_help "\`$destdir' must be an absolute directory name" + func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done @@ -2908,7 +4229,7 @@ func_mode_install () # This variable tells wrapper scripts just to set variables rather # than running their programs. - libtool_install_magic="$magic" + libtool_install_magic=$magic staticlibs= future_libdirs= @@ -2928,7 +4249,7 @@ func_mode_install () # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" + || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= @@ -2950,7 +4271,7 @@ func_mode_install () fi func_dirname "$file" "/" "" - dir="$func_dirname_result" + dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then @@ -2964,7 +4285,7 @@ func_mode_install () # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. @@ -2973,29 +4294,36 @@ func_mode_install () relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi - func_warning "relinking \`$file'" + func_warning "relinking '$file'" func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then - realname="$1" + realname=$1 shift - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T + srcname=$realname + test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' - tstripme="$stripme" + tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) - tstripme="" + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= ;; esac ;; @@ -3006,7 +4334,7 @@ func_mode_install () if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on + # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname @@ -3017,14 +4345,14 @@ func_mode_install () fi # Do each command in the postinstall commands. - lib="$destdir/$realname" + lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i + name=$func_basename_result + instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. @@ -3036,11 +4364,11 @@ func_mode_install () # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then - destfile="$destdir/$destname" + destfile=$destdir/$destname else func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" + destfile=$func_basename_result + destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. @@ -3050,11 +4378,11 @@ func_mode_install () staticdest=$func_lo2o_result ;; *.$objext) - staticdest="$destfile" + staticdest=$destfile destfile= ;; *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" + func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac @@ -3063,7 +4391,7 @@ func_mode_install () func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. - if test "$build_old_libs" = yes; then + if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result @@ -3075,23 +4403,23 @@ func_mode_install () *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then - destfile="$destdir/$destname" + destfile=$destdir/$destname else func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" + destfile=$func_basename_result + destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install - stripped_ext="" + stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result - stripped_ext=".exe" + stripped_ext=.exe fi ;; esac @@ -3119,19 +4447,19 @@ func_mode_install () # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" + func_fatal_error "invalid libtool wrapper script '$wrapper'" - finalize=yes + finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi - libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false fi done @@ -3139,29 +4467,29 @@ func_mode_install () func_source "$wrapper" outputname= - if test "$fast_install" = no && test -n "$relink_command"; then + if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { - if test "$finalize" = yes; then + if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" + file=$func_basename_result + outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - $opt_silent || { + $opt_quiet || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else - func_error "error: relink \`$file' with the above command before installing it" + func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi - file="$outputname" + file=$outputname else - func_warning "cannot relink \`$file'" + func_warning "cannot relink '$file'" fi } else @@ -3198,10 +4526,10 @@ func_mode_install () for file in $staticlibs; do func_basename "$file" - name="$func_basename_result" + name=$func_basename_result # Set up the ranlib parameters. - oldlib="$destdir/$name" + oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result @@ -3216,18 +4544,18 @@ func_mode_install () done test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" + func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } -test "$opt_mode" = install && func_mode_install ${1+"$@"} +test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p @@ -3235,16 +4563,17 @@ test "$opt_mode" = install && func_mode_install ${1+"$@"} # a dlpreopen symbol table. func_generate_dlsyms () { - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" + my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi @@ -3255,7 +4584,7 @@ func_generate_dlsyms () "") ;; *.c) # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" + nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" @@ -3263,34 +4592,36 @@ func_generate_dlsyms () func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif -#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST -#elif defined(__osf__) +#elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + /* External symbol declarations for the compiler. */\ " - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" @@ -3298,7 +4629,7 @@ extern \"C\" { progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done @@ -3318,10 +4649,10 @@ extern \"C\" { # Prepare the list of exported symbols if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" + export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' @@ -3331,7 +4662,7 @@ extern \"C\" { } else $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in @@ -3345,22 +4676,22 @@ extern \"C\" { fi for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" + func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" - name="$func_basename_result" + name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename="" + dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname" ; then + if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" + dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" @@ -3368,7 +4699,7 @@ extern \"C\" { fi fi $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then + if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" @@ -3424,6 +4755,11 @@ extern \"C\" { echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ @@ -3432,11 +4768,30 @@ typedef struct { void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi case $need_lib_prefix in no) @@ -3478,9 +4833,7 @@ static const void *lt_preloaded_setup() { *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi + $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; @@ -3497,10 +4850,10 @@ static const void *lt_preloaded_setup() { func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" + symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then @@ -3518,7 +4871,7 @@ static const void *lt_preloaded_setup() { esac ;; *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" + func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else @@ -3532,6 +4885,32 @@ static const void *lt_preloaded_setup() { fi } +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + # func_win32_libid arg # return the library type of file 'arg' # @@ -3541,8 +4920,9 @@ static const void *lt_preloaded_setup() { # Despite the name, also deal with 64 bit binaries. func_win32_libid () { - $opt_debug - win32_libid_type="unknown" + $debug_cmd + + win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import @@ -3552,16 +4932,29 @@ func_win32_libid () # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' 1,100{ / I /{ - s,.*,import, + s|.*|import| p q } }'` + ;; + esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; @@ -3593,7 +4986,8 @@ func_win32_libid () # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { - $opt_debug + $debug_cmd + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } @@ -3610,7 +5004,8 @@ func_cygming_dll_for_implib () # specified import library. func_cygming_dll_for_implib_fallback_core () { - $opt_debug + $debug_cmd + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ @@ -3646,8 +5041,8 @@ func_cygming_dll_for_implib_fallback_core () /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the - # archive which possess that section. Heuristic: eliminate - # all those which have a first or second character that is + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually @@ -3658,30 +5053,6 @@ func_cygming_dll_for_implib_fallback_core () $SED -e '/^\./d;/^.\./d;q' } -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified @@ -3695,16 +5066,17 @@ func_cygming_ms_implib_p () # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1" ; then + elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown - sharedlib_from_linklib_result="" + sharedlib_from_linklib_result= fi } @@ -3712,10 +5084,11 @@ func_cygming_dll_for_implib_fallback () # func_extract_an_archive dir oldlib func_extract_an_archive () { - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - if test "$lock_old_archive_extraction" = yes; then + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" @@ -3724,7 +5097,7 @@ func_extract_an_archive () fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' - if test "$lock_old_archive_extraction" = yes; then + if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then @@ -3738,22 +5111,23 @@ func_extract_an_archive () # func_extract_archives gentop oldlib ... func_extract_archives () { - $opt_debug - my_gentop="$1"; shift + $debug_cmd + + my_gentop=$1; shift my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" - my_xlib="$func_basename_result" + my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in @@ -3765,7 +5139,7 @@ func_extract_archives () esac done extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" @@ -3778,22 +5152,23 @@ func_extract_archives () cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" - $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do @@ -3815,7 +5190,7 @@ func_extract_archives () my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done - func_extract_archives_result="$my_oldobjs" + func_extract_archives_result=$my_oldobjs } @@ -3830,7 +5205,7 @@ func_extract_archives () # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is +# will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () @@ -3841,7 +5216,7 @@ func_emit_wrapper () #! $SHELL # $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. @@ -3898,9 +5273,9 @@ _LTECHO_EOF' # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ which is used only on +# /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options which match +# (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and @@ -3933,7 +5308,7 @@ func_parse_lt_options () # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then - echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } @@ -3944,7 +5319,7 @@ func_lt_dump_args () lt_dump_args_N=1; for lt_arg do - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } @@ -3958,7 +5333,7 @@ func_exec_program_core () *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} @@ -3968,7 +5343,7 @@ func_exec_program_core () *) $ECHO "\ if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} @@ -4043,13 +5418,13 @@ func_exec_program () test -n \"\$absdir\" && thisdir=\"\$absdir\" " - if test "$fast_install" = yes; then + if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" @@ -4066,7 +5441,7 @@ func_exec_program () if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else - $ECHO \"\$relink_command_output\" >&2 + \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi @@ -4101,7 +5476,7 @@ func_exec_program () fi # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" @@ -4121,7 +5496,7 @@ func_exec_program () fi else # The program doesn't exist. - \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 @@ -4140,7 +5515,7 @@ func_emit_cwrapperexe_src () cat < #include +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + /* declarations of non-ANSI functions */ -#if defined(__MINGW32__) +#if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif -#elif defined(__CYGWIN__) +#elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif -/* #elif defined (other platforms) ... */ +/* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ -#if defined(_MSC_VER) +#if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC -# ifndef _INTPTR_T_DEFINED -# define _INTPTR_T_DEFINED -# define intptr_t int -# endif -#elif defined(__MINGW32__) +#elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv -#elif defined(__CYGWIN__) +#elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" -/* #elif defined (other platforms) ... */ +/* #elif defined other platforms ... */ #endif -#if defined(PATH_MAX) +#if defined PATH_MAX # define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) +#elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 @@ -4234,8 +5607,8 @@ int setenv (const char *, const char *, int); # define PATH_SEPARATOR ':' #endif -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 @@ -4268,10 +5641,10 @@ int setenv (const char *, const char *, int); #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ + if (stale) { free (stale); stale = 0; } \ } while (0) -#if defined(LT_DEBUGWRAPPER) +#if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; @@ -4300,11 +5673,16 @@ void lt_dump_script (FILE *f); EOF cat < 0) && IS_PATH_SEPARATOR (new_value[len-1])) + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { - new_value[len-1] = '\0'; + new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); @@ -5082,27 +6460,47 @@ EOF # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { - $opt_debug + $debug_cmd + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + # func_mode_link arg... func_mode_link () { - $opt_debug + $debug_cmd + case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra + # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not + # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. @@ -5146,10 +6544,11 @@ func_mode_link () module=no no_install=no objs= + os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no - preload=no + preload=false prev= prevarg= release= @@ -5161,7 +6560,7 @@ func_mode_link () vinfo= vinfo_number=no weak_libs= - single_module="${wl}-single_module" + single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. @@ -5169,15 +6568,15 @@ func_mode_link () do case $arg in -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then @@ -5210,7 +6609,7 @@ func_mode_link () # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do - arg="$1" + arg=$1 shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result @@ -5227,21 +6626,21 @@ func_mode_link () case $prev in bindir) - bindir="$arg" + bindir=$arg prev= continue ;; dlfiles|dlprefiles) - if test "$preload" = no; then + $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" - preload=yes - fi + preload=: + } case $arg in *.la | *.lo) ;; # We handle these cases below. force) - if test "$dlself" = no; then + if test no = "$dlself"; then dlself=needless export_dynamic=yes fi @@ -5249,9 +6648,9 @@ func_mode_link () continue ;; self) - if test "$prev" = dlprefiles; then + if test dlprefiles = "$prev"; then dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless @@ -5261,7 +6660,7 @@ func_mode_link () continue ;; *) - if test "$prev" = dlfiles; then + if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" @@ -5272,14 +6671,14 @@ func_mode_link () esac ;; expsyms) - export_symbols="$arg" + export_symbols=$arg test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" + || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) - export_symbols_regex="$arg" + export_symbols_regex=$arg prev= continue ;; @@ -5297,7 +6696,13 @@ func_mode_link () continue ;; inst_prefix) - inst_prefix_dir="$arg" + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. prev= continue ;; @@ -5321,21 +6726,21 @@ func_mode_link () if test -z "$pic_object" || test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=$func_dirname_result - if test "$pic_object" != none; then + if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" + pic_object=$xdir$pic_object - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue @@ -5346,7 +6751,7 @@ func_mode_link () fi # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then + if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= @@ -5354,23 +6759,23 @@ func_mode_link () # A PIC object. func_append libobjs " $pic_object" - arg="$pic_object" + arg=$pic_object fi # Non-PIC object. - if test "$non_pic_object" != none; then + if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" + non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" + non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else @@ -5378,7 +6783,7 @@ func_mode_link () if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result @@ -5386,24 +6791,29 @@ func_mode_link () func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else - func_fatal_error "\`$arg' is not a valid libtool object" + func_fatal_error "'$arg' is not a valid libtool object" fi fi done else - func_fatal_error "link input file \`$arg' does not exist" + func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; precious_regex) - precious_files_regex="$arg" + precious_files_regex=$arg prev= continue ;; release) - release="-$arg" + release=-$arg prev= continue ;; @@ -5415,7 +6825,7 @@ func_mode_link () func_fatal_error "only absolute run-paths are allowed" ;; esac - if test "$prev" = rpath; then + if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; @@ -5430,7 +6840,7 @@ func_mode_link () continue ;; shrext) - shrext_cmds="$arg" + shrext_cmds=$arg prev= continue ;; @@ -5470,7 +6880,7 @@ func_mode_link () esac fi # test -n "$prev" - prevarg="$arg" + prevarg=$arg case $arg in -all-static) @@ -5484,7 +6894,7 @@ func_mode_link () -allow-undefined) # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" + func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) @@ -5516,7 +6926,7 @@ func_mode_link () if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi - if test "X$arg" = "X-export-symbols"; then + if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex @@ -5550,9 +6960,9 @@ func_mode_link () func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" + func_fatal_error "require no space between '-L' and '$1'" else - func_fatal_error "need path for \`-L' option" + func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" @@ -5563,8 +6973,8 @@ func_mode_link () *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - dir="$absdir" + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir ;; esac case "$deplibs " in @@ -5599,7 +7009,7 @@ func_mode_link () ;; -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) @@ -5607,11 +7017,11 @@ func_mode_link () ;; *-*-os2*) # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue + test X-lc = "X$arg" && continue ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue + test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework @@ -5620,16 +7030,16 @@ func_mode_link () ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype - test "X$arg" = "X-lc" && continue + test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue + test X-lc = "X$arg" && continue ;; esac - elif test "X$arg" = "X-lc_r"; then + elif test X-lc_r = "X$arg"; then case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; @@ -5639,6 +7049,11 @@ func_mode_link () continue ;; + -mllvm) + prev=mllvm + continue + ;; + -module) module=yes continue @@ -5668,7 +7083,7 @@ func_mode_link () ;; -multi_module) - single_module="${wl}-multi_module" + single_module=$wl-multi_module continue ;; @@ -5682,8 +7097,8 @@ func_mode_link () *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; @@ -5701,6 +7116,11 @@ func_mode_link () continue ;; + -os2dllname) + prev=os2dllname + continue + ;; + -o) prev=output ;; -precious-files-regex) @@ -5788,14 +7208,14 @@ func_mode_link () func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= - save_ifs="$IFS"; IFS=',' + save_ifs=$IFS; IFS=, for flag in $args; do - IFS="$save_ifs" + IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done - IFS="$save_ifs" + IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; @@ -5804,15 +7224,15 @@ func_mode_link () func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= - save_ifs="$IFS"; IFS=',' + save_ifs=$IFS; IFS=, for flag in $args; do - IFS="$save_ifs" + IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done - IFS="$save_ifs" + IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; @@ -5835,7 +7255,7 @@ func_mode_link () # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" + arg=$func_quote_for_eval_result ;; # Flags to be passed through unchanged, with rationale: @@ -5847,25 +7267,46 @@ func_mode_link () # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support - # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" + arg=$func_quote_for_eval_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" + arg=$func_quote_for_eval_result ;; *.$objext) @@ -5886,21 +7327,21 @@ func_mode_link () if test -z "$pic_object" || test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=$func_dirname_result - if test "$pic_object" != none; then + test none = "$pic_object" || { # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" + pic_object=$xdir$pic_object - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue @@ -5911,7 +7352,7 @@ func_mode_link () fi # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then + if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= @@ -5919,23 +7360,23 @@ func_mode_link () # A PIC object. func_append libobjs " $pic_object" - arg="$pic_object" - fi + arg=$pic_object + } # Non-PIC object. - if test "$non_pic_object" != none; then + if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" + non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" + non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else @@ -5943,7 +7384,7 @@ func_mode_link () if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result @@ -5951,7 +7392,7 @@ func_mode_link () func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else - func_fatal_error "\`$arg' is not a valid libtool object" + func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; @@ -5967,11 +7408,11 @@ func_mode_link () # A libtool-controlled library. func_resolve_sysroot "$arg" - if test "$prev" = dlfiles; then + if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= - elif test "$prev" = dlprefiles; then + elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= @@ -5986,7 +7427,7 @@ func_mode_link () # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" + arg=$func_quote_for_eval_result ;; esac # arg @@ -5998,9 +7439,9 @@ func_mode_link () done # argument parsing loop test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" + func_fatal_help "the '$prevarg' option requires an argument" - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" @@ -6009,20 +7450,23 @@ func_mode_link () oldlibs= # calculate the name of the file, without its directory func_basename "$output" - outputname="$func_basename_result" - libobjs_save="$libobjs" + outputname=$func_basename_result + libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" + output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. @@ -6045,7 +7489,7 @@ func_mode_link () # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do - if $opt_preserve_dup_deps ; then + if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac @@ -6053,7 +7497,7 @@ func_mode_link () func_append libs " $deplib" done - if test "$linkmode" = lib; then + if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps @@ -6085,7 +7529,7 @@ func_mode_link () case $file in *.la) ;; *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done @@ -6093,7 +7537,7 @@ func_mode_link () prog) compile_deplibs= finalize_deplibs= - alldeplibs=no + alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" @@ -6105,29 +7549,29 @@ func_mode_link () for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then + if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done - deplibs="$tmp_deplibs" + deplibs=$tmp_deplibs fi - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs deplibs= fi - if test "$linkmode" = prog; then + if test prog = "$linkmode"; then case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then + if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs @@ -6148,26 +7592,26 @@ func_mode_link () esac done done - libs="$dlprefiles" + libs=$dlprefiles fi - if test "$pass" = dlopen; then + if test dlopen = "$pass"; then # Collect dlpreopened libraries - save_deplibs="$deplibs" + save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= - found=no + found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - if test "$linkmode,$pass" = "prog,link"; then + if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" - if test "$linkmode" = lib ; then + if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; @@ -6177,13 +7621,13 @@ func_mode_link () continue ;; -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result - if test "$linkmode" = lib; then + if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" @@ -6191,31 +7635,22 @@ func_mode_link () for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library - lib="$searchdir/lib${name}${search_ext}" + lib=$searchdir/lib$name$search_ext if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes + if test .la = "$search_ext"; then + found=: else - found=no + found=false fi break 2 fi done done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library + if $found; then + # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then @@ -6223,19 +7658,19 @@ func_mode_link () old_library= func_source "$lib" for l in $old_library $library_names; do - ll="$l" + ll=$l done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no + if test "X$ll" = "X$old_library"; then # only static version available + found=false func_dirname "$lib" "" "." - ladir="$func_dirname_result" + ladir=$func_dirname_result lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then + if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi @@ -6244,15 +7679,25 @@ func_mode_link () *) ;; esac fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue fi ;; # -l *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then + if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then + if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; @@ -6265,18 +7710,18 @@ func_mode_link () case $linkmode in lib) deplibs="$deplib $deplibs" - test "$pass" = conv && continue + test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) - if test "$pass" = conv; then + if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi - if test "$pass" = scan; then + if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" @@ -6287,13 +7732,13 @@ func_mode_link () func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) - func_warning "\`-L' is ignored for archives/objects" + func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) - if test "$pass" = link; then + if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result @@ -6311,7 +7756,7 @@ func_mode_link () lib=$func_resolve_sysroot_result ;; *.$libext) - if test "$pass" = conv; then + if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi @@ -6322,21 +7767,26 @@ func_mode_link () case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) - valid_a_lib=no + valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes + valid_a_lib=: fi ;; pass_all) - valid_a_lib=yes + valid_a_lib=: ;; esac - if test "$valid_a_lib" != yes; then + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" @@ -6344,18 +7794,13 @@ func_mode_link () echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." - else - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) - if test "$pass" != link; then + if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" @@ -6366,10 +7811,10 @@ func_mode_link () esac # linkmode ;; # *.$libext *.lo | *.$objext) - if test "$pass" = conv; then + if test conv = "$pass"; then deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" @@ -6382,22 +7827,20 @@ func_mode_link () continue ;; %DEPLIBS%) - alldeplibs=yes + alldeplibs=: continue ;; esac # case $deplib - if test "$found" = yes || test -f "$lib"; then : - else - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" - fi + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" + || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." - ladir="$func_dirname_result" + ladir=$func_dirname_result dlname= dlopen= @@ -6427,30 +7870,30 @@ func_mode_link () done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi - if test "$pass" = conv; then + if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for \`$lib'" + func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" - elif test "$linkmode" != prog && test "$linkmode" != lib; then - func_fatal_error "\`$lib' is not a convenience library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps ; then + if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac @@ -6464,26 +7907,26 @@ func_mode_link () # Get the name of the library we link against. linklib= if test -n "$old_library" && - { test "$prefer_static_libs" = yes || - test "$prefer_static_libs,$installed" = "built,no"; }; then + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do - linklib="$l" + linklib=$l done fi if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" + func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" - fi + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't @@ -6497,40 +7940,40 @@ func_mode_link () # We need an absolute path. case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" + abs_ladir=$ladir fi ;; esac func_basename "$lib" - laname="$func_basename_result" + laname=$func_basename_result # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then + if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library \`$lib' was moved." - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir else - dir="$lt_sysroot$libdir" - absdir="$lt_sysroot$libdir" + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" + dir=$ladir + absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi @@ -6539,11 +7982,11 @@ func_mode_link () name=$func_stripname_result # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi - case "$host" in + case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both @@ -6587,9 +8030,9 @@ func_mode_link () if test -z "$libdir"; then # Link the convenience library - if test "$linkmode" = lib; then + if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then + elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else @@ -6599,14 +8042,14 @@ func_mode_link () fi - if test "$linkmode" = prog && test "$pass" != link; then + if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: fi tmp_libs= @@ -6618,14 +8061,14 @@ func_mode_link () ;; esac # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then + if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi - if $opt_preserve_dup_deps ; then + if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac @@ -6635,15 +8078,15 @@ func_mode_link () continue fi # $linkmode = prog... - if test "$linkmode,$pass" = "prog,link"; then + if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && - { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. - case "$temp_rpath:" in + case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac @@ -6672,9 +8115,9 @@ func_mode_link () esac fi # $linkmode,$pass = prog,link... - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue @@ -6683,19 +8126,19 @@ func_mode_link () link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes; then + if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then + { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in - *cygwin* | *mingw* | *cegcc*) + *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) - if test "$installed" = no; then + if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi @@ -6705,24 +8148,24 @@ func_mode_link () # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" + dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" + dlopenmodule=$dlpremoduletest break fi done - if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo - if test "$linkmode" = prog; then + if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. @@ -6750,43 +8193,43 @@ func_mode_link () # figure out the soname set dummy $library_names shift - realname="$1" + realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then - soname="$dlname" + soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in - *cygwin* | mingw* | *cegcc*) + *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result - versuffix="-$major" + versuffix=-$major ;; esac eval soname=\"$soname_spec\" else - soname="$realname" + soname=$realname fi # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" + soroot=$soname func_basename "$soroot" - soname="$func_basename_result" + soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else - func_verbose "extracting exported symbol list from \`$soname'" + func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" + func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library @@ -6794,58 +8237,58 @@ func_mode_link () linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" - if test "$linkmode" = prog || test "$opt_mode" != relink; then + if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" + if test no = "$hardcode_direct"; then + add=$dir/$linklib case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; + *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) - # if the lib is a (non-dlopened) module then we can not + # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then + $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then + if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else - add="$dir/$old_library" + add=$dir/$old_library fi elif test -n "$old_library"; then - add="$dir/$old_library" + add=$dir/$old_library fi fi esac - elif test "$hardcode_minus_L" = no; then + elif test no = "$hardcode_minus_L"; then case $host in - *-*-sunos*) add_shlibpath="$dir" ;; + *-*-sunos*) add_shlibpath=$dir ;; esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name else lib_linked=no fi ;; relink) - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$absdir" + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in @@ -6854,10 +8297,10 @@ func_mode_link () ;; esac fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name else lib_linked=no fi @@ -6865,7 +8308,7 @@ func_mode_link () *) lib_linked=no ;; esac - if test "$lib_linked" != yes; then + if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi @@ -6875,15 +8318,15 @@ func_mode_link () *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi - if test "$linkmode" = prog; then + if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && - test "$hardcode_minus_L" != yes && - test "$hardcode_shlibpath_var" = yes; then + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; @@ -6892,33 +8335,33 @@ func_mode_link () fi fi - if test "$linkmode" = prog || test "$opt_mode" = relink; then + if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then + add=-l$name + elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib else - add="$libdir/$linklib" + add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" + add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in @@ -6927,10 +8370,10 @@ func_mode_link () ;; esac fi - add="-l$name" + add=-l$name fi - if test "$linkmode" = prog; then + if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else @@ -6938,43 +8381,43 @@ func_mode_link () test -n "$add" && deplibs="$add $deplibs" fi fi - elif test "$linkmode" = prog; then + elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi - elif test "$build_libtool_libs" = yes; then + elif test yes = "$build_libtool_libs"; then # Not a shared library - if test "$deplibs_check_method" != pass_all; then + if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo - $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then + if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." + echo "*** 'nm' from GNU binutils and a full rebuild may help." fi - if test "$build_old_libs" = no; then + if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else @@ -6987,11 +8430,11 @@ func_mode_link () fi fi # link shared/static library? - if test "$linkmode" = lib; then + if test lib = "$linkmode"; then if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do @@ -7005,12 +8448,12 @@ func_mode_link () *) func_append temp_deplibs " $libdir";; esac done - dependency_libs="$temp_deplibs" + dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do @@ -7020,7 +8463,7 @@ func_mode_link () func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac - if $opt_preserve_dup_deps ; then + if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; @@ -7029,12 +8472,12 @@ func_mode_link () func_append tmp_libs " $func_resolve_sysroot_result" done - if test "$link_all_deplibs" != no; then + if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in - -L*) path="$deplib" ;; + -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result @@ -7042,12 +8485,12 @@ func_mode_link () dir=$func_dirname_result # We need an absolute path. case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" - absdir="$dir" + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir fi ;; esac @@ -7055,35 +8498,35 @@ func_mode_link () case $host in *-*-darwin*) depdepl= - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do depdepl=$tmp done - if test -f "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi - func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) - path="-L$absdir/$objdir" + path=-L$absdir/$objdir ;; esac else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" + func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" + func_warning "'$deplib' seems to be moved" - path="-L$absdir" + path=-L$absdir fi ;; esac @@ -7095,23 +8538,23 @@ func_mode_link () fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then + if test link = "$pass"; then + if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then + if test dlopen != "$pass"; then + test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do @@ -7121,12 +8564,12 @@ func_mode_link () esac done newlib_search_path= - fi + } - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else + if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" + else + vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order @@ -7184,62 +8627,93 @@ func_mode_link () eval $var=\"$tmp_libs\" done # for var fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= - for i in $dependency_libs ; do + for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) - i="" + i= ;; esac - if test -n "$i" ; then + if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" + if test prog = "$linkmode"; then + dlfiles=$newdlfiles fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles fi case $linkmode in oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; + func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" + func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" + func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" + func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ - func_warning "\`-release' is ignored for archives" + func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" + func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no - oldlibs="$output" + oldlibs=$output func_append objs "$old_deplibs" ;; lib) - # Make sure we only generate libraries of the form `libNAME.la'. + # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" @@ -7248,10 +8722,10 @@ func_mode_link () eval libname=\"$libname_spec\" ;; *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" - if test "$need_lib_prefix" != no; then + if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result @@ -7265,8 +8739,8 @@ func_mode_link () esac if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" @@ -7275,21 +8749,21 @@ func_mode_link () fi fi - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" - install_libdir="$1" + install_libdir=$1 oldlibs= if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then + if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so + # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" @@ -7298,20 +8772,20 @@ func_mode_link () fi test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" + func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. - save_ifs="$IFS"; IFS=':' + save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift - IFS="$save_ifs" + IFS=$save_ifs test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" + func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts @@ -7319,42 +8793,42 @@ func_mode_link () case $vinfo_number in yes) - number_major="$1" - number_minor="$2" - number_revision="$3" + number_major=$1 + number_minor=$2 + number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix - # which has an extra 1 added just for fun + # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor - darwin|linux|osf|windows|none) + darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result - age="$number_minor" - revision="$number_revision" + age=$number_minor + revision=$number_revision ;; - freebsd-aout|freebsd-elf|qnx|sunos) - current="$number_major" - revision="$number_minor" - age="0" + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result - age="$number_minor" - revision="$number_minor" + age=$number_minor + revision=$number_minor lt_irix_increment=no ;; esac ;; no) - current="$1" - revision="$2" - age="$3" + current=$1 + revision=$2 + age=$3 ;; esac @@ -7362,30 +8836,30 @@ func_mode_link () case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. @@ -7400,26 +8874,36 @@ func_mode_link () # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result - versuffix="$major.$age.$revision" + versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac ;; freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; + major=.$current + versuffix=.$current.$revision ;; freebsd-elf) - major=".$current" - versuffix=".$current" + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision ;; irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then + if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 @@ -7430,69 +8914,74 @@ func_mode_link () nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac - verstring="$verstring_prefix$major.$revision" + verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision - while test "$loop" -ne 0; do + while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" + verstring=$verstring_prefix$major.$iface:$verstring done - # Before this point, $major must not contain `.'. + # Before this point, $major must not contain '.'. major=.$major - versuffix="$major.$revision" + versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result - versuffix="$major.$age.$revision" + versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age - while test "$loop" -ne 0; do + while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result - verstring="$verstring:${iface}.0" + verstring=$verstring:$iface.0 done # Make executables depend on our current version. - func_append verstring ":${current}.0" + func_append verstring ":$current.0" ;; qnx) - major=".$current" - versuffix=".$current" + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current ;; sunos) - major=".$current" - versuffix=".$current.$revision" + major=.$current + versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. + # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result - versuffix="-$major" + versuffix=-$major ;; *) - func_fatal_configuration "unknown library version type \`$version_type'" + func_fatal_configuration "unknown library version type '$version_type'" ;; esac @@ -7506,42 +8995,45 @@ func_mode_link () verstring= ;; *) - verstring="0.0" + verstring=0.0 ;; esac - if test "$need_version" = no; then + if test no = "$need_version"; then versuffix= else - versuffix=".0.0" + versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then + if test yes,no = "$avoid_version,$need_version"; then major= versuffix= - verstring="" + verstring= fi # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - func_warning "undefined symbols not allowed in $host shared libraries" - build_libtool_libs=no - build_old_libs=yes + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi fi else # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" + allow_undefined_flag=$no_undefined_flag fi fi - func_generate_dlsyms "$libname" "$libname" "yes" + func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" - test "X$libobjs" = "X " && libobjs= + test " " = "$libobjs" && libobjs= - if test "$opt_mode" != relink; then + if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= @@ -7550,8 +9042,8 @@ func_mode_link () case $p in *.$objext | *.gcno) ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue @@ -7567,11 +9059,11 @@ func_mode_link () fi # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. @@ -7592,13 +9084,13 @@ func_mode_link () *) func_append finalize_rpath " $libdir" ;; esac done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" + old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in @@ -7608,7 +9100,7 @@ func_mode_link () done # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" + old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in @@ -7617,7 +9109,7 @@ func_mode_link () esac done - if test "$build_libtool_libs" = yes; then + if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) @@ -7641,7 +9133,7 @@ func_mode_link () ;; *) # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then + if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; @@ -7657,9 +9149,9 @@ func_mode_link () # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? - release="" - versuffix="" - major="" + release= + versuffix= + major= newdeplibs= droppeddeps=no case $deplibs_check_method in @@ -7688,20 +9180,20 @@ EOF -l*) func_stripname -l '' "$i" name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $i "*) func_append newdeplibs " $i" - i="" + i= ;; esac fi - if test -n "$i" ; then + if test -n "$i"; then libname=`eval "\\$ECHO \"$libname_spec\""` deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` set dummy $deplib_matches; shift deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then func_append newdeplibs " $i" else droppeddeps=yes @@ -7731,20 +9223,20 @@ EOF $opt_dry_run || $RM conftest if $LTCC $LTCFLAGS -o conftest conftest.c $i; then ldd_output=`ldd conftest` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $i "*) func_append newdeplibs " $i" - i="" + i= ;; esac fi - if test -n "$i" ; then + if test -n "$i"; then libname=`eval "\\$ECHO \"$libname_spec\""` deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` set dummy $deplib_matches; shift deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then func_append newdeplibs " $i" else droppeddeps=yes @@ -7781,24 +9273,24 @@ EOF -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" - a_deplib="" + a_deplib= ;; esac fi - if test -n "$a_deplib" ; then + if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` if test -n "$file_magic_glob"; then libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` else libnameglob=$libname fi - test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob` + test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - if test "$want_nocaseglob" = yes; then + if test yes = "$want_nocaseglob"; then shopt -s nocaseglob potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` $nocaseglob @@ -7816,25 +9308,25 @@ EOF # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? - potlib="$potent_lib" + potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" - a_deplib="" + a_deplib= break 2 fi done done fi - if test -n "$a_deplib" ; then + if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." @@ -7842,7 +9334,7 @@ EOF echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then + if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" @@ -7865,30 +9357,30 @@ EOF -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" - a_deplib="" + a_deplib= ;; esac fi - if test -n "$a_deplib" ; then + if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test + potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" - a_deplib="" + a_deplib= break 2 fi done done fi - if test -n "$a_deplib" ; then + if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." @@ -7896,7 +9388,7 @@ EOF echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then + if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" @@ -7912,18 +9404,18 @@ EOF done # Gone through all deplibs. ;; none | unknown | *) - newdeplibs="" + newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo - if test "X$deplibs_check_method" = "Xnone"; then + if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." @@ -7947,8 +9439,8 @@ EOF ;; esac - if test "$droppeddeps" = yes; then - if test "$module" = yes; then + if test yes = "$droppeddeps"; then + if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" @@ -7957,12 +9449,12 @@ EOF if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." + echo "*** 'nm' from GNU binutils and a full rebuild may help." fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else @@ -7973,14 +9465,14 @@ EOF echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." - if test "$allow_undefined" = no; then + if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else @@ -8026,7 +9518,7 @@ EOF *) func_append new_libs " $deplib" ;; esac done - deplibs="$new_libs" + deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= @@ -8034,25 +9526,25 @@ EOF dlname= # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - # Remove ${wl} instances when linking with ld. + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac - if test "$hardcode_into_libs" = yes; then + if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= - rpath="$finalize_rpath" - test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" + hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in @@ -8077,7 +9569,7 @@ EOF # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" + libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then @@ -8091,8 +9583,8 @@ EOF test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi - shlibpath="$finalize_shlibpath" - test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi @@ -8102,19 +9594,19 @@ EOF eval library_names=\"$library_names_spec\" set dummy $library_names shift - realname="$1" + realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else - soname="$realname" + soname=$realname fi if test -z "$dlname"; then dlname=$soname fi - lib="$output_objdir/$realname" + lib=$output_objdir/$realname linknames= for link do @@ -8128,7 +9620,7 @@ EOF delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi @@ -8137,31 +9629,31 @@ EOF cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. - orig_export_symbols="$export_symbols" + orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes - fi + } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' + save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do - IFS="$save_ifs" + IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in @@ -8175,7 +9667,7 @@ EOF try_normal_branch=no ;; esac - if test "$try_normal_branch" = yes \ + if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then @@ -8186,7 +9678,7 @@ EOF output_la=$func_basename_result save_libobjs=$libobjs save_output=$output - output=${output_objdir}/${output_la}.nm + output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" @@ -8209,8 +9701,8 @@ EOF break fi done - IFS="$save_ifs" - if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi @@ -8218,16 +9710,16 @@ EOF fi if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine + # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. @@ -8246,11 +9738,11 @@ EOF ;; esac done - deplibs="$tmp_deplibs" + deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && + test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. @@ -8261,7 +9753,7 @@ EOF eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience @@ -8270,18 +9762,18 @@ EOF fi fi - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking - if test "$opt_mode" = relink; then + if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then + if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds @@ -8299,7 +9791,7 @@ EOF fi fi - if test "X$skipped_export" != "X:" && + if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then @@ -8332,8 +9824,8 @@ EOF last_robj= k=1 - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs @@ -8345,14 +9837,14 @@ EOF func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= - if test "$compiler_needs_object" = yes; then + if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi @@ -8367,7 +9859,7 @@ EOF else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext + output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result @@ -8379,13 +9871,13 @@ EOF func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result - if test "X$objlist" = X || + if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. - if test "$k" -eq 1 ; then + if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" @@ -8395,10 +9887,10 @@ EOF reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi - last_robj=$output_objdir/$output_la-${k}.$objext + last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext + output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result @@ -8410,9 +9902,9 @@ EOF # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" - eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" @@ -8420,9 +9912,9 @@ EOF output= fi - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. @@ -8431,16 +9923,16 @@ EOF if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi - fi + } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' + save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do - IFS="$save_ifs" - $opt_silent || { + IFS=$save_ifs + $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } @@ -8448,7 +9940,7 @@ EOF lt_exit=$? # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) @@ -8457,7 +9949,7 @@ EOF exit $lt_exit } done - IFS="$save_ifs" + IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' @@ -8465,18 +9957,18 @@ EOF fi fi - if ${skipped_export-false}; then + ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine + # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. @@ -8485,7 +9977,7 @@ EOF export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi - fi + } libobjs=$output # Restore the value of output. @@ -8499,7 +9991,7 @@ EOF # value of $libobjs for piecewise linking. # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then + if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else @@ -8521,7 +10013,7 @@ EOF # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles @@ -8529,11 +10021,12 @@ EOF test "X$libobjs" = "X " && libobjs= fi - save_ifs="$IFS"; IFS='~' + save_ifs=$IFS; IFS='~' for cmd in $cmds; do - IFS="$save_ifs" + IFS=$sp$nl eval cmd=\"$cmd\" - $opt_silent || { + IFS=$save_ifs + $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } @@ -8541,7 +10034,7 @@ EOF lt_exit=$? # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) @@ -8550,10 +10043,10 @@ EOF exit $lt_exit } done - IFS="$save_ifs" + IFS=$save_ifs # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then @@ -8573,39 +10066,39 @@ EOF done # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then + if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. - dlname="$soname" + dlname=$soname fi fi ;; obj) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; + func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" + func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" + func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" + func_warning "'-version-info' is ignored for objects" test -n "$release" && \ - func_warning "\`-release' is ignored for objects" + func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" + func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" @@ -8613,7 +10106,7 @@ EOF ;; *) libobj= - obj="$output" + obj=$output ;; esac @@ -8626,17 +10119,19 @@ EOF # the extraction. reload_conv_objs= gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec and hope we can get by with - # turning comma into space.. - wl= - + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else - gentop="$output_objdir/${obj}x" + gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience @@ -8645,12 +10140,12 @@ EOF fi # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs - output="$obj" + output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. @@ -8662,7 +10157,7 @@ EOF exit $EXIT_SUCCESS fi - if test "$build_libtool_libs" != yes; then + test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi @@ -8672,12 +10167,12 @@ EOF # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS - fi + } - if test -n "$pic_flag" || test "$pic_mode" != default; then + if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" - output="$libobj" + output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi @@ -8694,16 +10189,14 @@ EOF output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" + func_warning "'-version-info' is ignored for programs" test -n "$release" && \ - func_warning "\`-release' is ignored for programs" + func_warning "'-release' is ignored for programs" - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) @@ -8717,11 +10210,11 @@ EOF *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then + if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) - func_append compile_command " ${wl}-bind_at_load" - func_append finalize_command " ${wl}-bind_at_load" + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" ;; esac fi @@ -8757,7 +10250,7 @@ EOF *) func_append new_libs " $deplib" ;; esac done - compile_deplibs="$new_libs" + compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" @@ -8781,7 +10274,7 @@ EOF if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" + hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in @@ -8804,7 +10297,7 @@ EOF fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; @@ -8821,10 +10314,10 @@ EOF # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" + libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi - compile_rpath="$rpath" + compile_rpath=$rpath rpath= hardcode_libdirs= @@ -8832,7 +10325,7 @@ EOF if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" + hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in @@ -8857,45 +10350,43 @@ EOF # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" + libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi - finalize_rpath="$rpath" + finalize_rpath=$rpath - if test -n "$libobjs" && test "$build_old_libs" = yes; then + if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi - wrappers_required=yes + wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=no + wrappers_required=false ;; *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi + test yes = "$build_libtool_libs" || wrappers_required=false ;; *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false fi ;; esac - if test "$wrappers_required" = no; then + $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" + link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 @@ -8908,12 +10399,12 @@ EOF fi # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status - fi + } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" @@ -8943,9 +10434,9 @@ EOF fi fi - if test "$no_install" = yes; then + if test yes = "$no_install"; then # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" + link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. @@ -8962,27 +10453,28 @@ EOF exit $EXIT_SUCCESS fi - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` @@ -9039,8 +10531,8 @@ EOF func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 @@ -9061,7 +10553,7 @@ EOF trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host" ; then + if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result @@ -9084,25 +10576,27 @@ EOF # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save $symfileobj" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience build_libtool_libs=no - else + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) oldobjs="$old_deplibs $non_pic_objects" - if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" - fi - fi - addlibs="$old_convenience" - fi + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs @@ -9110,13 +10604,13 @@ EOF fi # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles @@ -9137,7 +10631,7 @@ EOF : else echo "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs @@ -9146,7 +10640,7 @@ EOF for obj in $save_oldobjs do func_basename "$obj" - objbase="$func_basename_result" + objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) @@ -9215,18 +10709,18 @@ EOF else # the above command should be used before it gets too long oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then + if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist - if test "X$oldobjs" = "X" ; then + if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" @@ -9243,7 +10737,7 @@ EOF case $output in *.la) old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" + test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior @@ -9258,31 +10752,31 @@ EOF fi done # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - if test "$hardcode_automatic" = yes ; then + if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do - if test "$installed" = yes; then + if test yes = "$installed"; then if test -z "$install_libdir"; then break fi - output="$output_objdir/$outputname"i + output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" - name="$func_basename_result" + name=$func_basename_result func_resolve_sysroot "$deplib" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" + func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) @@ -9298,23 +10792,23 @@ EOF *) func_append newdependency_libs " $deplib" ;; esac done - dependency_libs="$newdependency_libs" + dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" + func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done - dlfiles="$newdlfiles" + dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in @@ -9324,34 +10818,34 @@ EOF # didn't already link the preopened objects directly into # the library: func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" + func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done - dlprefiles="$newdlprefiles" + dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done - dlfiles="$newdlfiles" + dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done - dlprefiles="$newdlprefiles" + dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin @@ -9367,10 +10861,9 @@ EOF case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. - if test "x$bindir" != x ; - then + if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result$dlname + tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname @@ -9379,7 +10872,7 @@ EOF esac $ECHO > $output "\ # $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. @@ -9393,7 +10886,7 @@ library_names='$library_names' # The name of the static archive. old_library='$old_library' -# Linker flags that can not go in dependency_libs. +# Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. @@ -9419,7 +10912,7 @@ dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then + if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi @@ -9434,27 +10927,29 @@ relink_command=\"$relink_command\"" exit $EXIT_SUCCESS } -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && - func_mode_link ${1+"$@"} +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi # func_mode_uninstall arg... func_mode_uninstall () { - $opt_debug - RM="$nonopt" + $debug_cmd + + RM=$nonopt files= - rmforce= + rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. - libtool_install_magic="$magic" + libtool_install_magic=$magic for arg do case $arg in - -f) func_append RM " $arg"; rmforce=yes ;; + -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac @@ -9467,18 +10962,18 @@ func_mode_uninstall () for file in $files; do func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - odir="$objdir" + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir else - odir="$dir/$objdir" + odir=$dir/$objdir fi func_basename "$file" - name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then + if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; @@ -9493,11 +10988,11 @@ func_mode_uninstall () elif test -d "$file"; then exit_status=1 continue - elif test "$rmforce" = yes; then + elif $rmforce; then continue fi - rmfiles="$file" + rmfiles=$file case $name in *.la) @@ -9511,7 +11006,7 @@ func_mode_uninstall () done test -n "$old_library" && func_append rmfiles " $odir/$old_library" - case "$opt_mode" in + case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; @@ -9522,12 +11017,12 @@ func_mode_uninstall () uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; @@ -9543,21 +11038,19 @@ func_mode_uninstall () func_source $dir/$name # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then + if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && - test "$non_pic_object" != none; then + if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) - if test "$opt_mode" = clean ; then + if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) @@ -9584,12 +11077,12 @@ func_mode_uninstall () # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi - if test "X$noexename" != "X$name" ; then - func_append rmfiles " $odir/lt-${noexename}.c" + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" fi fi fi @@ -9598,7 +11091,7 @@ func_mode_uninstall () func_show_eval "$RM $rmfiles" 'exit_status=1' done - # Try to remove the ${objdir}s in the directories where we deleted files + # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" @@ -9608,16 +11101,17 @@ func_mode_uninstall () exit $exit_status } -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && - func_mode_uninstall ${1+"$@"} +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi test -z "$opt_mode" && { - help="$generic_help" + help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" + func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" @@ -9628,7 +11122,7 @@ exit $exit_status # The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting +# where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support @@ -9651,5 +11145,3 @@ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # mode:shell-script # sh-indentation:2 # End: -# vi:sw=2 - diff --git a/external/opus-1.3.1/m4/as-gcc-inline-assembly.m4 b/external/opus-1.3.1/m4/as-gcc-inline-assembly.m4 new file mode 100644 index 00000000..b0d2da41 --- /dev/null +++ b/external/opus-1.3.1/m4/as-gcc-inline-assembly.m4 @@ -0,0 +1,98 @@ +dnl as-gcc-inline-assembly.m4 0.1.0 + +dnl autostars m4 macro for detection of gcc inline assembly + +dnl David Schleef + +dnl AS_COMPILER_FLAG(ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) +dnl Tries to compile with the given CFLAGS. +dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, +dnl and ACTION-IF-NOT-ACCEPTED otherwise. + +AC_DEFUN([AS_GCC_INLINE_ASSEMBLY], +[ + AC_MSG_CHECKING([if compiler supports gcc-style inline assembly]) + + AC_TRY_COMPILE([], [ +#ifdef __GNUC_MINOR__ +#if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 +#error GCC before 3.4 has critical bugs compiling inline assembly +#endif +#endif +__asm__ (""::) ], [flag_ok=yes], [flag_ok=no]) + + if test "X$flag_ok" = Xyes ; then + $1 + true + else + $2 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + +AC_DEFUN([AS_ASM_ARM_NEON], +[ + AC_MSG_CHECKING([if assembler supports NEON instructions on ARM]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__("vorr d0,d0,d0")])], + [AC_MSG_RESULT([yes]) + $1], + [AC_MSG_RESULT([no]) + $2]) +]) + +AC_DEFUN([AS_ASM_ARM_NEON_FORCE], +[ + AC_MSG_CHECKING([if assembler supports NEON instructions on ARM]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__(".arch armv7-a\n.fpu neon\n.object_arch armv4t\nvorr d0,d0,d0")])], + [AC_MSG_RESULT([yes]) + $1], + [AC_MSG_RESULT([no]) + $2]) +]) + +AC_DEFUN([AS_ASM_ARM_MEDIA], +[ + AC_MSG_CHECKING([if assembler supports ARMv6 media instructions on ARM]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__("shadd8 r3,r3,r3")])], + [AC_MSG_RESULT([yes]) + $1], + [AC_MSG_RESULT([no]) + $2]) +]) + +AC_DEFUN([AS_ASM_ARM_MEDIA_FORCE], +[ + AC_MSG_CHECKING([if assembler supports ARMv6 media instructions on ARM]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__(".arch armv6\n.object_arch armv4t\nshadd8 r3,r3,r3")])], + [AC_MSG_RESULT([yes]) + $1], + [AC_MSG_RESULT([no]) + $2]) +]) + +AC_DEFUN([AS_ASM_ARM_EDSP], +[ + AC_MSG_CHECKING([if assembler supports EDSP instructions on ARM]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__("qadd r3,r3,r3")])], + [AC_MSG_RESULT([yes]) + $1], + [AC_MSG_RESULT([no]) + $2]) +]) + +AC_DEFUN([AS_ASM_ARM_EDSP_FORCE], +[ + AC_MSG_CHECKING([if assembler supports EDSP instructions on ARM]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__(".arch armv5te\n.object_arch armv4t\nqadd r3,r3,r3")])], + [AC_MSG_RESULT([yes]) + $1], + [AC_MSG_RESULT([no]) + $2]) +]) diff --git a/external/opus-1.3.1/m4/ax_add_fortify_source.m4 b/external/opus-1.3.1/m4/ax_add_fortify_source.m4 new file mode 100644 index 00000000..1c89e410 --- /dev/null +++ b/external/opus-1.3.1/m4/ax_add_fortify_source.m4 @@ -0,0 +1,53 @@ +# =========================================================================== +# Modified from https://www.gnu.org/software/autoconf-archive/ax_add_fortify_source.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_ADD_FORTIFY_SOURCE +# +# DESCRIPTION +# +# Check whether -D_FORTIFY_SOURCE=2 can be added to CFLAGS without macro +# redefinition warnings. Some distributions (such as Gentoo Linux) enable +# _FORTIFY_SOURCE globally in their compilers, leading to unnecessary +# warnings in the form of +# +# :0:0: error: "_FORTIFY_SOURCE" redefined [-Werror] +# : note: this is the location of the previous definition +# +# which is a problem if -Werror is enabled. This macro checks whether +# _FORTIFY_SOURCE is already defined, and if not, adds -D_FORTIFY_SOURCE=2 +# to CFLAGS. +# +# LICENSE +# +# Copyright (c) 2017 David Seifert +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +AC_DEFUN([AX_ADD_FORTIFY_SOURCE],[ + AC_MSG_CHECKING([whether to add -D_FORTIFY_SOURCE=2 to CFLAGS]) + AC_LINK_IFELSE([ + AC_LANG_SOURCE( + [[ + int main() { + #ifndef _FORTIFY_SOURCE + return 0; + #else + this_is_an_error; + #endif + } + ]] + )], [ + AC_MSG_RESULT([yes]) + CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" + ], [ + AC_MSG_RESULT([no]) + ]) +]) diff --git a/external/opus-1.0.3/m4/libtool.m4 b/external/opus-1.3.1/m4/libtool.m4 similarity index 72% rename from external/opus-1.0.3/m4/libtool.m4 rename to external/opus-1.3.1/m4/libtool.m4 index cfc9ef43..a644432f 100644 --- a/external/opus-1.0.3/m4/libtool.m4 +++ b/external/opus-1.3.1/m4/libtool.m4 @@ -1,8 +1,6 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -10,36 +8,30 @@ # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. # -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. # -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . ]) -# serial 57 LT_INIT +# serial 58 LT_INIT # LT_PREREQ(VERSION) @@ -67,7 +59,7 @@ esac # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl @@ -91,7 +83,7 @@ dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" +LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' @@ -111,26 +103,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + # _LT_CC_BASENAME(CC) # ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} @@ -177,15 +186,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our +# See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then +if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) -if test -n "${ZSH_VERSION+set}" ; then +if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi @@ -198,7 +208,7 @@ aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then + if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -209,14 +219,14 @@ esac ofile=libtool can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except MSVC, +# All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a -with_gnu_ld="$lt_cv_prog_gnu_ld" +with_gnu_ld=$lt_cv_prog_gnu_ld -old_CC="$CC" -old_CFLAGS="$CFLAGS" +old_CC=$CC +old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc @@ -269,14 +279,14 @@ no_glob_subst='s/\*/\\\*/g' # _LT_PROG_LTMAIN # --------------- -# Note that this code is called both from `configure', and `config.status' +# Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" +ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN @@ -286,7 +296,7 @@ ltmain="$ac_aux_dir/ltmain.sh" # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' +# in macros and then make a single call at the end using the 'libtool' # label. @@ -421,8 +431,8 @@ m4_define([_lt_decl_all_varnames], # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) @@ -446,7 +456,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl +available_tags='_LT_TAGS'dnl ]) @@ -474,7 +484,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], @@ -500,8 +510,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], @@ -547,7 +557,7 @@ for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -560,7 +570,7 @@ for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -576,7 +586,7 @@ _LT_OUTPUT_LIBTOOL_INIT # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the -# `#!' sequence but before initialization text begins. After this +# '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). @@ -598,7 +608,7 @@ AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF -test $lt_write_fail = 0 && chmod +x $1[]dnl +test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT @@ -621,7 +631,7 @@ exec AS_MESSAGE_LOG_FD>>config.log } >&AS_MESSAGE_LOG_FD lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, +'$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. @@ -643,7 +653,7 @@ Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." -while test $[#] != 0 +while test 0 != $[#] do case $[1] in --version | --v* | -V ) @@ -656,10 +666,10 @@ do lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; +Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; +Try '$[0] --help' for more information.]) ;; esac shift done @@ -685,7 +695,7 @@ chmod +x "$CONFIG_LT" # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: -test "$silent" = yes && +test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false @@ -705,32 +715,47 @@ m4_defun([_LT_CONFIG], _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options which allow our + # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then + if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi - cfgfile="${ofile}T" + cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. -# + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + _LT_COPYING _LT_LIBTOOL_TAGS +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in @@ -739,7 +764,7 @@ _LT_EOF # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then +if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -756,8 +781,6 @@ _LT_EOF sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) - _LT_PROG_REPLACE_SHELLFNS - mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" @@ -775,7 +798,6 @@ _LT_EOF [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS @@ -974,7 +996,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then + if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the @@ -992,7 +1014,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -1010,7 +1032,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], @@ -1032,7 +1054,7 @@ _LT_EOF _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -1042,32 +1064,32 @@ _LT_EOF ]) case $host_os in rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then + if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= @@ -1087,29 +1109,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; + ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac - if test "$_lt_dar_can_shared" = "yes"; then + if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else @@ -1129,7 +1151,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl -if test "${lt_cv_aix_libpath+set}" = set; then +if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], @@ -1147,7 +1169,7 @@ else _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) @@ -1167,8 +1189,8 @@ m4_define([_LT_SHELL_INIT], # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script which will find a shell with a builtin -# printf (which we can use as an echo command). +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO @@ -1196,10 +1218,10 @@ fi # Invoke $ECHO with all args, space-separated. func_echo_all () { - $ECHO "$*" + $ECHO "$*" } -case "$ECHO" in +case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; @@ -1225,16 +1247,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= -case ${with_sysroot} in #( +case $with_sysroot in #( yes) - if test "$GCC" = yes; then + if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( @@ -1244,14 +1267,14 @@ case ${with_sysroot} in #( no|'') ;; #( *) - AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) +[dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- @@ -1259,31 +1282,33 @@ m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes +test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) - HPUX_IA64_MODE="32" + HPUX_IA64_MODE=32 ;; *ELF-64*) - HPUX_IA64_MODE="64" + HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then + if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" @@ -1312,9 +1337,46 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in @@ -1324,9 +1386,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) - LD="${LD-ld} -m elf_i386" + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac ;; - ppc64-*linux*|powerpc64-*linux*) + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -1345,7 +1417,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - ppc*-*linux*|powerpc*-*linux*) + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) @@ -1363,19 +1438,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" + SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then + if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" + CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in @@ -1383,7 +1459,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) case $lt_cv_prog_gnu_ld in yes*) case $host in - i?86-*-solaris*) + i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) @@ -1392,7 +1468,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" + LD=${LD-ld}_sol2 fi ;; *) @@ -1408,7 +1484,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac -need_locks="$enable_libtool_lock" +need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK @@ -1427,11 +1503,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -eq 0; then + if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -ne 0; then + if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi @@ -1439,7 +1515,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], ]) ]) -if test "x$lt_cv_ar_at_file" = xno; then +if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file @@ -1470,7 +1546,7 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in - openbsd*) + bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) @@ -1506,7 +1582,7 @@ AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins @@ -1533,7 +1609,7 @@ AC_CACHE_CHECK([$1], [$2], $RM conftest* ]) -if test x"[$]$2" = xyes; then +if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) @@ -1555,7 +1631,7 @@ AC_DEFUN([_LT_LINKER_OPTION], m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then @@ -1574,10 +1650,10 @@ AC_CACHE_CHECK([$1], [$2], fi fi $RM -r conftest* - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS ]) -if test x"[$]$2" = xyes; then +if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) @@ -1598,7 +1674,7 @@ AC_DEFUN([LT_CMD_MAX_LEN], AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 - teststring="ABCD" + teststring=ABCD case $build_os in msdosdjgpp*) @@ -1638,7 +1714,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=8192; ;; - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` @@ -1688,22 +1764,23 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do + for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough + test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring @@ -1719,7 +1796,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl ;; esac ]) -if test -n $lt_cv_sys_max_cmd_len ; then +if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) @@ -1747,7 +1824,7 @@ m4_defun([_LT_HEADER_DLFCN], # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "$cross_compiling" = yes; then : +if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -1794,9 +1871,9 @@ else # endif #endif -/* When -fvisbility=hidden is used, assume the code has been annotated +/* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif @@ -1822,7 +1899,7 @@ int main () return status; }] _LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in @@ -1843,7 +1920,7 @@ rm -fr conftest* # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then +if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown @@ -1853,44 +1930,52 @@ else case $host_os in beos*) - lt_cv_dlopen="load_add_on" + lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) - lt_cv_dlopen="dlopen" + lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) - # if libdl is installed we need to link against it + # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + *) AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], + [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], + [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) @@ -1899,21 +1984,21 @@ else ;; esac - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else + if test no = "$lt_cv_dlopen"; then enable_dlopen=no + else + enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - save_LIBS="$LIBS" + save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], @@ -1923,7 +2008,7 @@ else lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) - if test "x$lt_cv_dlopen_self" = xyes; then + if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl @@ -1933,9 +2018,9 @@ else ]) fi - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS ;; esac @@ -2027,8 +2112,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS], m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) -hard_links="nottested" -if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes @@ -2038,8 +2123,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else @@ -2066,8 +2151,8 @@ objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR @@ -2079,15 +2164,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH], _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. - if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else @@ -2101,12 +2186,12 @@ else fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi @@ -2130,7 +2215,7 @@ else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) - if test -n "$STRIP" ; then + if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) @@ -2148,6 +2233,47 @@ _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics @@ -2158,17 +2284,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in @@ -2187,8 +2314,8 @@ if test "$GCC" = yes; then # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - # ...but if some path already ends with the multilib dir we assume - # that all is fine and trust -print-search-dirs as is (GCC 4.2 or newer). + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= @@ -2203,16 +2330,16 @@ if test "$GCC" = yes; then fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; + lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } @@ -2226,7 +2353,7 @@ BEGIN {RS=" "; FS="/|\n";} { # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else @@ -2235,7 +2362,7 @@ fi]) library_names_spec= libname_spec='lib$name' soname_spec= -shrext_cmds=".so" +shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -2252,14 +2379,17 @@ hardcode_into_libs=no # flags to be left without arguments need_version=unknown +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' + soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) @@ -2267,41 +2397,91 @@ aix[[4-9]]*) need_lib_prefix=no need_version=no hardcode_into_libs=yes - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac shlibpath_var=LIBPATH fi ;; @@ -2311,18 +2491,18 @@ amigaos*) powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) - library_names_spec='${libname}${shared_ext}' + library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; @@ -2330,8 +2510,8 @@ beos*) bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" @@ -2343,7 +2523,7 @@ bsdi[[45]]*) cygwin* | mingw* | pw32* | cegcc*) version_type=windows - shrext_cmds=".dll" + shrext_cmds=.dll need_version=no need_lib_prefix=no @@ -2352,8 +2532,8 @@ cygwin* | mingw* | pw32* | cegcc*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ @@ -2369,17 +2549,17 @@ cygwin* | mingw* | pw32* | cegcc*) case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' @@ -2388,8 +2568,8 @@ m4_if([$1], [],[ *,cl*) # Native MSVC libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' case $build_os in mingw*) @@ -2416,7 +2596,7 @@ m4_if([$1], [],[ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) - sys_lib_search_path_spec="$LIB" + sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` @@ -2429,8 +2609,8 @@ m4_if([$1], [],[ esac # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' @@ -2443,7 +2623,7 @@ m4_if([$1], [],[ *) # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac @@ -2456,8 +2636,8 @@ darwin* | rhapsody*) version_type=darwin need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' @@ -2470,8 +2650,8 @@ dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; @@ -2489,12 +2669,13 @@ freebsd* | dragonfly*) version_type=freebsd-$objformat case $version_type in freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac @@ -2519,26 +2700,15 @@ freebsd* | dragonfly*) esac ;; -gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes + shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -2556,14 +2726,15 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -2571,8 +2742,8 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; @@ -2581,8 +2752,8 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... @@ -2595,8 +2766,8 @@ interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -2607,7 +2778,7 @@ irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) - if test "$lt_cv_prog_gnu_ld" = yes; then + if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix @@ -2615,8 +2786,8 @@ irix5* | irix6* | nonstopux*) esac need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= @@ -2635,8 +2806,8 @@ irix5* | irix6* | nonstopux*) esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; @@ -2645,13 +2816,33 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + # This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -2679,11 +2870,15 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu) # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" - # Append ld.so.conf contents to the search path + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" - fi # We used to test for /lib/ld.so.1 and disable shared libraries on @@ -2700,12 +2895,12 @@ netbsd*) need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH @@ -2715,7 +2910,7 @@ netbsd*) newsos6) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; @@ -2724,58 +2919,68 @@ newsos6) version_type=qnx need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; -openbsd*) +openbsd* | bitrig*) version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" + sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no else - shlibpath_overrides_runpath=yes + need_version=yes fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' - shrext_cmds=".dll" + version_type=windows + shrext_cmds=.dll + need_version=no need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) @@ -2786,8 +2991,8 @@ solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes @@ -2797,11 +3002,11 @@ solaris*) sunos4*) version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes @@ -2809,8 +3014,8 @@ sunos4*) sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) @@ -2831,24 +3036,24 @@ sysv4 | sysv4.3*) ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf + version_type=sco need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' @@ -2866,7 +3071,7 @@ tpf*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes @@ -2874,8 +3079,8 @@ tpf*) uts4*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; @@ -2884,20 +3089,30 @@ uts4*) ;; esac AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no +test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then +if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) @@ -2930,39 +3145,41 @@ _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- -# find a file program which can recognize shared library +# find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : @@ -2985,11 +3202,11 @@ _LT_EOF break fi done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else @@ -3007,7 +3224,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- -# find a file program which can recognize a shared library +# find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then @@ -3034,16 +3251,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], + [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld -if test "$GCC" = yes; then +if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw + # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; @@ -3057,7 +3274,7 @@ if test "$GCC" = yes; then while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done - test -z "$LD" && LD="$ac_prog" + test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. @@ -3068,37 +3285,37 @@ if test "$GCC" = yes; then with_gnu_ld=unknown ;; esac -elif test "$with_gnu_ld" = yes; then +elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" + lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies @@ -3184,13 +3438,13 @@ lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. +# 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) @@ -3217,8 +3471,7 @@ mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else @@ -3254,10 +3507,6 @@ freebsd* | dragonfly*) fi ;; -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - haiku*) lt_cv_deplibs_check_method=pass_all ;; @@ -3296,7 +3545,7 @@ irix5* | irix6* | nonstopux*) ;; # This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; @@ -3318,8 +3567,8 @@ newos6*) lt_cv_deplibs_check_method=pass_all ;; -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' @@ -3372,6 +3621,9 @@ sysv4 | sysv4.3*) tpf*) lt_cv_deplibs_check_method=pass_all ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; esac ]) @@ -3412,33 +3664,38 @@ AC_DEFUN([LT_PATH_NM], AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. - lt_cv_path_NM="$NM" + lt_cv_path_NM=$NM else - lt_nm_to_check="${ac_tool_prefix}nm" + lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" - break + break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" - break + break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but @@ -3449,21 +3706,21 @@ else esac fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) - DUMPBIN="$DUMPBIN -symbols" + DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: @@ -3471,8 +3728,8 @@ else esac fi AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" + if test : != "$DUMPBIN"; then + NM=$DUMPBIN fi fi test -z "$NM" && NM=nm @@ -3518,8 +3775,8 @@ lt_cv_sharedlib_from_linklib_cmd, case $host_os in cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib @@ -3531,7 +3788,7 @@ cygwin* | mingw* | pw32* | cegcc*) ;; *) # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" + lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) @@ -3558,13 +3815,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then +if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + # LT_LIB_M # -------- # check for math library @@ -3576,11 +3848,11 @@ case $host in # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) - AC_CHECK_LIB(m, cos, LIBM="-lm") + AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) @@ -3599,7 +3871,7 @@ m4_defun([_LT_COMPILER_NO_RTTI], _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; @@ -3651,7 +3923,7 @@ cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; @@ -3684,14 +3956,44 @@ case `$NM -V 2>&1` in symcode='[[ABCDGIRSTW]]' ;; esac +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= @@ -3709,21 +4011,24 @@ for ac_symprfx in "" "_"; do # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" @@ -3763,11 +4068,11 @@ _LT_EOF if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST -#elif defined(__osf__) +#elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else @@ -3793,7 +4098,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; @@ -3813,9 +4118,9 @@ _LT_EOF mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" + LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS @@ -3836,7 +4141,7 @@ _LT_EOF rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then + if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= @@ -3863,12 +4168,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS @@ -3884,17 +4193,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then + if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) @@ -3905,8 +4215,8 @@ m4_if([$1], [CXX], [ ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac @@ -3922,6 +4232,11 @@ m4_if([$1], [CXX], [ # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; darwin* | rhapsody*) # PIC is the default on this platform @@ -3971,7 +4286,7 @@ m4_if([$1], [CXX], [ case $host_os in aix[[4-9]]*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else @@ -4012,14 +4327,14 @@ m4_if([$1], [CXX], [ case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default @@ -4048,7 +4363,7 @@ m4_if([$1], [CXX], [ ;; esac ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler @@ -4056,7 +4371,7 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. + # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' @@ -4201,17 +4516,18 @@ m4_if([$1], [CXX], [ fi ], [ - if test "$GCC" = yes; then + if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) @@ -4222,8 +4538,8 @@ m4_if([$1], [CXX], [ ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac @@ -4240,6 +4556,11 @@ m4_if([$1], [CXX], [ # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; darwin* | rhapsody*) @@ -4310,7 +4631,7 @@ m4_if([$1], [CXX], [ case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else @@ -4318,11 +4639,30 @@ m4_if([$1], [CXX], [ fi ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; hpux9* | hpux10* | hpux11*) @@ -4338,7 +4678,7 @@ m4_if([$1], [CXX], [ ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) @@ -4347,9 +4687,9 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. + # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' @@ -4374,6 +4714,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) @@ -4471,7 +4817,7 @@ m4_if([$1], [CXX], [ ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi @@ -4500,7 +4846,7 @@ m4_if([$1], [CXX], [ fi ]) case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: + # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; @@ -4566,17 +4912,21 @@ m4_if([$1], [CXX], [ case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in @@ -4622,9 +4972,9 @@ m4_if([$1], [CXX], [ # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if @@ -4640,7 +4990,7 @@ dnl Note also adjust exclude_expsyms for C++ above. # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. - if test "$GCC" != yes; then + if test yes != "$GCC"; then with_gnu_ld=no fi ;; @@ -4648,7 +4998,7 @@ dnl Note also adjust exclude_expsyms for C++ above. # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; - openbsd*) + openbsd* | bitrig*) with_gnu_ld=no ;; esac @@ -4658,7 +5008,7 @@ dnl Note also adjust exclude_expsyms for C++ above. # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility @@ -4680,24 +5030,24 @@ dnl Note also adjust exclude_expsyms for C++ above. esac fi - if test "$lt_use_gnu_ld_interface" = yes; then + if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' + wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no - case `$LD -v 2>&1` in + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... @@ -4710,7 +5060,7 @@ dnl Note also adjust exclude_expsyms for C++ above. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then + if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 @@ -4729,7 +5079,7 @@ _LT_EOF case $host_cpu in powerpc) # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) @@ -4745,7 +5095,7 @@ _LT_EOF _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4755,7 +5105,7 @@ _LT_EOF # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes @@ -4763,61 +5113,89 @@ _LT_EOF _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no - if test "$host_os" = linux-dietlibc; then + if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no + && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; @@ -4828,42 +5206,47 @@ _LT_EOF lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac @@ -4877,8 +5260,8 @@ _LT_EOF _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; @@ -4896,8 +5279,8 @@ _LT_EOF _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4909,7 +5292,7 @@ _LT_EOF _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify @@ -4924,9 +5307,9 @@ _LT_EOF # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4943,15 +5326,15 @@ _LT_EOF *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= @@ -4967,7 +5350,7 @@ _LT_EOF # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported @@ -4975,34 +5358,57 @@ _LT_EOF ;; aix[[4-9]]*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' - no_entry_flag="" + no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi ;; esac @@ -5021,13 +5427,21 @@ _LT_EOF _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac - if test "$GCC" = yes; then + if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` + collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then @@ -5046,61 +5460,80 @@ _LT_EOF ;; esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else # not using gcc - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' else - shared_flag='${wl}-bM:SRE' + shared_flag='$wl-bM:SRE' fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' fi fi - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; @@ -5109,7 +5542,7 @@ _LT_EOF case $host_cpu in powerpc) # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) @@ -5139,16 +5572,17 @@ _LT_EOF # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes @@ -5157,18 +5591,18 @@ _LT_EOF # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' ;; *) # Assume MSVC wrapper @@ -5177,7 +5611,7 @@ _LT_EOF # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. @@ -5227,33 +5661,33 @@ _LT_EOF ;; hpux9*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes @@ -5261,25 +5695,25 @@ _LT_EOF ;; hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then + if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ @@ -5287,14 +5721,14 @@ _LT_EOF # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in @@ -5305,7 +5739,7 @@ _LT_EOF *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. @@ -5316,16 +5750,16 @@ _LT_EOF ;; irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], - [save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], @@ -5338,21 +5772,31 @@ _LT_EOF end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) - LDFLAGS="$save_LDFLAGS"]) - if test "$lt_cv_irix_exported_symbol" = yes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out @@ -5367,7 +5811,7 @@ _LT_EOF newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; @@ -5375,27 +5819,19 @@ _LT_EOF *nto* | *qnx*) ;; - openbsd*) + openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no @@ -5406,33 +5842,53 @@ _LT_EOF _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -5443,24 +5899,24 @@ _LT_EOF solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi @@ -5470,11 +5926,11 @@ _LT_EOF solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', + # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi @@ -5484,10 +5940,10 @@ _LT_EOF ;; sunos4*) - if test "x$host_vendor" = xsequent; then + if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi @@ -5536,43 +5992,43 @@ _LT_EOF ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not + # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; @@ -5587,17 +6043,17 @@ _LT_EOF ;; esac - if test x$host_vendor = xsni; then + if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld @@ -5614,7 +6070,7 @@ x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - if test "$enable_shared" = yes && test "$GCC" = yes; then + if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. @@ -5694,12 +6150,12 @@ _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the + "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR @@ -5740,10 +6196,10 @@ dnl [Compiler flag to generate thread safe objects]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. +# the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl -lt_save_CC="$CC" +lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. @@ -5783,18 +6239,18 @@ if test -n "$compiler"; then LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB - # Report which library types will actually be built + # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' @@ -5802,8 +6258,12 @@ if test -n "$compiler"; then ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -5811,13 +6271,13 @@ if test -n "$compiler"; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP -CC="$lt_save_CC" +CC=$lt_save_CC ])# _LT_LANG_C_CONFIG @@ -5825,14 +6285,14 @@ CC="$lt_save_CC" # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. +# the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes @@ -5874,7 +6334,7 @@ _LT_TAGVAR(objext, $1)=$objext # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then +if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" @@ -5916,35 +6376,35 @@ if test "$_lt_caught_CXX_error" != yes; then if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately - if test "$GXX" = yes; then + if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi - if test "$GXX" = yes; then + if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) - wlarc='${wl}' + wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi @@ -5980,18 +6440,30 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' - no_entry_flag="" + no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in @@ -6001,6 +6473,13 @@ if test "$_lt_caught_CXX_error" != yes; then ;; esac done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi ;; esac @@ -6019,13 +6498,21 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac - if test "$GXX" = yes; then + if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` + collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then @@ -6043,64 +6530,84 @@ if test "$_lt_caught_CXX_error" != yes; then fi esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else # not using gcc - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' else - shared_flag='${wl}-bM:SRE' + shared_flag='$wl-bM:SRE' fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' fi fi - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; @@ -6110,7 +6617,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -6138,57 +6645,58 @@ if test "$_lt_caught_CXX_error" != yes; then # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -6199,6 +6707,34 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_DARWIN_LINKER_FEATURES($1) ;; + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + dgux*) case $cc_basename in ec++*) @@ -6233,18 +6769,15 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=yes ;; - gnu*) - ;; - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default @@ -6256,7 +6789,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. @@ -6265,11 +6798,11 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no @@ -6279,15 +6812,15 @@ if test "$_lt_caught_CXX_error" != yes; then ;; hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi @@ -6313,13 +6846,13 @@ if test "$_lt_caught_CXX_error" != yes; then aCC*) case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists @@ -6330,20 +6863,20 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi @@ -6358,22 +6891,22 @@ if test "$_lt_caught_CXX_error" != yes; then interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is @@ -6382,22 +6915,22 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler @@ -6405,8 +6938,8 @@ if test "$_lt_caught_CXX_error" != yes; then # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. @@ -6415,10 +6948,10 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. @@ -6432,59 +6965,59 @@ if test "$_lt_caught_CXX_error" != yes; then # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -6498,18 +7031,18 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) @@ -6517,10 +7050,10 @@ if test "$_lt_caught_CXX_error" != yes; then *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on @@ -6578,22 +7111,17 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=yes ;; - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) + openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else @@ -6609,9 +7137,9 @@ if test "$_lt_caught_CXX_error" != yes; then # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using @@ -6629,17 +7157,17 @@ if test "$_lt_caught_CXX_error" != yes; then cxx*) case $host in osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac @@ -6654,21 +7182,21 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists @@ -6714,9 +7242,9 @@ if test "$_lt_caught_CXX_error" != yes; then # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -6724,7 +7252,7 @@ if test "$_lt_caught_CXX_error" != yes; then solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. + # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; @@ -6741,30 +7269,30 @@ if test "$_lt_caught_CXX_error" != yes; then ;; gcx*) # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else - # g++ 2.7 appears to require `-G' NOT `-shared' on this + # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when @@ -6772,11 +7300,11 @@ if test "$_lt_caught_CXX_error" != yes; then output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi @@ -6785,52 +7313,52 @@ if test "$_lt_caught_CXX_error" != yes; then ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not + # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" + '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" + '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; @@ -6861,10 +7389,10 @@ if test "$_lt_caught_CXX_error" != yes; then esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -6891,7 +7419,7 @@ if test "$_lt_caught_CXX_error" != yes; then lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes +fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG @@ -6913,13 +7441,14 @@ AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF + # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose @@ -7003,13 +7532,13 @@ if AC_TRY_EVAL(ac_compile); then pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in + case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. - if test $p = "-L" || - test $p = "-R"; then + if test x-L = "$p" || + test x-R = "$p"; then prev=$p continue fi @@ -7025,16 +7554,16 @@ if AC_TRY_EVAL(ac_compile); then case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in + if test no = "$pre_test_object_deps_done"; then + case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being @@ -7042,9 +7571,9 @@ if AC_TRY_EVAL(ac_compile); then esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" + _LT_TAGVAR(postdeps, $1)=$prev$p else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= @@ -7059,15 +7588,15 @@ if AC_TRY_EVAL(ac_compile); then continue fi - if test "$pre_test_object_deps_done" = no; then + if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" + _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" + _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi @@ -7098,51 +7627,6 @@ interix[[3-9]]*) _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; esac ]) @@ -7151,7 +7635,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) @@ -7171,10 +7655,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1], # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test "X$F77" = "Xno"; then +if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi @@ -7211,7 +7695,7 @@ _LT_TAGVAR(objext, $1)=$objext # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then +if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t @@ -7233,7 +7717,7 @@ if test "$_lt_disable_F77" != yes; then _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. - lt_save_CC="$CC" + lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} @@ -7247,21 +7731,25 @@ if test "$_lt_disable_F77" != yes; then AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -7269,11 +7757,11 @@ if test "$_lt_disable_F77" != yes; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) - _LT_TAGVAR(GCC, $1)="$G77" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -7290,9 +7778,9 @@ if test "$_lt_disable_F77" != yes; then fi # test -n "$compiler" GCC=$lt_save_GCC - CC="$lt_save_CC" - CFLAGS="$lt_save_CFLAGS" -fi # test "$_lt_disable_F77" != yes + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG @@ -7302,11 +7790,11 @@ AC_LANG_POP # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) -if test -z "$FC" || test "X$FC" = "Xno"; then +if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi @@ -7343,7 +7831,7 @@ _LT_TAGVAR(objext, $1)=$objext # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then +if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t @@ -7365,7 +7853,7 @@ if test "$_lt_disable_FC" != yes; then _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. - lt_save_CC="$CC" + lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} @@ -7381,21 +7869,25 @@ if test "$_lt_disable_FC" != yes; then AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -7403,11 +7895,11 @@ if test "$_lt_disable_FC" != yes; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -7427,7 +7919,7 @@ if test "$_lt_disable_FC" != yes; then GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS -fi # test "$_lt_disable_FC" != yes +fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG @@ -7437,7 +7929,7 @@ AC_LANG_POP # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE @@ -7471,7 +7963,7 @@ CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" +_LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. @@ -7508,7 +8000,7 @@ CFLAGS=$lt_save_CFLAGS # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE @@ -7542,7 +8034,7 @@ CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" +_LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. @@ -7579,7 +8071,7 @@ CFLAGS=$lt_save_CFLAGS # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE @@ -7595,7 +8087,7 @@ _LT_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" +lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER @@ -7605,7 +8097,7 @@ _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. -lt_save_CC="$CC" +lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= @@ -7634,7 +8126,7 @@ AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) @@ -7745,7 +8237,7 @@ lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue + test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in @@ -7762,9 +8254,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break + test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then + if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi @@ -7788,27 +8280,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], []) # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false @@ -7832,102 +8304,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES -# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) -# ------------------------------------------------------ -# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and -# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. -m4_defun([_LT_PROG_FUNCTION_REPLACE], -[dnl { -sed -e '/^$1 ()$/,/^} # $1 /c\ -$1 ()\ -{\ -m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) -} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: -]) - - -# _LT_PROG_REPLACE_SHELLFNS -# ------------------------- -# Replace existing portable implementations of several shell functions with -# equivalent extended shell implementations where those features are available.. -m4_defun([_LT_PROG_REPLACE_SHELLFNS], -[if test x"$xsi_shell" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl - func_split_long_opt_name=${1%%=*} - func_split_long_opt_arg=${1#*=}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) - - _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) - - _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) - - _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) -fi - -if test x"$lt_shell_append" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) - - _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl - func_quote_for_eval "${2}" -dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ - eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) -fi -]) - # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- -# Determine which file name conversion functions should be used by +# Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], diff --git a/external/opusfile-0.10/m4/ltoptions.m4 b/external/opus-1.3.1/m4/ltoptions.m4 similarity index 100% rename from external/opusfile-0.10/m4/ltoptions.m4 rename to external/opus-1.3.1/m4/ltoptions.m4 diff --git a/external/opusfile-0.10/m4/ltsugar.m4 b/external/opus-1.3.1/m4/ltsugar.m4 similarity index 100% rename from external/opusfile-0.10/m4/ltsugar.m4 rename to external/opus-1.3.1/m4/ltsugar.m4 diff --git a/external/opusfile-0.10/m4/ltversion.m4 b/external/opus-1.3.1/m4/ltversion.m4 similarity index 100% rename from external/opusfile-0.10/m4/ltversion.m4 rename to external/opus-1.3.1/m4/ltversion.m4 diff --git a/external/opusfile-0.10/m4/lt~obsolete.m4 b/external/opus-1.3.1/m4/lt~obsolete.m4 similarity index 100% rename from external/opusfile-0.10/m4/lt~obsolete.m4 rename to external/opus-1.3.1/m4/lt~obsolete.m4 diff --git a/external/opus-1.3.1/m4/opus-intrinsics.m4 b/external/opus-1.3.1/m4/opus-intrinsics.m4 new file mode 100644 index 00000000..a262ca18 --- /dev/null +++ b/external/opus-1.3.1/m4/opus-intrinsics.m4 @@ -0,0 +1,29 @@ +dnl opus-intrinsics.m4 +dnl macro for testing for support for compiler intrinsics, either by default or with a compiler flag + +dnl OPUS_CHECK_INTRINSICS(NAME-OF-INTRINSICS, COMPILER-FLAG-FOR-INTRINSICS, VAR-IF-PRESENT, VAR-IF-DEFAULT, TEST-PROGRAM-HEADER, TEST-PROGRAM-BODY) +AC_DEFUN([OPUS_CHECK_INTRINSICS], +[ + AC_MSG_CHECKING([if compiler supports $1 intrinsics]) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM($5, $6)], + [ + $3=1 + $4=1 + AC_MSG_RESULT([yes]) + ],[ + $4=0 + AC_MSG_RESULT([no]) + AC_MSG_CHECKING([if compiler supports $1 intrinsics with $2]) + save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $2" + AC_LINK_IFELSE([AC_LANG_PROGRAM($5, $6)], + [ + AC_MSG_RESULT([yes]) + $3=1 + ],[ + AC_MSG_RESULT([no]) + $3=0 + ]) + CFLAGS="$save_CFLAGS" + ]) +]) diff --git a/external/opusfile-0.10/missing b/external/opus-1.3.1/missing similarity index 98% rename from external/opusfile-0.10/missing rename to external/opus-1.3.1/missing index f62bbae3..c6e37958 100755 --- a/external/opusfile-0.10/missing +++ b/external/opus-1.3.1/missing @@ -1,9 +1,9 @@ #! /bin/sh # Common wrapper for a few potentially missing GNU programs. -scriptversion=2013-10-28.13; # UTC +scriptversion=2016-01-11.22; # UTC -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify @@ -210,6 +210,6 @@ exit $st # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/external/opus-1.0.3/opus-uninstalled.pc.in b/external/opus-1.3.1/opus-uninstalled.pc.in similarity index 88% rename from external/opus-1.0.3/opus-uninstalled.pc.in rename to external/opus-1.3.1/opus-uninstalled.pc.in index 36e8db6a..19f5c933 100644 --- a/external/opus-1.0.3/opus-uninstalled.pc.in +++ b/external/opus-1.3.1/opus-uninstalled.pc.in @@ -8,5 +8,5 @@ Description: Opus IETF audio codec (not installed, @PC_BUILD@) Version: @VERSION@ Requires: Conflicts: -Libs: ${libdir}/libopus.a @PC_LIBM@ +Libs: ${libdir}/libopus.la @LIBM@ Cflags: -I${pcfiledir}/@top_srcdir@/include diff --git a/external/opus-1.0.3/opus.m4 b/external/opus-1.3.1/opus.m4 similarity index 100% rename from external/opus-1.0.3/opus.m4 rename to external/opus-1.3.1/opus.m4 diff --git a/external/opus-1.0.3/opus.pc.in b/external/opus-1.3.1/opus.pc.in similarity index 85% rename from external/opus-1.0.3/opus.pc.in rename to external/opus-1.3.1/opus.pc.in index b7d40838..6946e7de 100644 --- a/external/opus-1.0.3/opus.pc.in +++ b/external/opus-1.3.1/opus.pc.in @@ -7,10 +7,10 @@ includedir=@includedir@ Name: Opus Description: Opus IETF audio codec (@PC_BUILD@ build) -URL: http://opus-codec.org/ +URL: https://opus-codec.org/ Version: @VERSION@ Requires: Conflicts: Libs: -L${libdir} -lopus -Libs.private: @PC_LIBM@ +Libs.private: @LIBM@ Cflags: -I${includedir}/opus diff --git a/external/opus-1.3.1/opus_buildtype.cmake b/external/opus-1.3.1/opus_buildtype.cmake new file mode 100644 index 00000000..aaee9eff --- /dev/null +++ b/external/opus-1.3.1/opus_buildtype.cmake @@ -0,0 +1,23 @@ +# Set a default build type if none was specified + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + if(CMAKE_C_FLAGS) + message(STATUS "CMAKE_C_FLAGS: " ${CMAKE_C_FLAGS}) + else() + set(default_build_type "Release") + message( + STATUS + "Setting build type to '${default_build_type}' as none was specified and no CFLAGS was exported." + ) + set(CMAKE_BUILD_TYPE "${default_build_type}" + CACHE STRING "Choose the type of build." + FORCE) + # Set the possible values of build type for cmake-gui + set_property(CACHE CMAKE_BUILD_TYPE + PROPERTY STRINGS + "Debug" + "Release" + "MinSizeRel" + "RelWithDebInfo") + endif() +endif() diff --git a/external/opus-1.3.1/opus_config.cmake b/external/opus-1.3.1/opus_config.cmake new file mode 100644 index 00000000..a0bfd583 --- /dev/null +++ b/external/opus-1.3.1/opus_config.cmake @@ -0,0 +1,43 @@ +include(opus_functions.cmake) + +configure_file(config.h.cmake.in config.h @ONLY) +add_definitions(-DHAVE_CONFIG_H) + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set_property(GLOBAL PROPERTY C_STANDARD 99) + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +include(CheckLibraryExists) +check_library_exists(m floor "" HAVE_LIBM) +if(HAVE_LIBM) + list(APPEND OPUS_REQUIRED_LIBRARIES m) +endif() + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "(i[0-9]86|x86|X86|amd64|AMD64|x86_64)") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(OPUS_CPU_X64 1) + else() + set(OPUS_CPU_X86 1) + endif() +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm") + set(OPUS_CPU_ARM 1) +endif() + +opus_supports_cpu_detection(RUNTIME_CPU_CAPABILITY_DETECTION) + +if(OPUS_CPU_X86 OR OPUS_CPU_X64) + opus_detect_sse(COMPILER_SUPPORT_SIMD) +elseif(OPUS_CPU_ARM) + opus_detect_neon(COMPILER_SUPPORT_NEON) + if(COMPILER_SUPPORT_NEON) + option(OPUS_USE_NEON "Option to turn off SSE" ON) + option(OPUS_MAY_SUPPORT_NEON "Does runtime check for neon support" ON) + option(OPUS_PRESUME_NEON "Assume target CPU has NEON support" OFF) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + set(OPUS_PRESUME_NEON ON) + endif() + endif() +endif() diff --git a/external/opus-1.3.1/opus_functions.cmake b/external/opus-1.3.1/opus_functions.cmake new file mode 100644 index 00000000..fe309c2c --- /dev/null +++ b/external/opus-1.3.1/opus_functions.cmake @@ -0,0 +1,262 @@ +#[[Cmake helper function to parse source files from make files +this is to avoid breaking existing make and auto make support +but still have the option to use CMake with only lists at one place]] + +cmake_minimum_required(VERSION 3.1) + +function(get_library_version OPUS_LIBRARY_VERSION OPUS_LIBRARY_VERSION_MAJOR) + file(STRINGS configure.ac opus_lt_current_string + LIMIT_COUNT 1 + REGEX "OPUS_LT_CURRENT=") + string(REGEX MATCH + "OPUS_LT_CURRENT=([0-9]*)" + _ + ${opus_lt_current_string}) + set(OPUS_LT_CURRENT ${CMAKE_MATCH_1}) + + file(STRINGS configure.ac opus_lt_revision_string + LIMIT_COUNT 1 + REGEX "OPUS_LT_REVISION=") + string(REGEX MATCH + "OPUS_LT_REVISION=([0-9]*)" + _ + ${opus_lt_revision_string}) + set(OPUS_LT_REVISION ${CMAKE_MATCH_1}) + + file(STRINGS configure.ac opus_lt_age_string + LIMIT_COUNT 1 + REGEX "OPUS_LT_AGE=") + string(REGEX MATCH + "OPUS_LT_AGE=([0-9]*)" + _ + ${opus_lt_age_string}) + set(OPUS_LT_AGE ${CMAKE_MATCH_1}) + + math(EXPR OPUS_LIBRARY_VERSION_MAJOR "${OPUS_LT_CURRENT} - ${OPUS_LT_AGE}") + set(OPUS_LIBRARY_VERSION_MINOR ${OPUS_LT_AGE}) + set(OPUS_LIBRARY_VERSION_PATCH ${OPUS_LT_REVISION}) + set( + OPUS_LIBRARY_VERSION + "${OPUS_LIBRARY_VERSION_MAJOR}.${OPUS_LIBRARY_VERSION_MINOR}.${OPUS_LIBRARY_VERSION_PATCH}" + PARENT_SCOPE) + set(OPUS_LIBRARY_VERSION_MAJOR ${OPUS_LIBRARY_VERSION_MAJOR} PARENT_SCOPE) +endfunction() + +function(get_package_version PACKAGE_VERSION) + find_package(Git) + if(GIT_FOUND) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --match "v*" + OUTPUT_VARIABLE OPUS_PACKAGE_VERSION) + if(OPUS_PACKAGE_VERSION) + string(STRIP ${OPUS_PACKAGE_VERSION}, OPUS_PACKAGE_VERSION) + string(REPLACE \n + "" + OPUS_PACKAGE_VERSION + ${OPUS_PACKAGE_VERSION}) + string(REPLACE , + "" + OPUS_PACKAGE_VERSION + ${OPUS_PACKAGE_VERSION}) + + string(SUBSTRING ${OPUS_PACKAGE_VERSION} + 1 + -1 + OPUS_PACKAGE_VERSION) + set(PACKAGE_VERSION ${OPUS_PACKAGE_VERSION} PARENT_SCOPE) + return() + endif() + endif() + + if(EXISTS "${CMAKE_SOURCE_DIR}/package_version") + # Not a git repo, lets' try to parse it from package_version file if exists + file(STRINGS package_version opus_package_version_string + LIMIT_COUNT 1 + REGEX "PACKAGE_VERSION=") + string(REPLACE "PACKAGE_VERSION=" + "" + opus_package_version_string + ${opus_package_version_string}) + string(REPLACE "\"" + "" + opus_package_version_string + ${opus_package_version_string}) + set(PACKAGE_VERSION ${opus_package_version_string} PARENT_SCOPE) + return() + endif() + + # if all else fails set to 0 + set(PACKAGE_VERSION 0 PARENT_SCOPE) +endfunction() + +function(check_and_set_flag NAME FLAG) + include(CheckCCompilerFlag) + check_c_compiler_flag(${FLAG} ${NAME}_SUPPORTED) + if(${NAME}_SUPPORTED) + add_definitions(${FLAG}) + endif() +endfunction() + +function(check_flag NAME FLAG) + include(CheckCCompilerFlag) + check_c_compiler_flag(${FLAG} ${NAME}_SUPPORTED) +endfunction() + +include(CheckIncludeFile) +# function to check if compiler supports SSE, SSE2, SSE4.1 and AVX if target +# systems may not have SSE support then use OPUS_MAY_HAVE_SSE option if target +# system is guaranteed to have SSE support then OPUS_PRESUME_SSE can be used to +# skip SSE runtime check +function(opus_detect_sse COMPILER_SUPPORT_SIMD) + message(STATUS "Check SIMD support by compiler") + check_include_file(xmmintrin.h HAVE_XMMINTRIN_H) # SSE1 + if(HAVE_XMMINTRIN_H) + if(MSVC) + # different arch options for 32 and 64 bit target for MSVC + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + check_flag(SSE1 /arch:SSE) + else() + set(SSE1_SUPPORTED 1 PARENT_SCOPE) + endif() + else() + check_and_set_flag(SSE1 -msse) + endif() + else() + set(SSE1_SUPPORTED 0 PARENT_SCOPE) + endif() + + check_include_file(emmintrin.h HAVE_EMMINTRIN_H) # SSE2 + if(HAVE_EMMINTRIN_H) + if(MSVC) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + check_flag(SSE2 /arch:SSE2) + else() + set(SSE2_SUPPORTED 1 PARENT_SCOPE) + endif() + else() + check_and_set_flag(SSE2 -msse2) + endif() + else() + set(SSE2_SUPPORTED 0 PARENT_SCOPE) + endif() + + check_include_file(smmintrin.h HAVE_SMMINTRIN_H) # SSE4.1 + if(HAVE_SMMINTRIN_H) + if(MSVC) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + check_flag(SSE4_1 /arch:SSE2) # SSE2 and above + else() + set(SSE4_1_SUPPORTED 1 PARENT_SCOPE) + endif() + else() + check_and_set_flag(SSE4_1 -msse4.1) + endif() + else() + set(SSE4_1_SUPPORTED 0 PARENT_SCOPE) + endif() + + check_include_file(immintrin.h HAVE_IMMINTRIN_H) # AVX + if(HAVE_IMMINTRIN_H) + if(MSVC) + check_flag(AVX /arch:AVX) + else() + check_and_set_flag(AVX -mavx) + endif() + else() + set(AVX_SUPPORTED 0 PARENT_SCOPE) + endif() + + if(MSVC) # To avoid warning D9025 of overriding compiler options + if(AVX_SUPPORTED) # on 64 bit and 32 bits + add_definitions(/arch:AVX) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) # if AVX not supported then set SSE flag + if(SSE4_1_SUPPORTED OR SSE2_SUPPORTED) + add_definitions(/arch:SSE2) + elseif(SSE1_SUPPORTED) + add_definitions(/arch:SSE) + endif() + endif() + endif() + + if(SSE1_SUPPORTED OR SSE2_SUPPORTED OR SSE4_1_SUPPORTED OR AVX_SUPPORTED) + set(COMPILER_SUPPORT_SIMD 1 PARENT_SCOPE) + else() + message(STATUS "No SIMD support in compiler") + endif() +endfunction() + +function(opus_detect_neon COMPILER_SUPPORT_NEON) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "(armv7-a|aarch64)") + message(STATUS "Check NEON support by compiler") + check_include_file(arm_neon.h HAVE_ARM_NEON_H) + if(HAVE_ARM_NEON_H) + set(COMPILER_SUPPORT_NEON ${HAVE_ARM_NEON_H} PARENT_SCOPE) + endif() + endif() +endfunction() + +function(opus_supports_cpu_detection RUNTIME_CPU_CAPABILITY_DETECTION) + if(MSVC) + check_include_file(intrin.h HAVE_INTRIN_H) + else() + check_include_file(cpuid.h HAVE_CPUID_H) + endif() + if(HAVE_INTRIN_H OR HAVE_CPUID_H) + set(RUNTIME_CPU_CAPABILITY_DETECTION 1 PARENT_SCOPE) + else() + set(RUNTIME_CPU_CAPABILITY_DETECTION 0 PARENT_SCOPE) + endif() +endfunction() + +function(add_sources_group target group) + target_sources(${target} PRIVATE ${ARGN}) + source_group(${group} FILES ${ARGN}) +endfunction() + +function(get_opus_sources SOURCE_GROUP MAKE_FILE SOURCES) + # read file, each item in list is one group + file(STRINGS ${MAKE_FILE} opus_sources) + + # add wildcard for regex match + string(CONCAT SOURCE_GROUP ${SOURCE_GROUP} ".*$") + + # find group + foreach(val IN LISTS opus_sources) + if(val MATCHES ${SOURCE_GROUP}) + list(LENGTH val list_length) + if(${list_length} EQUAL 1) + # for tests split by '=' and clean up the rest into a list + string(FIND ${val} "=" index) + math(EXPR index "${index} + 1") + string(SUBSTRING ${val} + ${index} + -1 + sources) + string(REPLACE " " + ";" + sources + ${sources}) + else() + # discard the group + list(REMOVE_AT val 0) + set(sources ${val}) + endif() + break() + endif() + endforeach() + + list(LENGTH sources list_length) + if(${list_length} LESS 1) + message( + FATAL_ERROR + "No files parsed succesfully from ${SOURCE_GROUP} in ${MAKE_FILE}") + endif() + + # remove trailing whitespaces + set(list_var "") + foreach(source ${sources}) + string(STRIP "${source}" source) + list(APPEND list_var "${source}") + endforeach() + + set(${SOURCES} ${list_var} PARENT_SCOPE) +endfunction() diff --git a/external/opus-1.3.1/opus_headers.mk b/external/opus-1.3.1/opus_headers.mk new file mode 100644 index 00000000..27596f2a --- /dev/null +++ b/external/opus-1.3.1/opus_headers.mk @@ -0,0 +1,9 @@ +OPUS_HEAD = \ +include/opus.h \ +include/opus_multistream.h \ +include/opus_projection.h \ +src/opus_private.h \ +src/analysis.h \ +src/mapping_matrix.h \ +src/mlp.h \ +src/tansig_table.h diff --git a/external/opus-1.3.1/opus_sources.cmake b/external/opus-1.3.1/opus_sources.cmake new file mode 100644 index 00000000..225543af --- /dev/null +++ b/external/opus-1.3.1/opus_sources.cmake @@ -0,0 +1,38 @@ +include(opus_functions.cmake) + +get_opus_sources(SILK_SOURCES silk_sources.mk silk_sources) +get_opus_sources(SILK_SOURCES_FLOAT silk_sources.mk silk_sources_float) +get_opus_sources(SILK_SOURCES_FIXED silk_sources.mk silk_sources_fixed) +get_opus_sources(SILK_SOURCES_SSE4_1 silk_sources.mk silk_sources_sse4_1) +get_opus_sources(SILK_SOURCES_FIXED_SSE4_1 silk_sources.mk + silk_sources_fixed_sse4_1) +get_opus_sources(SILK_SOURCES_ARM_NEON_INTR silk_sources.mk + silk_sources_arm_neon_intr) +get_opus_sources(SILK_SOURCES_FIXED_ARM_NEON_INTR silk_sources.mk + silk_sources_fixed_arm_neon_intr) + +get_opus_sources(OPUS_SOURCES opus_sources.mk opus_sources) +get_opus_sources(OPUS_SOURCES_FLOAT opus_sources.mk opus_sources_float) + +get_opus_sources(CELT_SOURCES celt_sources.mk celt_sources) +get_opus_sources(CELT_SOURCES_SSE celt_sources.mk celt_sources_sse) +get_opus_sources(CELT_SOURCES_SSE2 celt_sources.mk celt_sources_sse2) +get_opus_sources(CELT_SOURCES_SSE4_1 celt_sources.mk celt_sources_sse4_1) +get_opus_sources(CELT_SOURCES_ARM celt_sources.mk celt_sources_arm) +get_opus_sources(CELT_SOURCES_ARM_ASM celt_sources.mk celt_sources_arm_asm) +get_opus_sources(CELT_AM_SOURCES_ARM_ASM celt_sources.mk + celt_am_sources_arm_asm) +get_opus_sources(CELT_SOURCES_ARM_NEON_INTR celt_sources.mk + celt_sources_arm_neon_intr) +get_opus_sources(CELT_SOURCES_ARM_NE10 celt_sources.mk celt_sources_arm_ne10) + +get_opus_sources(opus_demo_SOURCES Makefile.am opus_demo_sources) +get_opus_sources(opus_custom_demo_SOURCES Makefile.am opus_custom_demo_sources) +get_opus_sources(opus_compare_SOURCES Makefile.am opus_compare_sources) +get_opus_sources(tests_test_opus_api_SOURCES Makefile.am test_opus_api_sources) +get_opus_sources(tests_test_opus_encode_SOURCES Makefile.am + test_opus_encode_sources) +get_opus_sources(tests_test_opus_decode_SOURCES Makefile.am + test_opus_decode_sources) +get_opus_sources(tests_test_opus_padding_SOURCES Makefile.am + test_opus_padding_sources) diff --git a/external/opus-1.3.1/opus_sources.mk b/external/opus-1.3.1/opus_sources.mk new file mode 100644 index 00000000..44153b57 --- /dev/null +++ b/external/opus-1.3.1/opus_sources.mk @@ -0,0 +1,16 @@ +OPUS_SOURCES = \ +src/opus.c \ +src/opus_decoder.c \ +src/opus_encoder.c \ +src/opus_multistream.c \ +src/opus_multistream_encoder.c \ +src/opus_multistream_decoder.c \ +src/repacketizer.c \ +src/opus_projection_encoder.c \ +src/opus_projection_decoder.c \ +src/mapping_matrix.c + +OPUS_SOURCES_FLOAT = \ +src/analysis.c \ +src/mlp.c \ +src/mlp_data.c diff --git a/external/opus-1.3.1/package_version b/external/opus-1.3.1/package_version new file mode 100644 index 00000000..2b1720b8 --- /dev/null +++ b/external/opus-1.3.1/package_version @@ -0,0 +1 @@ +PACKAGE_VERSION="1.3.1" diff --git a/external/opus-1.0.3/silk/A2NLSF.c b/external/opus-1.3.1/silk/A2NLSF.c similarity index 90% rename from external/opus-1.0.3/silk/A2NLSF.c rename to external/opus-1.3.1/silk/A2NLSF.c index 49d5d9d9..b487686f 100644 --- a/external/opus-1.0.3/silk/A2NLSF.c +++ b/external/opus-1.3.1/silk/A2NLSF.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -40,11 +40,11 @@ POSSIBILITY OF SUCH DAMAGE. /* Number of binary divisions, when not in low complexity mode */ #define BIN_DIV_STEPS_A2NLSF_FIX 3 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */ -#define MAX_ITERATIONS_A2NLSF_FIX 30 +#define MAX_ITERATIONS_A2NLSF_FIX 16 /* Helper function for A2NLSF(..) */ /* Transforms polynomials from cos(n*f) to cos(f)^n */ -static inline void silk_A2NLSF_trans_poly( +static OPUS_INLINE void silk_A2NLSF_trans_poly( opus_int32 *p, /* I/O Polynomial */ const opus_int dd /* I Polynomial order (= filter order / 2 ) */ ) @@ -60,7 +60,7 @@ static inline void silk_A2NLSF_trans_poly( } /* Helper function for A2NLSF(..) */ /* Polynomial evaluation */ -static inline opus_int32 silk_A2NLSF_eval_poly( /* return the polynomial evaluation, in Q16 */ +static OPUS_INLINE opus_int32 silk_A2NLSF_eval_poly( /* return the polynomial evaluation, in Q16 */ opus_int32 *p, /* I Polynomial, Q16 */ const opus_int32 x, /* I Evaluation point, Q12 */ const opus_int dd /* I Order */ @@ -71,13 +71,28 @@ static inline opus_int32 silk_A2NLSF_eval_poly( /* return the polynomial evaluat y32 = p[ dd ]; /* Q16 */ x_Q16 = silk_LSHIFT( x, 4 ); - for( n = dd - 1; n >= 0; n-- ) { - y32 = silk_SMLAWW( p[ n ], y32, x_Q16 ); /* Q16 */ + + if ( opus_likely( 8 == dd ) ) + { + y32 = silk_SMLAWW( p[ 7 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 6 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 5 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 4 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 3 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 2 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 1 ], y32, x_Q16 ); + y32 = silk_SMLAWW( p[ 0 ], y32, x_Q16 ); + } + else + { + for( n = dd - 1; n >= 0; n-- ) { + y32 = silk_SMLAWW( p[ n ], y32, x_Q16 ); /* Q16 */ + } } return y32; } -static inline void silk_A2NLSF_init( +static OPUS_INLINE void silk_A2NLSF_init( const opus_int32 *a_Q16, opus_int32 *P, opus_int32 *Q, @@ -115,7 +130,7 @@ void silk_A2NLSF( const opus_int d /* I Filter order (must be even) */ ) { - opus_int i, k, m, dd, root_ix, ffrac; + opus_int i, k, m, dd, root_ix, ffrac; opus_int32 xlo, xhi, xmid; opus_int32 ylo, yhi, ymid, thr; opus_int32 nom, den; @@ -224,13 +239,13 @@ void silk_A2NLSF( /* Set NLSFs to white spectrum and exit */ NLSF[ 0 ] = (opus_int16)silk_DIV32_16( 1 << 15, d + 1 ); for( k = 1; k < d; k++ ) { - NLSF[ k ] = (opus_int16)silk_SMULBB( k + 1, NLSF[ 0 ] ); + NLSF[ k ] = (opus_int16)silk_ADD16( NLSF[ k-1 ], NLSF[ 0 ] ); } return; } /* Error: Apply progressively more bandwidth expansion and run again */ - silk_bwexpander_32( a_Q16, d, 65536 - silk_SMULBB( 10 + i, i ) ); /* 10_Q16 = 0.00015*/ + silk_bwexpander_32( a_Q16, d, 65536 - silk_LSHIFT( 1, i ) ); silk_A2NLSF_init( a_Q16, P, Q, dd ); p = P; /* Pointer to polynomial */ diff --git a/external/opus-1.0.3/silk/API.h b/external/opus-1.3.1/silk/API.h similarity index 93% rename from external/opus-1.0.3/silk/API.h rename to external/opus-1.3.1/silk/API.h index 4b8ca12a..4d90ff9a 100644 --- a/external/opus-1.0.3/silk/API.h +++ b/external/opus-1.3.1/silk/API.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -64,6 +64,7 @@ opus_int silk_Get_Encoder_Size( /* O Returns error co /*************************/ opus_int silk_InitEncoder( /* O Returns error code */ void *encState, /* I/O State */ + int arch, /* I Run-time architecture */ silk_EncControlStruct *encStatus /* O Encoder Status */ ); @@ -79,7 +80,8 @@ opus_int silk_Encode( /* O Returns error co opus_int nSamplesIn, /* I Number of samples in input vector */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */ - const opus_int prefillFlag /* I Flag to indicate prefilling buffers no coding */ + const opus_int prefillFlag, /* I Flag to indicate prefilling buffers no coding */ + int activity /* I Decision of Opus voice activity detector */ ); /****************************************/ @@ -110,7 +112,8 @@ opus_int silk_Decode( /* O Returns error co opus_int newPacketFlag, /* I Indicates first decoder call for this packet */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 *samplesOut, /* O Decoded output speech vector */ - opus_int32 *nSamplesOut /* O Number of samples decoded */ + opus_int32 *nSamplesOut, /* O Number of samples decoded */ + int arch /* I Run-time architecture */ ); #if 0 diff --git a/external/opus-1.0.3/silk/CNG.c b/external/opus-1.3.1/silk/CNG.c similarity index 62% rename from external/opus-1.0.3/silk/CNG.c rename to external/opus-1.3.1/silk/CNG.c index 45734bdf..ef8e38df 100644 --- a/external/opus-1.0.3/silk/CNG.c +++ b/external/opus-1.3.1/silk/CNG.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,12 +30,12 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main.h" +#include "stack_alloc.h" /* Generates excitation for CNG LPC synthesis */ -static inline void silk_CNG_exc( - opus_int32 exc_Q10[], /* O CNG excitation signal Q10 */ +static OPUS_INLINE void silk_CNG_exc( + opus_int32 exc_Q14[], /* O CNG excitation signal Q10 */ opus_int32 exc_buf_Q14[], /* I Random samples buffer Q10 */ - opus_int32 Gain_Q16, /* I Gain to apply */ opus_int length, /* I Length */ opus_int32 *rand_seed /* I/O Seed to random index generator */ ) @@ -54,7 +54,7 @@ static inline void silk_CNG_exc( idx = (opus_int)( silk_RSHIFT( seed, 24 ) & exc_mask ); silk_assert( idx >= 0 ); silk_assert( idx <= CNG_BUF_MASK_MAX ); - exc_Q10[ i ] = (opus_int16)silk_SAT16( silk_SMULWW( exc_buf_Q14[ idx ], Gain_Q16 >> 4 ) ); + exc_Q14[ i ] = exc_buf_Q14[ idx ]; } *rand_seed = seed; } @@ -84,10 +84,10 @@ void silk_CNG( ) { opus_int i, subfr; - opus_int32 sum_Q6, max_Gain_Q16, gain_Q16; + opus_int32 LPC_pred_Q10, max_Gain_Q16, gain_Q16, gain_Q10; opus_int16 A_Q12[ MAX_LPC_ORDER ]; - opus_int32 CNG_sig_Q10[ MAX_FRAME_LENGTH + MAX_LPC_ORDER ]; silk_CNG_struct *psCNG = &psDec->sCNG; + SAVE_STACK; if( psDec->fs_kHz != psCNG->fs_kHz ) { /* Reset state */ @@ -123,55 +123,62 @@ void silk_CNG( /* Add CNG when packet is lost or during DTX */ if( psDec->lossCnt ) { + VARDECL( opus_int32, CNG_sig_Q14 ); + ALLOC( CNG_sig_Q14, length + MAX_LPC_ORDER, opus_int32 ); /* Generate CNG excitation */ - gain_Q16 = silk_SMULWW( psDec->sPLC.randScale_Q14, psDec->sPLC.prevGain_Q16[1] ); - if( gain_Q16 >= (1 << 21) || psCNG->CNG_smth_Gain_Q16 > (1 << 23) ) { - gain_Q16 = silk_SMULTT( gain_Q16, gain_Q16 ); - gain_Q16 = silk_SUB_LSHIFT32(silk_SMULTT( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); - gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 16 ); - } else { - gain_Q16 = silk_SMULWW( gain_Q16, gain_Q16 ); - gain_Q16 = silk_SUB_LSHIFT32(silk_SMULWW( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); - gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 8 ); - } - silk_CNG_exc( CNG_sig_Q10 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, gain_Q16, length, &psCNG->rand_seed ); + gain_Q16 = silk_SMULWW( psDec->sPLC.randScale_Q14, psDec->sPLC.prevGain_Q16[1] ); + if( gain_Q16 >= (1 << 21) || psCNG->CNG_smth_Gain_Q16 > (1 << 23) ) { + gain_Q16 = silk_SMULTT( gain_Q16, gain_Q16 ); + gain_Q16 = silk_SUB_LSHIFT32(silk_SMULTT( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); + gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 16 ); + } else { + gain_Q16 = silk_SMULWW( gain_Q16, gain_Q16 ); + gain_Q16 = silk_SUB_LSHIFT32(silk_SMULWW( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); + gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 8 ); + } + gain_Q10 = silk_RSHIFT( gain_Q16, 6 ); + + silk_CNG_exc( CNG_sig_Q14 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, length, &psCNG->rand_seed ); /* Convert CNG NLSF to filter representation */ - silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order ); + silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order, psDec->arch ); /* Generate CNG signal, by synthesis filtering */ - silk_memcpy( CNG_sig_Q10, psCNG->CNG_synth_state, MAX_LPC_ORDER * sizeof( opus_int32 ) ); + silk_memcpy( CNG_sig_Q14, psCNG->CNG_synth_state, MAX_LPC_ORDER * sizeof( opus_int32 ) ); + celt_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); for( i = 0; i < length; i++ ) { - silk_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ - sum_Q6 = silk_RSHIFT( psDec->LPC_order, 1 ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 1 ], A_Q12[ 0 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 2 ], A_Q12[ 1 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 3 ], A_Q12[ 2 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 4 ], A_Q12[ 3 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 5 ], A_Q12[ 4 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 6 ], A_Q12[ 5 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 7 ], A_Q12[ 6 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 8 ], A_Q12[ 7 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 9 ], A_Q12[ 8 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 10 ], A_Q12[ 9 ] ); + LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12[ 0 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12[ 1 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12[ 2 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12[ 3 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12[ 4 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12[ 5 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12[ 6 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12[ 7 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12[ 8 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12[ 9 ] ); if( psDec->LPC_order == 16 ) { - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 11 ], A_Q12[ 10 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 12 ], A_Q12[ 11 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 13 ], A_Q12[ 12 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 14 ], A_Q12[ 13 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 15 ], A_Q12[ 14 ] ); - sum_Q6 = silk_SMLAWB( sum_Q6, CNG_sig_Q10[ MAX_LPC_ORDER + i - 16 ], A_Q12[ 15 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 11 ], A_Q12[ 10 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 12 ], A_Q12[ 11 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 13 ], A_Q12[ 12 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 14 ], A_Q12[ 13 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 15 ], A_Q12[ 14 ] ); + LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 16 ], A_Q12[ 15 ] ); } /* Update states */ - CNG_sig_Q10[ MAX_LPC_ORDER + i ] = silk_ADD_LSHIFT( CNG_sig_Q10[ MAX_LPC_ORDER + i ], sum_Q6, 4 ); + CNG_sig_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( CNG_sig_Q14[ MAX_LPC_ORDER + i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); + + /* Scale with Gain and add to input signal */ + frame[ i ] = (opus_int16)silk_ADD_SAT16( frame[ i ], silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( CNG_sig_Q14[ MAX_LPC_ORDER + i ], gain_Q10 ), 8 ) ) ); - frame[ i ] = silk_ADD_SAT16( frame[ i ], silk_RSHIFT_ROUND( CNG_sig_Q10[ MAX_LPC_ORDER + i ], 10 ) ); } - silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q10[ length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); + silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q14[ length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); } else { silk_memset( psCNG->CNG_synth_state, 0, psDec->LPC_order * sizeof( opus_int32 ) ); } + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/HP_variable_cutoff.c b/external/opus-1.3.1/silk/HP_variable_cutoff.c similarity index 99% rename from external/opus-1.0.3/silk/HP_variable_cutoff.c rename to external/opus-1.3.1/silk/HP_variable_cutoff.c index 199dbb34..bbe10f04 100644 --- a/external/opus-1.0.3/silk/HP_variable_cutoff.c +++ b/external/opus-1.3.1/silk/HP_variable_cutoff.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/Inlines.h b/external/opus-1.3.1/silk/Inlines.h similarity index 93% rename from external/opus-1.0.3/silk/Inlines.h rename to external/opus-1.3.1/silk/Inlines.h index 87ac2e20..ec986cdf 100644 --- a/external/opus-1.0.3/silk/Inlines.h +++ b/external/opus-1.3.1/silk/Inlines.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -26,7 +26,7 @@ POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ /*! \file silk_Inlines.h - * \brief silk_Inlines.h defines inline signal processing functions. + * \brief silk_Inlines.h defines OPUS_INLINE signal processing functions. */ #ifndef SILK_FIX_INLINES_H @@ -38,7 +38,7 @@ extern "C" #endif /* count leading zeros of opus_int64 */ -static inline opus_int32 silk_CLZ64( opus_int64 in ) +static OPUS_INLINE opus_int32 silk_CLZ64( opus_int64 in ) { opus_int32 in_upper; @@ -53,7 +53,7 @@ static inline opus_int32 silk_CLZ64( opus_int64 in ) } /* get number of leading zeros and fractional part (the bits right after the leading one */ -static inline void silk_CLZ_FRAC( +static OPUS_INLINE void silk_CLZ_FRAC( opus_int32 in, /* I input */ opus_int32 *lz, /* O number of leading zeros */ opus_int32 *frac_Q7 /* O the 7 bits right after the leading one */ @@ -68,7 +68,7 @@ static inline void silk_CLZ_FRAC( /* Approximation of square root */ /* Accuracy: < +/- 10% for output values > 15 */ /* < +/- 2.5% for output values > 120 */ -static inline opus_int32 silk_SQRT_APPROX( opus_int32 x ) +static OPUS_INLINE opus_int32 silk_SQRT_APPROX( opus_int32 x ) { opus_int32 y, lz, frac_Q7; @@ -94,7 +94,7 @@ static inline opus_int32 silk_SQRT_APPROX( opus_int32 x ) } /* Divide two int32 values and return result as int32 in a given Q-domain */ -static inline opus_int32 silk_DIV32_varQ( /* O returns a good approximation of "(a32 << Qres) / b32" */ +static OPUS_INLINE opus_int32 silk_DIV32_varQ( /* O returns a good approximation of "(a32 << Qres) / b32" */ const opus_int32 a32, /* I numerator (Q0) */ const opus_int32 b32, /* I denominator (Q0) */ const opus_int Qres /* I Q-domain of result (>= 0) */ @@ -140,7 +140,7 @@ static inline opus_int32 silk_DIV32_varQ( /* O returns a good approximation } /* Invert int32 value and return result as int32 in a given Q-domain */ -static inline opus_int32 silk_INVERSE32_varQ( /* O returns a good approximation of "(1 << Qres) / b32" */ +static OPUS_INLINE opus_int32 silk_INVERSE32_varQ( /* O returns a good approximation of "(1 << Qres) / b32" */ const opus_int32 b32, /* I denominator (Q0) */ const opus_int Qres /* I Q-domain of result (> 0) */ ) diff --git a/external/opus-1.0.3/silk/LPC_analysis_filter.c b/external/opus-1.3.1/silk/LPC_analysis_filter.c similarity index 78% rename from external/opus-1.0.3/silk/LPC_analysis_filter.c rename to external/opus-1.3.1/silk/LPC_analysis_filter.c index 421dba0b..d34b5eb7 100644 --- a/external/opus-1.0.3/silk/LPC_analysis_filter.c +++ b/external/opus-1.3.1/silk/LPC_analysis_filter.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "SigProc_FIX.h" +#include "celt_lpc.h" /*******************************************/ /* LPC analysis filter */ @@ -38,22 +39,46 @@ POSSIBILITY OF SUCH DAMAGE. /* first d output samples are set to zero */ /*******************************************/ +/* OPT: Using celt_fir() for this function should be faster, but it may cause + integer overflows in intermediate values (not final results), which the + current implementation silences by casting to unsigned. Enabling + this should be safe in pretty much all cases, even though it is not technically + C89-compliant. */ +#define USE_CELT_FIR 0 + void silk_LPC_analysis_filter( opus_int16 *out, /* O Output signal */ const opus_int16 *in, /* I Input signal */ const opus_int16 *B, /* I MA prediction coefficients, Q12 [order] */ const opus_int32 len, /* I Signal length */ - const opus_int32 d /* I Filter order */ + const opus_int32 d, /* I Filter order */ + int arch /* I Run-time architecture */ ) { - opus_int ix, j; + opus_int j; +#if defined(FIXED_POINT) && USE_CELT_FIR + opus_int16 num[SILK_MAX_ORDER_LPC]; +#else + int ix; opus_int32 out32_Q12, out32; const opus_int16 *in_ptr; +#endif - silk_assert( d >= 6 ); - silk_assert( (d & 1) == 0 ); - silk_assert( d <= len ); + celt_assert( d >= 6 ); + celt_assert( (d & 1) == 0 ); + celt_assert( d <= len ); +#if defined(FIXED_POINT) && USE_CELT_FIR + celt_assert( d <= SILK_MAX_ORDER_LPC ); + for ( j = 0; j < d; j++ ) { + num[ j ] = -B[ j ]; + } + celt_fir( in + d, num, out + d, len - d, d, arch ); + for ( j = 0; j < d; j++ ) { + out[ j ] = 0; + } +#else + (void)arch; for( ix = d; ix < len; ix++ ) { in_ptr = &in[ ix - 1 ]; @@ -82,4 +107,5 @@ void silk_LPC_analysis_filter( /* Set first d output samples to zero */ silk_memset( out, 0, d * sizeof( opus_int16 ) ); +#endif } diff --git a/external/opus-1.3.1/silk/LPC_fit.c b/external/opus-1.3.1/silk/LPC_fit.c new file mode 100644 index 00000000..cdea4f3a --- /dev/null +++ b/external/opus-1.3.1/silk/LPC_fit.c @@ -0,0 +1,81 @@ +/*********************************************************************** +Copyright (c) 2013, Koen Vos. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "SigProc_FIX.h" + +/* Convert int32 coefficients to int16 coefs and make sure there's no wrap-around */ +void silk_LPC_fit( + opus_int16 *a_QOUT, /* O Output signal */ + opus_int32 *a_QIN, /* I/O Input signal */ + const opus_int QOUT, /* I Input Q domain */ + const opus_int QIN, /* I Input Q domain */ + const opus_int d /* I Filter order */ +) +{ + opus_int i, k, idx = 0; + opus_int32 maxabs, absval, chirp_Q16; + + /* Limit the maximum absolute value of the prediction coefficients, so that they'll fit in int16 */ + for( i = 0; i < 10; i++ ) { + /* Find maximum absolute value and its index */ + maxabs = 0; + for( k = 0; k < d; k++ ) { + absval = silk_abs( a_QIN[k] ); + if( absval > maxabs ) { + maxabs = absval; + idx = k; + } + } + maxabs = silk_RSHIFT_ROUND( maxabs, QIN - QOUT ); + + if( maxabs > silk_int16_MAX ) { + /* Reduce magnitude of prediction coefficients */ + maxabs = silk_min( maxabs, 163838 ); /* ( silk_int32_MAX >> 14 ) + silk_int16_MAX = 163838 */ + chirp_Q16 = SILK_FIX_CONST( 0.999, 16 ) - silk_DIV32( silk_LSHIFT( maxabs - silk_int16_MAX, 14 ), + silk_RSHIFT32( silk_MUL( maxabs, idx + 1), 2 ) ); + silk_bwexpander_32( a_QIN, d, chirp_Q16 ); + } else { + break; + } + } + + if( i == 10 ) { + /* Reached the last iteration, clip the coefficients */ + for( k = 0; k < d; k++ ) { + a_QOUT[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( a_QIN[ k ], QIN - QOUT ) ); + a_QIN[ k ] = silk_LSHIFT( (opus_int32)a_QOUT[ k ], QIN - QOUT ); + } + } else { + for( k = 0; k < d; k++ ) { + a_QOUT[ k ] = (opus_int16)silk_RSHIFT_ROUND( a_QIN[ k ], QIN - QOUT ); + } + } +} diff --git a/external/opus-1.0.3/silk/LPC_inv_pred_gain.c b/external/opus-1.3.1/silk/LPC_inv_pred_gain.c similarity index 65% rename from external/opus-1.0.3/silk/LPC_inv_pred_gain.c rename to external/opus-1.3.1/silk/LPC_inv_pred_gain.c index c36f3422..a3746a6e 100644 --- a/external/opus-1.0.3/silk/LPC_inv_pred_gain.c +++ b/external/opus-1.3.1/silk/LPC_inv_pred_gain.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "SigProc_FIX.h" +#include "define.h" #define QA 24 #define A_LIMIT SILK_FIX_CONST( 0.99975, QA ) @@ -38,117 +39,103 @@ POSSIBILITY OF SUCH DAMAGE. /* Compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ -static opus_int32 LPC_inverse_pred_gain_QA( /* O Returns inverse prediction gain in energy domain, Q30 */ - opus_int32 A_QA[ 2 ][ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ +static opus_int32 LPC_inverse_pred_gain_QA_c( /* O Returns inverse prediction gain in energy domain, Q30 */ + opus_int32 A_QA[ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ const opus_int order /* I Prediction order */ ) { opus_int k, n, mult2Q; - opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp_QA; - opus_int32 *Aold_QA, *Anew_QA; + opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp1, tmp2; - Anew_QA = A_QA[ order & 1 ]; - - invGain_Q30 = (opus_int32)1 << 30; + invGain_Q30 = SILK_FIX_CONST( 1, 30 ); for( k = order - 1; k > 0; k-- ) { /* Check for stability */ - if( ( Anew_QA[ k ] > A_LIMIT ) || ( Anew_QA[ k ] < -A_LIMIT ) ) { + if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { return 0; } /* Set RC equal to negated AR coef */ - rc_Q31 = -silk_LSHIFT( Anew_QA[ k ], 31 - QA ); + rc_Q31 = -silk_LSHIFT( A_QA[ k ], 31 - QA ); /* rc_mult1_Q30 range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 ); + rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); silk_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */ silk_assert( rc_mult1_Q30 <= ( 1 << 30 ) ); - /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ - mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); - rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); - /* Update inverse gain */ /* invGain_Q30 range: [ 0 : 2^30 ] */ invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); silk_assert( invGain_Q30 >= 0 ); silk_assert( invGain_Q30 <= ( 1 << 30 ) ); + if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { + return 0; + } - /* Swap pointers */ - Aold_QA = Anew_QA; - Anew_QA = A_QA[ k & 1 ]; + /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ + mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); + rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); /* Update AR coefficient */ - for( n = 0; n < k; n++ ) { - tmp_QA = Aold_QA[ n ] - MUL32_FRAC_Q( Aold_QA[ k - n - 1 ], rc_Q31, 31 ); - Anew_QA[ n ] = MUL32_FRAC_Q( tmp_QA, rc_mult2 , mult2Q ); + for( n = 0; n < (k + 1) >> 1; n++ ) { + opus_int64 tmp64; + tmp1 = A_QA[ n ]; + tmp2 = A_QA[ k - n - 1 ]; + tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp1, + MUL32_FRAC_Q( tmp2, rc_Q31, 31 ) ), rc_mult2 ), mult2Q); + if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { + return 0; + } + A_QA[ n ] = ( opus_int32 )tmp64; + tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp2, + MUL32_FRAC_Q( tmp1, rc_Q31, 31 ) ), rc_mult2), mult2Q); + if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { + return 0; + } + A_QA[ k - n - 1 ] = ( opus_int32 )tmp64; } } /* Check for stability */ - if( ( Anew_QA[ 0 ] > A_LIMIT ) || ( Anew_QA[ 0 ] < -A_LIMIT ) ) { + if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { return 0; } /* Set RC equal to negated AR coef */ - rc_Q31 = -silk_LSHIFT( Anew_QA[ 0 ], 31 - QA ); + rc_Q31 = -silk_LSHIFT( A_QA[ 0 ], 31 - QA ); /* Range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 ); + rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); /* Update inverse gain */ /* Range: [ 0 : 2^30 ] */ invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); - silk_assert( invGain_Q30 >= 0 ); - silk_assert( invGain_Q30 <= 1<<30 ); + silk_assert( invGain_Q30 >= 0 ); + silk_assert( invGain_Q30 <= ( 1 << 30 ) ); + if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { + return 0; + } return invGain_Q30; } /* For input in Q12 domain */ -opus_int32 silk_LPC_inverse_pred_gain( /* O Returns inverse prediction gain in energy domain, Q30 */ +opus_int32 silk_LPC_inverse_pred_gain_c( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ) { opus_int k; - opus_int32 Atmp_QA[ 2 ][ SILK_MAX_ORDER_LPC ]; - opus_int32 *Anew_QA; + opus_int32 Atmp_QA[ SILK_MAX_ORDER_LPC ]; opus_int32 DC_resp = 0; - Anew_QA = Atmp_QA[ order & 1 ]; - /* Increase Q domain of the AR coefficients */ for( k = 0; k < order; k++ ) { DC_resp += (opus_int32)A_Q12[ k ]; - Anew_QA[ k ] = silk_LSHIFT32( (opus_int32)A_Q12[ k ], QA - 12 ); + Atmp_QA[ k ] = silk_LSHIFT32( (opus_int32)A_Q12[ k ], QA - 12 ); } /* If the DC is unstable, we don't even need to do the full calculations */ if( DC_resp >= 4096 ) { return 0; } - return LPC_inverse_pred_gain_QA( Atmp_QA, order ); + return LPC_inverse_pred_gain_QA_c( Atmp_QA, order ); } - -#ifdef FIXED_POINT - -/* For input in Q24 domain */ -opus_int32 silk_LPC_inverse_pred_gain_Q24( /* O Returns inverse prediction gain in energy domain, Q30 */ - const opus_int32 *A_Q24, /* I Prediction coefficients [order] */ - const opus_int order /* I Prediction order */ -) -{ - opus_int k; - opus_int32 Atmp_QA[ 2 ][ SILK_MAX_ORDER_LPC ]; - opus_int32 *Anew_QA; - - Anew_QA = Atmp_QA[ order & 1 ]; - - /* Increase Q domain of the AR coefficients */ - for( k = 0; k < order; k++ ) { - Anew_QA[ k ] = silk_RSHIFT32( A_Q24[ k ], 24 - QA ); - } - - return LPC_inverse_pred_gain_QA( Atmp_QA, order ); -} -#endif diff --git a/external/opus-1.0.3/silk/LP_variable_cutoff.c b/external/opus-1.3.1/silk/LP_variable_cutoff.c similarity index 97% rename from external/opus-1.0.3/silk/LP_variable_cutoff.c rename to external/opus-1.3.1/silk/LP_variable_cutoff.c index d0912a64..79112ad3 100644 --- a/external/opus-1.0.3/silk/LP_variable_cutoff.c +++ b/external/opus-1.3.1/silk/LP_variable_cutoff.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -38,7 +38,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "main.h" /* Helper function, interpolates the filter taps */ -static inline void silk_LP_interpolate_filter_taps( +static OPUS_INLINE void silk_LP_interpolate_filter_taps( opus_int32 B_Q28[ TRANSITION_NB ], opus_int32 A_Q28[ TRANSITION_NA ], const opus_int ind, @@ -130,6 +130,6 @@ void silk_LP_variable_cutoff( /* ARMA low-pass filtering */ silk_assert( TRANSITION_NB == 3 && TRANSITION_NA == 2 ); - silk_biquad_alt( frame, B_Q28, A_Q28, psLP->In_LP_State, frame, frame_length, 1); + silk_biquad_alt_stride1( frame, B_Q28, A_Q28, psLP->In_LP_State, frame, frame_length); } } diff --git a/external/opus-1.0.3/silk/MacroCount.h b/external/opus-1.3.1/silk/MacroCount.h similarity index 70% rename from external/opus-1.0.3/silk/MacroCount.h rename to external/opus-1.3.1/silk/MacroCount.h index 2829e8cc..78100ffe 100644 --- a/external/opus-1.0.3/silk/MacroCount.h +++ b/external/opus-1.3.1/silk/MacroCount.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -34,11 +34,11 @@ POSSIBILITY OF SUCH DAMAGE. extern opus_int64 ops_count; -static inline opus_int64 silk_SaveCount(){ +static OPUS_INLINE opus_int64 silk_SaveCount(){ return(ops_count); } -static inline opus_int64 silk_SaveResetCount(){ +static OPUS_INLINE opus_int64 silk_SaveResetCount(){ opus_int64 ret; ret = ops_count; @@ -46,12 +46,12 @@ static inline opus_int64 silk_SaveResetCount(){ return(ret); } -static inline silk_PrintCount(){ +static OPUS_INLINE silk_PrintCount(){ printf("ops_count = %d \n ", (opus_int32)ops_count); } #undef silk_MUL -static inline opus_int32 silk_MUL(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_MUL(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 4; ret = a32 * b32; @@ -59,14 +59,14 @@ static inline opus_int32 silk_MUL(opus_int32 a32, opus_int32 b32){ } #undef silk_MUL_uint -static inline opus_uint32 silk_MUL_uint(opus_uint32 a32, opus_uint32 b32){ +static OPUS_INLINE opus_uint32 silk_MUL_uint(opus_uint32 a32, opus_uint32 b32){ opus_uint32 ret; ops_count += 4; ret = a32 * b32; return ret; } #undef silk_MLA -static inline opus_int32 silk_MLA(opus_int32 a32, opus_int32 b32, opus_int32 c32){ +static OPUS_INLINE opus_int32 silk_MLA(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 4; ret = a32 + b32 * c32; @@ -74,7 +74,7 @@ static inline opus_int32 silk_MLA(opus_int32 a32, opus_int32 b32, opus_int32 c32 } #undef silk_MLA_uint -static inline opus_int32 silk_MLA_uint(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32){ +static OPUS_INLINE opus_int32 silk_MLA_uint(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32){ opus_uint32 ret; ops_count += 4; ret = a32 + b32 * c32; @@ -82,14 +82,14 @@ static inline opus_int32 silk_MLA_uint(opus_uint32 a32, opus_uint32 b32, opus_ui } #undef silk_SMULWB -static inline opus_int32 silk_SMULWB(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_SMULWB(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 5; ret = (a32 >> 16) * (opus_int32)((opus_int16)b32) + (((a32 & 0x0000FFFF) * (opus_int32)((opus_int16)b32)) >> 16); return ret; } #undef silk_SMLAWB -static inline opus_int32 silk_SMLAWB(opus_int32 a32, opus_int32 b32, opus_int32 c32){ +static OPUS_INLINE opus_int32 silk_SMLAWB(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 5; ret = ((a32) + ((((b32) >> 16) * (opus_int32)((opus_int16)(c32))) + ((((b32) & 0x0000FFFF) * (opus_int32)((opus_int16)(c32))) >> 16))); @@ -97,14 +97,14 @@ static inline opus_int32 silk_SMLAWB(opus_int32 a32, opus_int32 b32, opus_int32 } #undef silk_SMULWT -static inline opus_int32 silk_SMULWT(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_SMULWT(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 4; ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16); return ret; } #undef silk_SMLAWT -static inline opus_int32 silk_SMLAWT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ +static OPUS_INLINE opus_int32 silk_SMLAWT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 4; ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16)); @@ -112,14 +112,14 @@ static inline opus_int32 silk_SMLAWT(opus_int32 a32, opus_int32 b32, opus_int32 } #undef silk_SMULBB -static inline opus_int32 silk_SMULBB(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_SMULBB(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 1; ret = (opus_int32)((opus_int16)a32) * (opus_int32)((opus_int16)b32); return ret; } #undef silk_SMLABB -static inline opus_int32 silk_SMLABB(opus_int32 a32, opus_int32 b32, opus_int32 c32){ +static OPUS_INLINE opus_int32 silk_SMLABB(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 1; ret = a32 + (opus_int32)((opus_int16)b32) * (opus_int32)((opus_int16)c32); @@ -127,7 +127,7 @@ static inline opus_int32 silk_SMLABB(opus_int32 a32, opus_int32 b32, opus_int32 } #undef silk_SMULBT -static inline opus_int32 silk_SMULBT(opus_int32 a32, opus_int32 b32 ){ +static OPUS_INLINE opus_int32 silk_SMULBT(opus_int32 a32, opus_int32 b32 ){ opus_int32 ret; ops_count += 4; ret = ((opus_int32)((opus_int16)a32)) * (b32 >> 16); @@ -135,7 +135,7 @@ static inline opus_int32 silk_SMULBT(opus_int32 a32, opus_int32 b32 ){ } #undef silk_SMLABT -static inline opus_int32 silk_SMLABT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ +static OPUS_INLINE opus_int32 silk_SMLABT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 1; ret = a32 + ((opus_int32)((opus_int16)b32)) * (c32 >> 16); @@ -143,7 +143,7 @@ static inline opus_int32 silk_SMLABT(opus_int32 a32, opus_int32 b32, opus_int32 } #undef silk_SMULTT -static inline opus_int32 silk_SMULTT(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_SMULTT(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 1; ret = (a32 >> 16) * (b32 >> 16); @@ -151,7 +151,7 @@ static inline opus_int32 silk_SMULTT(opus_int32 a32, opus_int32 b32){ } #undef silk_SMLATT -static inline opus_int32 silk_SMLATT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ +static OPUS_INLINE opus_int32 silk_SMLATT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 1; ret = a32 + (b32 >> 16) * (c32 >> 16); @@ -179,7 +179,7 @@ static inline opus_int32 silk_SMLATT(opus_int32 a32, opus_int32 b32, opus_int32 #define silk_SMLAWT_ovflw silk_SMLAWT #undef silk_SMULL -static inline opus_int64 silk_SMULL(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int64 silk_SMULL(opus_int32 a32, opus_int32 b32){ opus_int64 ret; ops_count += 8; ret = ((opus_int64)(a32) * /*(opus_int64)*/(b32)); @@ -187,14 +187,14 @@ static inline opus_int64 silk_SMULL(opus_int32 a32, opus_int32 b32){ } #undef silk_SMLAL -static inline opus_int64 silk_SMLAL(opus_int64 a64, opus_int32 b32, opus_int32 c32){ +static OPUS_INLINE opus_int64 silk_SMLAL(opus_int64 a64, opus_int32 b32, opus_int32 c32){ opus_int64 ret; ops_count += 8; ret = a64 + ((opus_int64)(b32) * /*(opus_int64)*/(c32)); return ret; } #undef silk_SMLALBB -static inline opus_int64 silk_SMLALBB(opus_int64 a64, opus_int16 b16, opus_int16 c16){ +static OPUS_INLINE opus_int64 silk_SMLALBB(opus_int64 a64, opus_int16 b16, opus_int16 c16){ opus_int64 ret; ops_count += 4; ret = a64 + ((opus_int64)(b16) * /*(opus_int64)*/(c16)); @@ -202,7 +202,7 @@ static inline opus_int64 silk_SMLALBB(opus_int64 a64, opus_int16 b16, opus_int16 } #undef SigProcFIX_CLZ16 -static inline opus_int32 SigProcFIX_CLZ16(opus_int16 in16) +static OPUS_INLINE opus_int32 SigProcFIX_CLZ16(opus_int16 in16) { opus_int32 out32 = 0; ops_count += 10; @@ -240,7 +240,7 @@ static inline opus_int32 SigProcFIX_CLZ16(opus_int16 in16) } #undef SigProcFIX_CLZ32 -static inline opus_int32 SigProcFIX_CLZ32(opus_int32 in32) +static OPUS_INLINE opus_int32 SigProcFIX_CLZ32(opus_int32 in32) { /* test highest 16 bits and convert to opus_int16 */ ops_count += 2; @@ -252,19 +252,19 @@ static inline opus_int32 SigProcFIX_CLZ32(opus_int32 in32) } #undef silk_DIV32 -static inline opus_int32 silk_DIV32(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_DIV32(opus_int32 a32, opus_int32 b32){ ops_count += 64; return a32 / b32; } #undef silk_DIV32_16 -static inline opus_int32 silk_DIV32_16(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_DIV32_16(opus_int32 a32, opus_int32 b32){ ops_count += 32; return a32 / b32; } #undef silk_SAT8 -static inline opus_int8 silk_SAT8(opus_int64 a){ +static OPUS_INLINE opus_int8 silk_SAT8(opus_int64 a){ opus_int8 tmp; ops_count += 1; tmp = (opus_int8)((a) > silk_int8_MAX ? silk_int8_MAX : \ @@ -273,7 +273,7 @@ static inline opus_int8 silk_SAT8(opus_int64 a){ } #undef silk_SAT16 -static inline opus_int16 silk_SAT16(opus_int64 a){ +static OPUS_INLINE opus_int16 silk_SAT16(opus_int64 a){ opus_int16 tmp; ops_count += 1; tmp = (opus_int16)((a) > silk_int16_MAX ? silk_int16_MAX : \ @@ -281,7 +281,7 @@ static inline opus_int16 silk_SAT16(opus_int64 a){ return(tmp); } #undef silk_SAT32 -static inline opus_int32 silk_SAT32(opus_int64 a){ +static OPUS_INLINE opus_int32 silk_SAT32(opus_int64 a){ opus_int32 tmp; ops_count += 1; tmp = (opus_int32)((a) > silk_int32_MAX ? silk_int32_MAX : \ @@ -289,7 +289,7 @@ static inline opus_int32 silk_SAT32(opus_int64 a){ return(tmp); } #undef silk_POS_SAT32 -static inline opus_int32 silk_POS_SAT32(opus_int64 a){ +static OPUS_INLINE opus_int32 silk_POS_SAT32(opus_int64 a){ opus_int32 tmp; ops_count += 1; tmp = (opus_int32)((a) > silk_int32_MAX ? silk_int32_MAX : (a)); @@ -297,14 +297,14 @@ static inline opus_int32 silk_POS_SAT32(opus_int64 a){ } #undef silk_ADD_POS_SAT8 -static inline opus_int8 silk_ADD_POS_SAT8(opus_int64 a, opus_int64 b){ +static OPUS_INLINE opus_int8 silk_ADD_POS_SAT8(opus_int64 a, opus_int64 b){ opus_int8 tmp; ops_count += 1; tmp = (opus_int8)((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b))); return(tmp); } #undef silk_ADD_POS_SAT16 -static inline opus_int16 silk_ADD_POS_SAT16(opus_int64 a, opus_int64 b){ +static OPUS_INLINE opus_int16 silk_ADD_POS_SAT16(opus_int64 a, opus_int64 b){ opus_int16 tmp; ops_count += 1; tmp = (opus_int16)((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b))); @@ -312,56 +312,48 @@ static inline opus_int16 silk_ADD_POS_SAT16(opus_int64 a, opus_int64 b){ } #undef silk_ADD_POS_SAT32 -static inline opus_int32 silk_ADD_POS_SAT32(opus_int64 a, opus_int64 b){ +static OPUS_INLINE opus_int32 silk_ADD_POS_SAT32(opus_int64 a, opus_int64 b){ opus_int32 tmp; ops_count += 1; tmp = (opus_int32)((((a)+(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))); return(tmp); } -#undef silk_ADD_POS_SAT64 -static inline opus_int64 silk_ADD_POS_SAT64(opus_int64 a, opus_int64 b){ - opus_int64 tmp; - ops_count += 1; - tmp = ((((a)+(b)) & 0x8000000000000000LL) ? silk_int64_MAX : ((a)+(b))); - return(tmp); -} - #undef silk_LSHIFT8 -static inline opus_int8 silk_LSHIFT8(opus_int8 a, opus_int32 shift){ +static OPUS_INLINE opus_int8 silk_LSHIFT8(opus_int8 a, opus_int32 shift){ opus_int8 ret; ops_count += 1; ret = a << shift; return ret; } #undef silk_LSHIFT16 -static inline opus_int16 silk_LSHIFT16(opus_int16 a, opus_int32 shift){ +static OPUS_INLINE opus_int16 silk_LSHIFT16(opus_int16 a, opus_int32 shift){ opus_int16 ret; ops_count += 1; ret = a << shift; return ret; } #undef silk_LSHIFT32 -static inline opus_int32 silk_LSHIFT32(opus_int32 a, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_LSHIFT32(opus_int32 a, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a << shift; return ret; } #undef silk_LSHIFT64 -static inline opus_int64 silk_LSHIFT64(opus_int64 a, opus_int shift){ +static OPUS_INLINE opus_int64 silk_LSHIFT64(opus_int64 a, opus_int shift){ ops_count += 1; return a << shift; } #undef silk_LSHIFT_ovflw -static inline opus_int32 silk_LSHIFT_ovflw(opus_int32 a, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_LSHIFT_ovflw(opus_int32 a, opus_int32 shift){ ops_count += 1; return a << shift; } #undef silk_LSHIFT_uint -static inline opus_uint32 silk_LSHIFT_uint(opus_uint32 a, opus_int32 shift){ +static OPUS_INLINE opus_uint32 silk_LSHIFT_uint(opus_uint32 a, opus_int32 shift){ opus_uint32 ret; ops_count += 1; ret = a << shift; @@ -369,83 +361,83 @@ static inline opus_uint32 silk_LSHIFT_uint(opus_uint32 a, opus_int32 shift){ } #undef silk_RSHIFT8 -static inline opus_int8 silk_RSHIFT8(opus_int8 a, opus_int32 shift){ +static OPUS_INLINE opus_int8 silk_RSHIFT8(opus_int8 a, opus_int32 shift){ ops_count += 1; return a >> shift; } #undef silk_RSHIFT16 -static inline opus_int16 silk_RSHIFT16(opus_int16 a, opus_int32 shift){ +static OPUS_INLINE opus_int16 silk_RSHIFT16(opus_int16 a, opus_int32 shift){ ops_count += 1; return a >> shift; } #undef silk_RSHIFT32 -static inline opus_int32 silk_RSHIFT32(opus_int32 a, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_RSHIFT32(opus_int32 a, opus_int32 shift){ ops_count += 1; return a >> shift; } #undef silk_RSHIFT64 -static inline opus_int64 silk_RSHIFT64(opus_int64 a, opus_int64 shift){ +static OPUS_INLINE opus_int64 silk_RSHIFT64(opus_int64 a, opus_int64 shift){ ops_count += 1; return a >> shift; } #undef silk_RSHIFT_uint -static inline opus_uint32 silk_RSHIFT_uint(opus_uint32 a, opus_int32 shift){ +static OPUS_INLINE opus_uint32 silk_RSHIFT_uint(opus_uint32 a, opus_int32 shift){ ops_count += 1; return a >> shift; } #undef silk_ADD_LSHIFT -static inline opus_int32 silk_ADD_LSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_ADD_LSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a + (b << shift); return ret; /* shift >= 0*/ } #undef silk_ADD_LSHIFT32 -static inline opus_int32 silk_ADD_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_ADD_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a + (b << shift); return ret; /* shift >= 0*/ } #undef silk_ADD_LSHIFT_uint -static inline opus_uint32 silk_ADD_LSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){ +static OPUS_INLINE opus_uint32 silk_ADD_LSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){ opus_uint32 ret; ops_count += 1; ret = a + (b << shift); return ret; /* shift >= 0*/ } #undef silk_ADD_RSHIFT -static inline opus_int32 silk_ADD_RSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_ADD_RSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a + (b >> shift); return ret; /* shift > 0*/ } #undef silk_ADD_RSHIFT32 -static inline opus_int32 silk_ADD_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_ADD_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a + (b >> shift); return ret; /* shift > 0*/ } #undef silk_ADD_RSHIFT_uint -static inline opus_uint32 silk_ADD_RSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){ +static OPUS_INLINE opus_uint32 silk_ADD_RSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){ opus_uint32 ret; ops_count += 1; ret = a + (b >> shift); return ret; /* shift > 0*/ } #undef silk_SUB_LSHIFT32 -static inline opus_int32 silk_SUB_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_SUB_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a - (b << shift); return ret; /* shift >= 0*/ } #undef silk_SUB_RSHIFT32 -static inline opus_int32 silk_SUB_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_SUB_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a - (b >> shift); @@ -453,7 +445,7 @@ static inline opus_int32 silk_SUB_RSHIFT32(opus_int32 a, opus_int32 b, opus_int3 } #undef silk_RSHIFT_ROUND -static inline opus_int32 silk_RSHIFT_ROUND(opus_int32 a, opus_int32 shift){ +static OPUS_INLINE opus_int32 silk_RSHIFT_ROUND(opus_int32 a, opus_int32 shift){ opus_int32 ret; ops_count += 3; ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; @@ -461,7 +453,7 @@ static inline opus_int32 silk_RSHIFT_ROUND(opus_int32 a, opus_int32 shift){ } #undef silk_RSHIFT_ROUND64 -static inline opus_int64 silk_RSHIFT_ROUND64(opus_int64 a, opus_int32 shift){ +static OPUS_INLINE opus_int64 silk_RSHIFT_ROUND64(opus_int64 a, opus_int32 shift){ opus_int64 ret; ops_count += 6; ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; @@ -469,13 +461,13 @@ static inline opus_int64 silk_RSHIFT_ROUND64(opus_int64 a, opus_int32 shift){ } #undef silk_abs_int64 -static inline opus_int64 silk_abs_int64(opus_int64 a){ +static OPUS_INLINE opus_int64 silk_abs_int64(opus_int64 a){ ops_count += 1; return (((a) > 0) ? (a) : -(a)); /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN*/ } #undef silk_abs_int32 -static inline opus_int32 silk_abs_int32(opus_int32 a){ +static OPUS_INLINE opus_int32 silk_abs_int32(opus_int32 a){ ops_count += 1; return silk_abs(a); } @@ -498,7 +490,7 @@ static silk_sign(a){ } #undef silk_ADD16 -static inline opus_int16 silk_ADD16(opus_int16 a, opus_int16 b){ +static OPUS_INLINE opus_int16 silk_ADD16(opus_int16 a, opus_int16 b){ opus_int16 ret; ops_count += 1; ret = a + b; @@ -506,7 +498,7 @@ static inline opus_int16 silk_ADD16(opus_int16 a, opus_int16 b){ } #undef silk_ADD32 -static inline opus_int32 silk_ADD32(opus_int32 a, opus_int32 b){ +static OPUS_INLINE opus_int32 silk_ADD32(opus_int32 a, opus_int32 b){ opus_int32 ret; ops_count += 1; ret = a + b; @@ -514,7 +506,7 @@ static inline opus_int32 silk_ADD32(opus_int32 a, opus_int32 b){ } #undef silk_ADD64 -static inline opus_int64 silk_ADD64(opus_int64 a, opus_int64 b){ +static OPUS_INLINE opus_int64 silk_ADD64(opus_int64 a, opus_int64 b){ opus_int64 ret; ops_count += 2; ret = a + b; @@ -522,7 +514,7 @@ static inline opus_int64 silk_ADD64(opus_int64 a, opus_int64 b){ } #undef silk_SUB16 -static inline opus_int16 silk_SUB16(opus_int16 a, opus_int16 b){ +static OPUS_INLINE opus_int16 silk_SUB16(opus_int16 a, opus_int16 b){ opus_int16 ret; ops_count += 1; ret = a - b; @@ -530,7 +522,7 @@ static inline opus_int16 silk_SUB16(opus_int16 a, opus_int16 b){ } #undef silk_SUB32 -static inline opus_int32 silk_SUB32(opus_int32 a, opus_int32 b){ +static OPUS_INLINE opus_int32 silk_SUB32(opus_int32 a, opus_int32 b){ opus_int32 ret; ops_count += 1; ret = a - b; @@ -538,7 +530,7 @@ static inline opus_int32 silk_SUB32(opus_int32 a, opus_int32 b){ } #undef silk_SUB64 -static inline opus_int64 silk_SUB64(opus_int64 a, opus_int64 b){ +static OPUS_INLINE opus_int64 silk_SUB64(opus_int64 a, opus_int64 b){ opus_int64 ret; ops_count += 2; ret = a - b; @@ -546,7 +538,7 @@ static inline opus_int64 silk_SUB64(opus_int64 a, opus_int64 b){ } #undef silk_ADD_SAT16 -static inline opus_int16 silk_ADD_SAT16( opus_int16 a16, opus_int16 b16 ) { +static OPUS_INLINE opus_int16 silk_ADD_SAT16( opus_int16 a16, opus_int16 b16 ) { opus_int16 res; /* Nb will be counted in AKP_add32 and silk_SAT16*/ res = (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a16), (b16) ) ); @@ -554,7 +546,7 @@ static inline opus_int16 silk_ADD_SAT16( opus_int16 a16, opus_int16 b16 ) { } #undef silk_ADD_SAT32 -static inline opus_int32 silk_ADD_SAT32(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_ADD_SAT32(opus_int32 a32, opus_int32 b32){ opus_int32 res; ops_count += 1; res = ((((a32) + (b32)) & 0x80000000) == 0 ? \ @@ -564,7 +556,7 @@ static inline opus_int32 silk_ADD_SAT32(opus_int32 a32, opus_int32 b32){ } #undef silk_ADD_SAT64 -static inline opus_int64 silk_ADD_SAT64( opus_int64 a64, opus_int64 b64 ) { +static OPUS_INLINE opus_int64 silk_ADD_SAT64( opus_int64 a64, opus_int64 b64 ) { opus_int64 res; ops_count += 1; res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \ @@ -574,7 +566,7 @@ static inline opus_int64 silk_ADD_SAT64( opus_int64 a64, opus_int64 b64 ) { } #undef silk_SUB_SAT16 -static inline opus_int16 silk_SUB_SAT16( opus_int16 a16, opus_int16 b16 ) { +static OPUS_INLINE opus_int16 silk_SUB_SAT16( opus_int16 a16, opus_int16 b16 ) { opus_int16 res; silk_assert(0); /* Nb will be counted in sub-macros*/ @@ -583,7 +575,7 @@ static inline opus_int16 silk_SUB_SAT16( opus_int16 a16, opus_int16 b16 ) { } #undef silk_SUB_SAT32 -static inline opus_int32 silk_SUB_SAT32( opus_int32 a32, opus_int32 b32 ) { +static OPUS_INLINE opus_int32 silk_SUB_SAT32( opus_int32 a32, opus_int32 b32 ) { opus_int32 res; ops_count += 1; res = ((((a32)-(b32)) & 0x80000000) == 0 ? \ @@ -593,7 +585,7 @@ static inline opus_int32 silk_SUB_SAT32( opus_int32 a32, opus_int32 b32 ) { } #undef silk_SUB_SAT64 -static inline opus_int64 silk_SUB_SAT64( opus_int64 a64, opus_int64 b64 ) { +static OPUS_INLINE opus_int64 silk_SUB_SAT64( opus_int64 a64, opus_int64 b64 ) { opus_int64 res; ops_count += 1; res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \ @@ -604,7 +596,7 @@ static inline opus_int64 silk_SUB_SAT64( opus_int64 a64, opus_int64 b64 ) { } #undef silk_SMULWW -static inline opus_int32 silk_SMULWW(opus_int32 a32, opus_int32 b32){ +static OPUS_INLINE opus_int32 silk_SMULWW(opus_int32 a32, opus_int32 b32){ opus_int32 ret; /* Nb will be counted in sub-macros*/ ret = silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)); @@ -612,7 +604,7 @@ static inline opus_int32 silk_SMULWW(opus_int32 a32, opus_int32 b32){ } #undef silk_SMLAWW -static inline opus_int32 silk_SMLAWW(opus_int32 a32, opus_int32 b32, opus_int32 c32){ +static OPUS_INLINE opus_int32 silk_SMLAWW(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; /* Nb will be counted in sub-macros*/ ret = silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16)); @@ -620,26 +612,26 @@ static inline opus_int32 silk_SMLAWW(opus_int32 a32, opus_int32 b32, opus_int32 } #undef silk_min_int -static inline opus_int silk_min_int(opus_int a, opus_int b) +static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b) { ops_count += 1; return (((a) < (b)) ? (a) : (b)); } #undef silk_min_16 -static inline opus_int16 silk_min_16(opus_int16 a, opus_int16 b) +static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b) { ops_count += 1; return (((a) < (b)) ? (a) : (b)); } #undef silk_min_32 -static inline opus_int32 silk_min_32(opus_int32 a, opus_int32 b) +static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b) { ops_count += 1; return (((a) < (b)) ? (a) : (b)); } #undef silk_min_64 -static inline opus_int64 silk_min_64(opus_int64 a, opus_int64 b) +static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b) { ops_count += 1; return (((a) < (b)) ? (a) : (b)); @@ -647,26 +639,26 @@ static inline opus_int64 silk_min_64(opus_int64 a, opus_int64 b) /* silk_min() versions with typecast in the function call */ #undef silk_max_int -static inline opus_int silk_max_int(opus_int a, opus_int b) +static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b) { ops_count += 1; return (((a) > (b)) ? (a) : (b)); } #undef silk_max_16 -static inline opus_int16 silk_max_16(opus_int16 a, opus_int16 b) +static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b) { ops_count += 1; return (((a) > (b)) ? (a) : (b)); } #undef silk_max_32 -static inline opus_int32 silk_max_32(opus_int32 a, opus_int32 b) +static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b) { ops_count += 1; return (((a) > (b)) ? (a) : (b)); } #undef silk_max_64 -static inline opus_int64 silk_max_64(opus_int64 a, opus_int64 b) +static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) { ops_count += 1; return (((a) > (b)) ? (a) : (b)); @@ -674,7 +666,7 @@ static inline opus_int64 silk_max_64(opus_int64 a, opus_int64 b) #undef silk_LIMIT_int -static inline opus_int silk_LIMIT_int(opus_int a, opus_int limit1, opus_int limit2) +static OPUS_INLINE opus_int silk_LIMIT_int(opus_int a, opus_int limit1, opus_int limit2) { opus_int ret; ops_count += 6; @@ -686,7 +678,7 @@ static inline opus_int silk_LIMIT_int(opus_int a, opus_int limit1, opus_int limi } #undef silk_LIMIT_16 -static inline opus_int16 silk_LIMIT_16(opus_int16 a, opus_int16 limit1, opus_int16 limit2) +static OPUS_INLINE opus_int16 silk_LIMIT_16(opus_int16 a, opus_int16 limit1, opus_int16 limit2) { opus_int16 ret; ops_count += 6; @@ -699,7 +691,7 @@ return(ret); #undef silk_LIMIT_32 -static inline opus_int silk_LIMIT_32(opus_int32 a, opus_int32 limit1, opus_int32 limit2) +static OPUS_INLINE opus_int32 silk_LIMIT_32(opus_int32 a, opus_int32 limit1, opus_int32 limit2) { opus_int32 ret; ops_count += 6; diff --git a/external/opus-1.0.3/silk/MacroDebug.h b/external/opus-1.3.1/silk/MacroDebug.h similarity index 83% rename from external/opus-1.0.3/silk/MacroDebug.h rename to external/opus-1.3.1/silk/MacroDebug.h index ecd90bc4..8dd4ce2e 100644 --- a/external/opus-1.0.3/silk/MacroDebug.h +++ b/external/opus-1.3.1/silk/MacroDebug.h @@ -9,11 +9,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -36,7 +36,7 @@ POSSIBILITY OF SUCH DAMAGE. #undef silk_ADD16 #define silk_ADD16(a,b) silk_ADD16_((a), (b), __FILE__, __LINE__) -static inline opus_int16 silk_ADD16_(opus_int16 a, opus_int16 b, char *file, int line){ +static OPUS_INLINE opus_int16 silk_ADD16_(opus_int16 a, opus_int16 b, char *file, int line){ opus_int16 ret; ret = a + b; @@ -52,7 +52,7 @@ static inline opus_int16 silk_ADD16_(opus_int16 a, opus_int16 b, char *file, int #undef silk_ADD32 #define silk_ADD32(a,b) silk_ADD32_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_ADD32_(opus_int32 a, opus_int32 b, char *file, int line){ +static OPUS_INLINE opus_int32 silk_ADD32_(opus_int32 a, opus_int32 b, char *file, int line){ opus_int32 ret; ret = a + b; @@ -68,7 +68,7 @@ static inline opus_int32 silk_ADD32_(opus_int32 a, opus_int32 b, char *file, int #undef silk_ADD64 #define silk_ADD64(a,b) silk_ADD64_((a), (b), __FILE__, __LINE__) -static inline opus_int64 silk_ADD64_(opus_int64 a, opus_int64 b, char *file, int line){ +static OPUS_INLINE opus_int64 silk_ADD64_(opus_int64 a, opus_int64 b, char *file, int line){ opus_int64 ret; ret = a + b; @@ -84,7 +84,7 @@ static inline opus_int64 silk_ADD64_(opus_int64 a, opus_int64 b, char *file, int #undef silk_SUB16 #define silk_SUB16(a,b) silk_SUB16_((a), (b), __FILE__, __LINE__) -static inline opus_int16 silk_SUB16_(opus_int16 a, opus_int16 b, char *file, int line){ +static OPUS_INLINE opus_int16 silk_SUB16_(opus_int16 a, opus_int16 b, char *file, int line){ opus_int16 ret; ret = a - b; @@ -100,7 +100,7 @@ static inline opus_int16 silk_SUB16_(opus_int16 a, opus_int16 b, char *file, int #undef silk_SUB32 #define silk_SUB32(a,b) silk_SUB32_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_SUB32_(opus_int32 a, opus_int32 b, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SUB32_(opus_int32 a, opus_int32 b, char *file, int line){ opus_int32 ret; ret = a - b; @@ -116,7 +116,7 @@ static inline opus_int32 silk_SUB32_(opus_int32 a, opus_int32 b, char *file, int #undef silk_SUB64 #define silk_SUB64(a,b) silk_SUB64_((a), (b), __FILE__, __LINE__) -static inline opus_int64 silk_SUB64_(opus_int64 a, opus_int64 b, char *file, int line){ +static OPUS_INLINE opus_int64 silk_SUB64_(opus_int64 a, opus_int64 b, char *file, int line){ opus_int64 ret; ret = a - b; @@ -132,7 +132,7 @@ static inline opus_int64 silk_SUB64_(opus_int64 a, opus_int64 b, char *file, int #undef silk_ADD_SAT16 #define silk_ADD_SAT16(a,b) silk_ADD_SAT16_((a), (b), __FILE__, __LINE__) -static inline opus_int16 silk_ADD_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line) { +static OPUS_INLINE opus_int16 silk_ADD_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line) { opus_int16 res; res = (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a16), (b16) ) ); if ( res != silk_SAT16( (opus_int32)a16 + (opus_int32)b16 ) ) @@ -147,7 +147,7 @@ static inline opus_int16 silk_ADD_SAT16_( opus_int16 a16, opus_int16 b16, char * #undef silk_ADD_SAT32 #define silk_ADD_SAT32(a,b) silk_ADD_SAT32_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_ADD_SAT32_(opus_int32 a32, opus_int32 b32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_ADD_SAT32_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 res; res = ((((opus_uint32)(a32) + (opus_uint32)(b32)) & 0x80000000) == 0 ? \ ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \ @@ -164,7 +164,7 @@ static inline opus_int32 silk_ADD_SAT32_(opus_int32 a32, opus_int32 b32, char *f #undef silk_ADD_SAT64 #define silk_ADD_SAT64(a,b) silk_ADD_SAT64_((a), (b), __FILE__, __LINE__) -static inline opus_int64 silk_ADD_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line) { +static OPUS_INLINE opus_int64 silk_ADD_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line) { opus_int64 res; int fail = 0; res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \ @@ -193,7 +193,7 @@ static inline opus_int64 silk_ADD_SAT64_( opus_int64 a64, opus_int64 b64, char * #undef silk_SUB_SAT16 #define silk_SUB_SAT16(a,b) silk_SUB_SAT16_((a), (b), __FILE__, __LINE__) -static inline opus_int16 silk_SUB_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line ) { +static OPUS_INLINE opus_int16 silk_SUB_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line ) { opus_int16 res; res = (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a16), (b16) ) ); if ( res != silk_SAT16( (opus_int32)a16 - (opus_int32)b16 ) ) @@ -208,7 +208,7 @@ static inline opus_int16 silk_SUB_SAT16_( opus_int16 a16, opus_int16 b16, char * #undef silk_SUB_SAT32 #define silk_SUB_SAT32(a,b) silk_SUB_SAT32_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_SUB_SAT32_( opus_int32 a32, opus_int32 b32, char *file, int line ) { +static OPUS_INLINE opus_int32 silk_SUB_SAT32_( opus_int32 a32, opus_int32 b32, char *file, int line ) { opus_int32 res; res = ((((opus_uint32)(a32)-(opus_uint32)(b32)) & 0x80000000) == 0 ? \ (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \ @@ -225,7 +225,7 @@ static inline opus_int32 silk_SUB_SAT32_( opus_int32 a32, opus_int32 b32, char * #undef silk_SUB_SAT64 #define silk_SUB_SAT64(a,b) silk_SUB_SAT64_((a), (b), __FILE__, __LINE__) -static inline opus_int64 silk_SUB_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line ) { +static OPUS_INLINE opus_int64 silk_SUB_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line ) { opus_int64 res; int fail = 0; res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \ @@ -254,7 +254,7 @@ static inline opus_int64 silk_SUB_SAT64_( opus_int64 a64, opus_int64 b64, char * #undef silk_MUL #define silk_MUL(a,b) silk_MUL_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_MUL_(opus_int32 a32, opus_int32 b32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_MUL_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 ret; opus_int64 ret64; ret = a32 * b32; @@ -271,7 +271,7 @@ static inline opus_int32 silk_MUL_(opus_int32 a32, opus_int32 b32, char *file, i #undef silk_MUL_uint #define silk_MUL_uint(a,b) silk_MUL_uint_((a), (b), __FILE__, __LINE__) -static inline opus_uint32 silk_MUL_uint_(opus_uint32 a32, opus_uint32 b32, char *file, int line){ +static OPUS_INLINE opus_uint32 silk_MUL_uint_(opus_uint32 a32, opus_uint32 b32, char *file, int line){ opus_uint32 ret; ret = a32 * b32; if ( (opus_uint64)ret != (opus_uint64)a32 * (opus_uint64)b32 ) @@ -286,7 +286,7 @@ static inline opus_uint32 silk_MUL_uint_(opus_uint32 a32, opus_uint32 b32, char #undef silk_MLA #define silk_MLA(a,b,c) silk_MLA_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_MLA_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_MLA_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + b32 * c32; if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int64)c32 ) @@ -301,7 +301,7 @@ static inline opus_int32 silk_MLA_(opus_int32 a32, opus_int32 b32, opus_int32 c3 #undef silk_MLA_uint #define silk_MLA_uint(a,b,c) silk_MLA_uint_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_MLA_uint_(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_MLA_uint_(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32, char *file, int line){ opus_uint32 ret; ret = a32 + b32 * c32; if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int64)c32 ) @@ -316,7 +316,7 @@ static inline opus_int32 silk_MLA_uint_(opus_uint32 a32, opus_uint32 b32, opus_u #undef silk_SMULWB #define silk_SMULWB(a,b) silk_SMULWB_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_SMULWB_(opus_int32 a32, opus_int32 b32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMULWB_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 ret; ret = (a32 >> 16) * (opus_int32)((opus_int16)b32) + (((a32 & 0x0000FFFF) * (opus_int32)((opus_int16)b32)) >> 16); if ( (opus_int64)ret != ((opus_int64)a32 * (opus_int16)b32) >> 16 ) @@ -331,7 +331,7 @@ static inline opus_int32 silk_SMULWB_(opus_int32 a32, opus_int32 b32, char *file #undef silk_SMLAWB #define silk_SMLAWB(a,b,c) silk_SMLAWB_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_SMLAWB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMLAWB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = silk_ADD32( a32, silk_SMULWB( b32, c32 ) ); if ( silk_ADD32( a32, silk_SMULWB( b32, c32 ) ) != silk_ADD_SAT32( a32, silk_SMULWB( b32, c32 ) ) ) @@ -346,7 +346,7 @@ static inline opus_int32 silk_SMLAWB_(opus_int32 a32, opus_int32 b32, opus_int32 #undef silk_SMULWT #define silk_SMULWT(a,b) silk_SMULWT_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_SMULWT_(opus_int32 a32, opus_int32 b32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMULWT_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 ret; ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16); if ( (opus_int64)ret != ((opus_int64)a32 * (b32 >> 16)) >> 16 ) @@ -361,7 +361,7 @@ static inline opus_int32 silk_SMULWT_(opus_int32 a32, opus_int32 b32, char *file #undef silk_SMLAWT #define silk_SMLAWT(a,b,c) silk_SMLAWT_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_SMLAWT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMLAWT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16)); if ( (opus_int64)ret != (opus_int64)a32 + (((opus_int64)b32 * (c32 >> 16)) >> 16) ) @@ -376,7 +376,7 @@ static inline opus_int32 silk_SMLAWT_(opus_int32 a32, opus_int32 b32, opus_int32 #undef silk_SMULL #define silk_SMULL(a,b) silk_SMULL_((a), (b), __FILE__, __LINE__) -static inline opus_int64 silk_SMULL_(opus_int64 a64, opus_int64 b64, char *file, int line){ +static OPUS_INLINE opus_int64 silk_SMULL_(opus_int64 a64, opus_int64 b64, char *file, int line){ opus_int64 ret64; int fail = 0; ret64 = a64 * b64; @@ -398,7 +398,7 @@ static inline opus_int64 silk_SMULL_(opus_int64 a64, opus_int64 b64, char *file, /* no checking needed for silk_SMULBB */ #undef silk_SMLABB #define silk_SMLABB(a,b,c) silk_SMLABB_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_SMLABB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMLABB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + (opus_int32)((opus_int16)b32) * (opus_int32)((opus_int16)c32); if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int16)c32 ) @@ -414,7 +414,7 @@ static inline opus_int32 silk_SMLABB_(opus_int32 a32, opus_int32 b32, opus_int32 /* no checking needed for silk_SMULBT */ #undef silk_SMLABT #define silk_SMLABT(a,b,c) silk_SMLABT_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_SMLABT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMLABT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + ((opus_int32)((opus_int16)b32)) * (c32 >> 16); if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (c32 >> 16) ) @@ -430,7 +430,7 @@ static inline opus_int32 silk_SMLABT_(opus_int32 a32, opus_int32 b32, opus_int32 /* no checking needed for silk_SMULTT */ #undef silk_SMLATT #define silk_SMLATT(a,b,c) silk_SMLATT_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_SMLATT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMLATT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + (b32 >> 16) * (c32 >> 16); if ( (opus_int64)ret != (opus_int64)a32 + (b32 >> 16) * (c32 >> 16) ) @@ -445,7 +445,7 @@ static inline opus_int32 silk_SMLATT_(opus_int32 a32, opus_int32 b32, opus_int32 #undef silk_SMULWW #define silk_SMULWW(a,b) silk_SMULWW_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_SMULWW_(opus_int32 a32, opus_int32 b32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMULWW_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 ret, tmp1, tmp2; opus_int64 ret64; int fail = 0; @@ -476,7 +476,7 @@ static inline opus_int32 silk_SMULWW_(opus_int32 a32, opus_int32 b32, char *file #undef silk_SMLAWW #define silk_SMLAWW(a,b,c) silk_SMLAWW_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_SMLAWW_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SMLAWW_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret, tmp; tmp = silk_SMULWW( b32, c32 ); @@ -505,7 +505,7 @@ static inline opus_int32 silk_SMLAWW_(opus_int32 a32, opus_int32 b32, opus_int32 #undef silk_DIV32 #define silk_DIV32(a,b) silk_DIV32_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_DIV32_(opus_int32 a32, opus_int32 b32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_DIV32_(opus_int32 a32, opus_int32 b32, char *file, int line){ if ( b32 == 0 ) { fprintf (stderr, "silk_DIV32(%d, %d) in %s: line %d\n", a32, b32, file, line); @@ -518,7 +518,7 @@ static inline opus_int32 silk_DIV32_(opus_int32 a32, opus_int32 b32, char *file, #undef silk_DIV32_16 #define silk_DIV32_16(a,b) silk_DIV32_16_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_DIV32_16_(opus_int32 a32, opus_int32 b32, char *file, int line){ +static OPUS_INLINE opus_int32 silk_DIV32_16_(opus_int32 a32, opus_int32 b32, char *file, int line){ int fail = 0; fail |= b32 == 0; fail |= b32 > silk_int16_MAX; @@ -539,12 +539,11 @@ static inline opus_int32 silk_DIV32_16_(opus_int32 a32, opus_int32 b32, char *fi no checking needed for silk_POS_SAT32 no checking needed for silk_ADD_POS_SAT8 no checking needed for silk_ADD_POS_SAT16 - no checking needed for silk_ADD_POS_SAT32 - no checking needed for silk_ADD_POS_SAT64 */ + no checking needed for silk_ADD_POS_SAT32 */ #undef silk_LSHIFT8 #define silk_LSHIFT8(a,b) silk_LSHIFT8_((a), (b), __FILE__, __LINE__) -static inline opus_int8 silk_LSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int8 silk_LSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){ opus_int8 ret; int fail = 0; ret = a << shift; @@ -563,7 +562,7 @@ static inline opus_int8 silk_LSHIFT8_(opus_int8 a, opus_int32 shift, char *file, #undef silk_LSHIFT16 #define silk_LSHIFT16(a,b) silk_LSHIFT16_((a), (b), __FILE__, __LINE__) -static inline opus_int16 silk_LSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int16 silk_LSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){ opus_int16 ret; int fail = 0; ret = a << shift; @@ -582,7 +581,7 @@ static inline opus_int16 silk_LSHIFT16_(opus_int16 a, opus_int32 shift, char *fi #undef silk_LSHIFT32 #define silk_LSHIFT32(a,b) silk_LSHIFT32_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_LSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int32 silk_LSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){ opus_int32 ret; int fail = 0; ret = a << shift; @@ -601,7 +600,7 @@ static inline opus_int32 silk_LSHIFT32_(opus_int32 a, opus_int32 shift, char *fi #undef silk_LSHIFT64 #define silk_LSHIFT64(a,b) silk_LSHIFT64_((a), (b), __FILE__, __LINE__) -static inline opus_int64 silk_LSHIFT64_(opus_int64 a, opus_int shift, char *file, int line){ +static OPUS_INLINE opus_int64 silk_LSHIFT64_(opus_int64 a, opus_int shift, char *file, int line){ opus_int64 ret; int fail = 0; ret = a << shift; @@ -620,7 +619,7 @@ static inline opus_int64 silk_LSHIFT64_(opus_int64 a, opus_int shift, char *file #undef silk_LSHIFT_ovflw #define silk_LSHIFT_ovflw(a,b) silk_LSHIFT_ovflw_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_LSHIFT_ovflw_(opus_int32 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int32 silk_LSHIFT_ovflw_(opus_int32 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift >= 32) ) /* no check for overflow */ { fprintf (stderr, "silk_LSHIFT_ovflw(%d, %d) in %s: line %d\n", a, shift, file, line); @@ -633,7 +632,7 @@ static inline opus_int32 silk_LSHIFT_ovflw_(opus_int32 a, opus_int32 shift, char #undef silk_LSHIFT_uint #define silk_LSHIFT_uint(a,b) silk_LSHIFT_uint_((a), (b), __FILE__, __LINE__) -static inline opus_uint32 silk_LSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_uint32 silk_LSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){ opus_uint32 ret; ret = a << shift; if ( (shift < 0) || ((opus_int64)ret != ((opus_int64)a) << shift)) @@ -648,7 +647,7 @@ static inline opus_uint32 silk_LSHIFT_uint_(opus_uint32 a, opus_int32 shift, cha #undef silk_RSHIFT8 #define silk_RSHITF8(a,b) silk_RSHIFT8_((a), (b), __FILE__, __LINE__) -static inline opus_int8 silk_RSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int8 silk_RSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift>=8) ) { fprintf (stderr, "silk_RSHITF8(%d, %d) in %s: line %d\n", a, shift, file, line); @@ -661,7 +660,7 @@ static inline opus_int8 silk_RSHIFT8_(opus_int8 a, opus_int32 shift, char *file, #undef silk_RSHIFT16 #define silk_RSHITF16(a,b) silk_RSHIFT16_((a), (b), __FILE__, __LINE__) -static inline opus_int16 silk_RSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int16 silk_RSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift>=16) ) { fprintf (stderr, "silk_RSHITF16(%d, %d) in %s: line %d\n", a, shift, file, line); @@ -674,7 +673,7 @@ static inline opus_int16 silk_RSHIFT16_(opus_int16 a, opus_int32 shift, char *fi #undef silk_RSHIFT32 #define silk_RSHIFT32(a,b) silk_RSHIFT32_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_RSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int32 silk_RSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift>=32) ) { fprintf (stderr, "silk_RSHITF32(%d, %d) in %s: line %d\n", a, shift, file, line); @@ -687,7 +686,7 @@ static inline opus_int32 silk_RSHIFT32_(opus_int32 a, opus_int32 shift, char *fi #undef silk_RSHIFT64 #define silk_RSHIFT64(a,b) silk_RSHIFT64_((a), (b), __FILE__, __LINE__) -static inline opus_int64 silk_RSHIFT64_(opus_int64 a, opus_int64 shift, char *file, int line){ +static OPUS_INLINE opus_int64 silk_RSHIFT64_(opus_int64 a, opus_int64 shift, char *file, int line){ if ( (shift < 0) || (shift>=64) ) { fprintf (stderr, "silk_RSHITF64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)shift, file, line); @@ -700,7 +699,7 @@ static inline opus_int64 silk_RSHIFT64_(opus_int64 a, opus_int64 shift, char *fi #undef silk_RSHIFT_uint #define silk_RSHIFT_uint(a,b) silk_RSHIFT_uint_((a), (b), __FILE__, __LINE__) -static inline opus_uint32 silk_RSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_uint32 silk_RSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift>32) ) { fprintf (stderr, "silk_RSHIFT_uint(%u, %d) in %s: line %d\n", a, shift, file, line); @@ -713,7 +712,7 @@ static inline opus_uint32 silk_RSHIFT_uint_(opus_uint32 a, opus_int32 shift, cha #undef silk_ADD_LSHIFT #define silk_ADD_LSHIFT(a,b,c) silk_ADD_LSHIFT_((a), (b), (c), __FILE__, __LINE__) -static inline int silk_ADD_LSHIFT_(int a, int b, int shift, char *file, int line){ +static OPUS_INLINE int silk_ADD_LSHIFT_(int a, int b, int shift, char *file, int line){ opus_int16 ret; ret = a + (b << shift); if ( (shift < 0) || (shift>15) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) << shift)) ) @@ -728,7 +727,7 @@ static inline int silk_ADD_LSHIFT_(int a, int b, int shift, char *file, int line #undef silk_ADD_LSHIFT32 #define silk_ADD_LSHIFT32(a,b,c) silk_ADD_LSHIFT32_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_ADD_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int32 silk_ADD_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = a + (b << shift); if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) << shift)) ) @@ -743,7 +742,7 @@ static inline opus_int32 silk_ADD_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int #undef silk_ADD_LSHIFT_uint #define silk_ADD_LSHIFT_uint(a,b,c) silk_ADD_LSHIFT_uint_((a), (b), (c), __FILE__, __LINE__) -static inline opus_uint32 silk_ADD_LSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_uint32 silk_ADD_LSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){ opus_uint32 ret; ret = a + (b << shift); if ( (shift < 0) || (shift>32) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) << shift)) ) @@ -758,7 +757,7 @@ static inline opus_uint32 silk_ADD_LSHIFT_uint_(opus_uint32 a, opus_uint32 b, op #undef silk_ADD_RSHIFT #define silk_ADD_RSHIFT(a,b,c) silk_ADD_RSHIFT_((a), (b), (c), __FILE__, __LINE__) -static inline int silk_ADD_RSHIFT_(int a, int b, int shift, char *file, int line){ +static OPUS_INLINE int silk_ADD_RSHIFT_(int a, int b, int shift, char *file, int line){ opus_int16 ret; ret = a + (b >> shift); if ( (shift < 0) || (shift>15) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) @@ -773,7 +772,7 @@ static inline int silk_ADD_RSHIFT_(int a, int b, int shift, char *file, int line #undef silk_ADD_RSHIFT32 #define silk_ADD_RSHIFT32(a,b,c) silk_ADD_RSHIFT32_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_ADD_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int32 silk_ADD_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = a + (b >> shift); if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) @@ -788,7 +787,7 @@ static inline opus_int32 silk_ADD_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int #undef silk_ADD_RSHIFT_uint #define silk_ADD_RSHIFT_uint(a,b,c) silk_ADD_RSHIFT_uint_((a), (b), (c), __FILE__, __LINE__) -static inline opus_uint32 silk_ADD_RSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_uint32 silk_ADD_RSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){ opus_uint32 ret; ret = a + (b >> shift); if ( (shift < 0) || (shift>32) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) @@ -803,7 +802,7 @@ static inline opus_uint32 silk_ADD_RSHIFT_uint_(opus_uint32 a, opus_uint32 b, op #undef silk_SUB_LSHIFT32 #define silk_SUB_LSHIFT32(a,b,c) silk_SUB_LSHIFT32_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_SUB_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SUB_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = a - (b << shift); if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a - (((opus_int64)b) << shift)) ) @@ -818,7 +817,7 @@ static inline opus_int32 silk_SUB_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int #undef silk_SUB_RSHIFT32 #define silk_SUB_RSHIFT32(a,b,c) silk_SUB_RSHIFT32_((a), (b), (c), __FILE__, __LINE__) -static inline opus_int32 silk_SUB_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int32 silk_SUB_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = a - (b >> shift); if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a - (((opus_int64)b) >> shift)) ) @@ -833,7 +832,7 @@ static inline opus_int32 silk_SUB_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int #undef silk_RSHIFT_ROUND #define silk_RSHIFT_ROUND(a,b) silk_RSHIFT_ROUND_((a), (b), __FILE__, __LINE__) -static inline opus_int32 silk_RSHIFT_ROUND_(opus_int32 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int32 silk_RSHIFT_ROUND_(opus_int32 a, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; /* the marco definition can't handle a shift of zero */ @@ -849,7 +848,7 @@ static inline opus_int32 silk_RSHIFT_ROUND_(opus_int32 a, opus_int32 shift, char #undef silk_RSHIFT_ROUND64 #define silk_RSHIFT_ROUND64(a,b) silk_RSHIFT_ROUND64_((a), (b), __FILE__, __LINE__) -static inline opus_int64 silk_RSHIFT_ROUND64_(opus_int64 a, opus_int32 shift, char *file, int line){ +static OPUS_INLINE opus_int64 silk_RSHIFT_ROUND64_(opus_int64 a, opus_int32 shift, char *file, int line){ opus_int64 ret; /* the marco definition can't handle a shift of zero */ if ( (shift <= 0) || (shift>=64) ) @@ -865,14 +864,14 @@ static inline opus_int64 silk_RSHIFT_ROUND64_(opus_int64 a, opus_int32 shift, ch /* silk_abs is used on floats also, so doesn't work... */ /*#undef silk_abs -static inline opus_int32 silk_abs(opus_int32 a){ +static OPUS_INLINE opus_int32 silk_abs(opus_int32 a){ silk_assert(a != 0x80000000); return (((a) > 0) ? (a) : -(a)); // Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN }*/ #undef silk_abs_int64 #define silk_abs_int64(a) silk_abs_int64_((a), __FILE__, __LINE__) -static inline opus_int64 silk_abs_int64_(opus_int64 a, char *file, int line){ +static OPUS_INLINE opus_int64 silk_abs_int64_(opus_int64 a, char *file, int line){ if ( a == silk_int64_MIN ) { fprintf (stderr, "silk_abs_int64(%lld) in %s: line %d\n", (long long)a, file, line); @@ -885,7 +884,7 @@ static inline opus_int64 silk_abs_int64_(opus_int64 a, char *file, int line){ #undef silk_abs_int32 #define silk_abs_int32(a) silk_abs_int32_((a), __FILE__, __LINE__) -static inline opus_int32 silk_abs_int32_(opus_int32 a, char *file, int line){ +static OPUS_INLINE opus_int32 silk_abs_int32_(opus_int32 a, char *file, int line){ if ( a == silk_int32_MIN ) { fprintf (stderr, "silk_abs_int32(%d) in %s: line %d\n", a, file, line); @@ -898,7 +897,7 @@ static inline opus_int32 silk_abs_int32_(opus_int32 a, char *file, int line){ #undef silk_CHECK_FIT8 #define silk_CHECK_FIT8(a) silk_CHECK_FIT8_((a), __FILE__, __LINE__) -static inline opus_int8 silk_CHECK_FIT8_( opus_int64 a, char *file, int line ){ +static OPUS_INLINE opus_int8 silk_CHECK_FIT8_( opus_int64 a, char *file, int line ){ opus_int8 ret; ret = (opus_int8)a; if ( (opus_int64)ret != a ) @@ -913,7 +912,7 @@ static inline opus_int8 silk_CHECK_FIT8_( opus_int64 a, char *file, int line ){ #undef silk_CHECK_FIT16 #define silk_CHECK_FIT16(a) silk_CHECK_FIT16_((a), __FILE__, __LINE__) -static inline opus_int16 silk_CHECK_FIT16_( opus_int64 a, char *file, int line ){ +static OPUS_INLINE opus_int16 silk_CHECK_FIT16_( opus_int64 a, char *file, int line ){ opus_int16 ret; ret = (opus_int16)a; if ( (opus_int64)ret != a ) @@ -928,7 +927,7 @@ static inline opus_int16 silk_CHECK_FIT16_( opus_int64 a, char *file, int line ) #undef silk_CHECK_FIT32 #define silk_CHECK_FIT32(a) silk_CHECK_FIT32_((a), __FILE__, __LINE__) -static inline opus_int32 silk_CHECK_FIT32_( opus_int64 a, char *file, int line ){ +static OPUS_INLINE opus_int32 silk_CHECK_FIT32_( opus_int64 a, char *file, int line ){ opus_int32 ret; ret = (opus_int32)a; if ( (opus_int64)ret != a ) diff --git a/external/opus-1.0.3/silk/NLSF2A.c b/external/opus-1.3.1/silk/NLSF2A.c similarity index 70% rename from external/opus-1.0.3/silk/NLSF2A.c rename to external/opus-1.3.1/silk/NLSF2A.c index 10b66b64..d5b77306 100644 --- a/external/opus-1.0.3/silk/NLSF2A.c +++ b/external/opus-1.3.1/silk/NLSF2A.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -41,7 +41,7 @@ POSSIBILITY OF SUCH DAMAGE. #define QA 16 /* helper function for NLSF2A(..) */ -static inline void silk_NLSF2A_find_poly( +static OPUS_INLINE void silk_NLSF2A_find_poly( opus_int32 *out, /* O intermediate polynomial, QA [dd+1] */ const opus_int32 *cLSF, /* I vector of interleaved 2*cos(LSFs), QA [d] */ opus_int dd /* I polynomial order (= 1/2 * filter order) */ @@ -66,7 +66,8 @@ static inline void silk_NLSF2A_find_poly( void silk_NLSF2A( opus_int16 *a_Q12, /* O monic whitening filter coefficients in Q12, [ d ] */ const opus_int16 *NLSF, /* I normalized line spectral frequencies in Q15, [ d ] */ - const opus_int d /* I filter order (should be even) */ + const opus_int d, /* I filter order (should be even) */ + int arch /* I Run-time architecture */ ) { /* This ordering was found to maximize quality. It improves numerical accuracy of @@ -83,15 +84,14 @@ void silk_NLSF2A( opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ], Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; opus_int32 Ptmp, Qtmp, f_int, f_frac, cos_val, delta; opus_int32 a32_QA1[ SILK_MAX_ORDER_LPC ]; - opus_int32 maxabs, absval, idx=0, sc_Q16; silk_assert( LSF_COS_TAB_SZ_FIX == 128 ); - silk_assert( d==10||d==16 ); + celt_assert( d==10 || d==16 ); /* convert LSFs to 2*cos(LSF), using piecewise linear curve from table */ ordering = d == 16 ? ordering16 : ordering10; for( k = 0; k < d; k++ ) { - silk_assert(NLSF[k] >= 0 ); + silk_assert( NLSF[k] >= 0 ); /* f_int on a scale 0-127 (rounded down) */ f_int = silk_RSHIFT( NLSF[k], 15 - 7 ); @@ -126,52 +126,15 @@ void silk_NLSF2A( a32_QA1[ d-k-1 ] = Qtmp - Ptmp; /* QA+1 */ } - /* Limit the maximum absolute value of the prediction coefficients, so that they'll fit in int16 */ - for( i = 0; i < 10; i++ ) { - /* Find maximum absolute value and its index */ - maxabs = 0; - for( k = 0; k < d; k++ ) { - absval = silk_abs( a32_QA1[k] ); - if( absval > maxabs ) { - maxabs = absval; - idx = k; - } - } - maxabs = silk_RSHIFT_ROUND( maxabs, QA + 1 - 12 ); /* QA+1 -> Q12 */ - - if( maxabs > silk_int16_MAX ) { - /* Reduce magnitude of prediction coefficients */ - maxabs = silk_min( maxabs, 163838 ); /* ( silk_int32_MAX >> 14 ) + silk_int16_MAX = 163838 */ - sc_Q16 = SILK_FIX_CONST( 0.999, 16 ) - silk_DIV32( silk_LSHIFT( maxabs - silk_int16_MAX, 14 ), - silk_RSHIFT32( silk_MUL( maxabs, idx + 1), 2 ) ); - silk_bwexpander_32( a32_QA1, d, sc_Q16 ); - } else { - break; - } - } + /* Convert int32 coefficients to Q12 int16 coefs */ + silk_LPC_fit( a_Q12, a32_QA1, 12, QA + 1, d ); - if( i == 10 ) { - /* Reached the last iteration, clip the coefficients */ + for( i = 0; silk_LPC_inverse_pred_gain( a_Q12, d, arch ) == 0 && i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) { + /* Prediction coefficients are (too close to) unstable; apply bandwidth expansion */ + /* on the unscaled coefficients, convert to Q12 and measure again */ + silk_bwexpander_32( a32_QA1, d, 65536 - silk_LSHIFT( 2, i ) ); for( k = 0; k < d; k++ ) { - a_Q12[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ) ); /* QA+1 -> Q12 */ - a32_QA1[ k ] = silk_LSHIFT( (opus_int32)a_Q12[ k ], QA + 1 - 12 ); - } - } else { - for( k = 0; k < d; k++ ) { - a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ - } - } - - for( i = 0; i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) { - if( silk_LPC_inverse_pred_gain( a_Q12, d ) < SILK_FIX_CONST( 1.0 / MAX_PREDICTION_POWER_GAIN, 30 ) ) { - /* Prediction coefficients are (too close to) unstable; apply bandwidth expansion */ - /* on the unscaled coefficients, convert to Q12 and measure again */ - silk_bwexpander_32( a32_QA1, d, 65536 - silk_LSHIFT( 2, i ) ); - for( k = 0; k < d; k++ ) { - a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ - } - } else { - break; + a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ } } } diff --git a/external/opus-1.0.3/silk/NLSF_VQ.c b/external/opus-1.3.1/silk/NLSF_VQ.c similarity index 62% rename from external/opus-1.0.3/silk/NLSF_VQ.c rename to external/opus-1.3.1/silk/NLSF_VQ.c index 352dda26..b83182a7 100644 --- a/external/opus-1.0.3/silk/NLSF_VQ.c +++ b/external/opus-1.3.1/silk/NLSF_VQ.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -33,36 +33,44 @@ POSSIBILITY OF SUCH DAMAGE. /* Compute quantization errors for an LPC_order element input vector for a VQ codebook */ void silk_NLSF_VQ( - opus_int32 err_Q26[], /* O Quantization errors [K] */ + opus_int32 err_Q24[], /* O Quantization errors [K] */ const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ + const opus_int16 pWght_Q9[], /* I Codebook weights [K*LPC_order] */ const opus_int K, /* I Number of codebook vectors */ const opus_int LPC_order /* I Number of LPCs */ ) { - opus_int i, m; - opus_int32 diff_Q15, sum_error_Q30, sum_error_Q26; + opus_int i, m; + opus_int32 diff_Q15, diffw_Q24, sum_error_Q24, pred_Q24; + const opus_int16 *w_Q9_ptr; + const opus_uint8 *cb_Q8_ptr; - silk_assert( LPC_order <= 16 ); - silk_assert( ( LPC_order & 1 ) == 0 ); + celt_assert( ( LPC_order & 1 ) == 0 ); /* Loop over codebook */ + cb_Q8_ptr = pCB_Q8; + w_Q9_ptr = pWght_Q9; for( i = 0; i < K; i++ ) { - sum_error_Q26 = 0; - for( m = 0; m < LPC_order; m += 2 ) { - /* Compute weighted squared quantization error for index m */ - diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m ], (opus_int32)*pCB_Q8++, 7 ); /* range: [ -32767 : 32767 ]*/ - sum_error_Q30 = silk_SMULBB( diff_Q15, diff_Q15 ); + sum_error_Q24 = 0; + pred_Q24 = 0; + for( m = LPC_order-2; m >= 0; m -= 2 ) { + /* Compute weighted absolute predictive quantization error for index m + 1 */ + diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m + 1 ], (opus_int32)cb_Q8_ptr[ m + 1 ], 7 ); /* range: [ -32767 : 32767 ]*/ + diffw_Q24 = silk_SMULBB( diff_Q15, w_Q9_ptr[ m + 1 ] ); + sum_error_Q24 = silk_ADD32( sum_error_Q24, silk_abs( silk_SUB_RSHIFT32( diffw_Q24, pred_Q24, 1 ) ) ); + pred_Q24 = diffw_Q24; - /* Compute weighted squared quantization error for index m + 1 */ - diff_Q15 = silk_SUB_LSHIFT32( in_Q15[m + 1], (opus_int32)*pCB_Q8++, 7 ); /* range: [ -32767 : 32767 ]*/ - sum_error_Q30 = silk_SMLABB( sum_error_Q30, diff_Q15, diff_Q15 ); + /* Compute weighted absolute predictive quantization error for index m */ + diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m ], (opus_int32)cb_Q8_ptr[ m ], 7 ); /* range: [ -32767 : 32767 ]*/ + diffw_Q24 = silk_SMULBB( diff_Q15, w_Q9_ptr[ m ] ); + sum_error_Q24 = silk_ADD32( sum_error_Q24, silk_abs( silk_SUB_RSHIFT32( diffw_Q24, pred_Q24, 1 ) ) ); + pred_Q24 = diffw_Q24; - sum_error_Q26 = silk_ADD_RSHIFT32( sum_error_Q26, sum_error_Q30, 4 ); - - silk_assert( sum_error_Q26 >= 0 ); - silk_assert( sum_error_Q30 >= 0 ); + silk_assert( sum_error_Q24 >= 0 ); } - err_Q26[ i ] = sum_error_Q26; + err_Q24[ i ] = sum_error_Q24; + cb_Q8_ptr += LPC_order; + w_Q9_ptr += LPC_order; } } diff --git a/external/opus-1.0.3/silk/NLSF_VQ_weights_laroia.c b/external/opus-1.3.1/silk/NLSF_VQ_weights_laroia.c similarity index 97% rename from external/opus-1.0.3/silk/NLSF_VQ_weights_laroia.c rename to external/opus-1.3.1/silk/NLSF_VQ_weights_laroia.c index 05bb17af..9873bcde 100644 --- a/external/opus-1.0.3/silk/NLSF_VQ_weights_laroia.c +++ b/external/opus-1.3.1/silk/NLSF_VQ_weights_laroia.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -48,8 +48,8 @@ void silk_NLSF_VQ_weights_laroia( opus_int k; opus_int32 tmp1_int, tmp2_int; - silk_assert( D > 0 ); - silk_assert( ( D & 1 ) == 0 ); + celt_assert( D > 0 ); + celt_assert( ( D & 1 ) == 0 ); /* First value */ tmp1_int = silk_max_int( pNLSF_Q15[ 0 ], 1 ); diff --git a/external/opus-1.0.3/silk/NLSF_decode.c b/external/opus-1.3.1/silk/NLSF_decode.c similarity index 85% rename from external/opus-1.0.3/silk/NLSF_decode.c rename to external/opus-1.3.1/silk/NLSF_decode.c index e007c49a..eeb0ba8c 100644 --- a/external/opus-1.0.3/silk/NLSF_decode.c +++ b/external/opus-1.3.1/silk/NLSF_decode.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -32,7 +32,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "main.h" /* Predictive dequantizer for NLSF residuals */ -static inline void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ +static OPUS_INLINE void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ opus_int16 x_Q10[], /* O Output [ order ] */ const opus_int8 indices[], /* I Quantization indices [ order ] */ const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ @@ -70,15 +70,9 @@ void silk_NLSF_decode( opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; opus_int16 ec_ix[ MAX_LPC_ORDER ]; opus_int16 res_Q10[ MAX_LPC_ORDER ]; - opus_int16 W_tmp_QW[ MAX_LPC_ORDER ]; - opus_int32 W_tmp_Q9, NLSF_Q15_tmp; + opus_int32 NLSF_Q15_tmp; const opus_uint8 *pCB_element; - - /* Decode first stage */ - pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; - for( i = 0; i < psNLSF_CB->order; i++ ) { - pNLSF_Q15[ i ] = silk_LSHIFT( (opus_int16)pCB_element[ i ], 7 ); - } + const opus_int16 *pCB_Wght_Q9; /* Unpack entropy table indices and predictor for current CB1 index */ silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, NLSFIndices[ 0 ] ); @@ -86,13 +80,11 @@ void silk_NLSF_decode( /* Predictive residual dequantizer */ silk_NLSF_residual_dequant( res_Q10, &NLSFIndices[ 1 ], pred_Q8, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->order ); - /* Weights from codebook vector */ - silk_NLSF_VQ_weights_laroia( W_tmp_QW, pNLSF_Q15, psNLSF_CB->order ); - - /* Apply inverse square-rooted weights and add to output */ + /* Apply inverse square-rooted weights to first stage and add to output */ + pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; + pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; for( i = 0; i < psNLSF_CB->order; i++ ) { - W_tmp_Q9 = silk_SQRT_APPROX( silk_LSHIFT( (opus_int32)W_tmp_QW[ i ], 18 - NLSF_W_Q ) ); - NLSF_Q15_tmp = silk_ADD32( pNLSF_Q15[ i ], silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), W_tmp_Q9 ) ); + NLSF_Q15_tmp = silk_ADD_LSHIFT32( silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), pCB_Wght_Q9[ i ] ), (opus_int16)pCB_element[ i ], 7 ); pNLSF_Q15[ i ] = (opus_int16)silk_LIMIT( NLSF_Q15_tmp, 0, 32767 ); } diff --git a/external/opus-1.0.3/silk/NLSF_del_dec_quant.c b/external/opus-1.3.1/silk/NLSF_del_dec_quant.c similarity index 84% rename from external/opus-1.0.3/silk/NLSF_del_dec_quant.c rename to external/opus-1.3.1/silk/NLSF_del_dec_quant.c index 78870de5..44a16acd 100644 --- a/external/opus-1.0.3/silk/NLSF_del_dec_quant.c +++ b/external/opus-1.3.1/silk/NLSF_del_dec_quant.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -46,8 +46,9 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns ) { opus_int i, j, nStates, ind_tmp, ind_min_max, ind_max_min, in_Q10, res_Q10; - opus_int pred_Q10, diff_Q10, out0_Q10, out1_Q10, rate0_Q5, rate1_Q5; - opus_int32 RD_tmp_Q25, min_Q25, min_max_Q25, max_min_Q25, pred_coef_Q16; + opus_int pred_Q10, diff_Q10, rate0_Q5, rate1_Q5; + opus_int16 out0_Q10, out1_Q10; + opus_int32 RD_tmp_Q25, min_Q25, min_max_Q25, max_min_Q25; opus_int ind_sort[ NLSF_QUANT_DEL_DEC_STATES ]; opus_int8 ind[ NLSF_QUANT_DEL_DEC_STATES ][ MAX_LPC_ORDER ]; opus_int16 prev_out_Q10[ 2 * NLSF_QUANT_DEL_DEC_STATES ]; @@ -56,38 +57,47 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns opus_int32 RD_max_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; const opus_uint8 *rates_Q5; + opus_int out0_Q10_table[2 * NLSF_QUANT_MAX_AMPLITUDE_EXT]; + opus_int out1_Q10_table[2 * NLSF_QUANT_MAX_AMPLITUDE_EXT]; + + for (i = -NLSF_QUANT_MAX_AMPLITUDE_EXT; i <= NLSF_QUANT_MAX_AMPLITUDE_EXT-1; i++) + { + out0_Q10 = silk_LSHIFT( i, 10 ); + out1_Q10 = silk_ADD16( out0_Q10, 1024 ); + if( i > 0 ) { + out0_Q10 = silk_SUB16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } else if( i == 0 ) { + out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } else if( i == -1 ) { + out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } else { + out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + out1_Q10 = silk_ADD16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); + } + out0_Q10_table[ i + NLSF_QUANT_MAX_AMPLITUDE_EXT ] = silk_RSHIFT( silk_SMULBB( out0_Q10, quant_step_size_Q16 ), 16 ); + out1_Q10_table[ i + NLSF_QUANT_MAX_AMPLITUDE_EXT ] = silk_RSHIFT( silk_SMULBB( out1_Q10, quant_step_size_Q16 ), 16 ); + } + silk_assert( (NLSF_QUANT_DEL_DEC_STATES & (NLSF_QUANT_DEL_DEC_STATES-1)) == 0 ); /* must be power of two */ nStates = 1; RD_Q25[ 0 ] = 0; prev_out_Q10[ 0 ] = 0; - for( i = order - 1; ; i-- ) { + for( i = order - 1; i >= 0; i-- ) { rates_Q5 = &ec_rates_Q5[ ec_ix[ i ] ]; - pred_coef_Q16 = silk_LSHIFT( (opus_int32)pred_coef_Q8[ i ], 8 ); in_Q10 = x_Q10[ i ]; for( j = 0; j < nStates; j++ ) { - pred_Q10 = silk_SMULWB( pred_coef_Q16, prev_out_Q10[ j ] ); + pred_Q10 = silk_RSHIFT( silk_SMULBB( (opus_int16)pred_coef_Q8[ i ], prev_out_Q10[ j ] ), 8 ); res_Q10 = silk_SUB16( in_Q10, pred_Q10 ); - ind_tmp = silk_SMULWB( (opus_int32)inv_quant_step_size_Q6, res_Q10 ); + ind_tmp = silk_RSHIFT( silk_SMULBB( inv_quant_step_size_Q6, res_Q10 ), 16 ); ind_tmp = silk_LIMIT( ind_tmp, -NLSF_QUANT_MAX_AMPLITUDE_EXT, NLSF_QUANT_MAX_AMPLITUDE_EXT-1 ); ind[ j ][ i ] = (opus_int8)ind_tmp; /* compute outputs for ind_tmp and ind_tmp + 1 */ - out0_Q10 = silk_LSHIFT( ind_tmp, 10 ); - out1_Q10 = silk_ADD16( out0_Q10, 1024 ); - if( ind_tmp > 0 ) { - out0_Q10 = silk_SUB16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); - out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); - } else if( ind_tmp == 0 ) { - out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); - } else if( ind_tmp == -1 ) { - out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); - } else { - out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); - out1_Q10 = silk_ADD16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); - } - out0_Q10 = silk_SMULWB( (opus_int32)out0_Q10, quant_step_size_Q16 ); - out1_Q10 = silk_SMULWB( (opus_int32)out1_Q10, quant_step_size_Q16 ); + out0_Q10 = out0_Q10_table[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE_EXT ]; + out1_Q10 = out1_Q10_table[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE_EXT ]; + out0_Q10 = silk_ADD16( out0_Q10, pred_Q10 ); out1_Q10 = silk_ADD16( out1_Q10, pred_Q10 ); prev_out_Q10[ j ] = out0_Q10; @@ -121,7 +131,7 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns RD_Q25[ j + nStates ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate1_Q5 ); } - if( nStates < NLSF_QUANT_DEL_DEC_STATES ) { + if( nStates <= NLSF_QUANT_DEL_DEC_STATES/2 ) { /* double number of states and copy */ for( j = 0; j < nStates; j++ ) { ind[ j + nStates ][ i ] = ind[ j ][ i ] + 1; @@ -130,7 +140,7 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns for( j = nStates; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { ind[ j ][ i ] = ind[ j - nStates ][ i ]; } - } else if( i > 0 ) { + } else { /* sort lower and upper half of RD_Q25, pairwise */ for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { if( RD_Q25[ j ] > RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] ) { @@ -181,8 +191,6 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { ind[ j ][ i ] += silk_RSHIFT( ind_sort[ j ], NLSF_QUANT_DEL_DEC_STATES_LOG2 ); } - } else { /* i == 0 */ - break; } } diff --git a/external/opus-1.0.3/silk/NLSF_encode.c b/external/opus-1.3.1/silk/NLSF_encode.c similarity index 77% rename from external/opus-1.0.3/silk/NLSF_encode.c rename to external/opus-1.3.1/silk/NLSF_encode.c index 52a263d9..01ac7db7 100644 --- a/external/opus-1.0.3/silk/NLSF_encode.c +++ b/external/opus-1.3.1/silk/NLSF_encode.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,47 +30,52 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main.h" +#include "stack_alloc.h" /***********************/ /* NLSF vector encoder */ /***********************/ opus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */ opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ - opus_int16 *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */ + opus_int16 *pNLSF_Q15, /* I/O (Un)quantized NLSF vector [ LPC_ORDER ] */ const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ - const opus_int16 *pW_QW, /* I NLSF weight vector [ LPC_ORDER ] */ + const opus_int16 *pW_Q2, /* I NLSF weight vector [ LPC_ORDER ] */ const opus_int NLSF_mu_Q20, /* I Rate weight for the RD optimization */ const opus_int nSurvivors, /* I Max survivors after first stage */ const opus_int signalType /* I Signal type: 0/1/2 */ ) { opus_int i, s, ind1, bestIndex, prob_Q8, bits_q7; - opus_int32 W_tmp_Q9; - opus_int32 err_Q26[ NLSF_VQ_MAX_VECTORS ]; - opus_int32 RD_Q25[ NLSF_VQ_MAX_SURVIVORS ]; - opus_int tempIndices1[ NLSF_VQ_MAX_SURVIVORS ]; - opus_int8 tempIndices2[ NLSF_VQ_MAX_SURVIVORS * MAX_LPC_ORDER ]; - opus_int16 res_Q15[ MAX_LPC_ORDER ]; + opus_int32 W_tmp_Q9, ret; + VARDECL( opus_int32, err_Q24 ); + VARDECL( opus_int32, RD_Q25 ); + VARDECL( opus_int, tempIndices1 ); + VARDECL( opus_int8, tempIndices2 ); opus_int16 res_Q10[ MAX_LPC_ORDER ]; opus_int16 NLSF_tmp_Q15[ MAX_LPC_ORDER ]; - opus_int16 W_tmp_QW[ MAX_LPC_ORDER ]; opus_int16 W_adj_Q5[ MAX_LPC_ORDER ]; opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; opus_int16 ec_ix[ MAX_LPC_ORDER ]; const opus_uint8 *pCB_element, *iCDF_ptr; + const opus_int16 *pCB_Wght_Q9; + SAVE_STACK; - silk_assert( nSurvivors <= NLSF_VQ_MAX_SURVIVORS ); - silk_assert( signalType >= 0 && signalType <= 2 ); + celt_assert( signalType >= 0 && signalType <= 2 ); silk_assert( NLSF_mu_Q20 <= 32767 && NLSF_mu_Q20 >= 0 ); /* NLSF stabilization */ silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); /* First stage: VQ */ - silk_NLSF_VQ( err_Q26, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->nVectors, psNLSF_CB->order ); + ALLOC( err_Q24, psNLSF_CB->nVectors, opus_int32 ); + silk_NLSF_VQ( err_Q24, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->CB1_Wght_Q9, psNLSF_CB->nVectors, psNLSF_CB->order ); /* Sort the quantization errors */ - silk_insertion_sort_increasing( err_Q26, tempIndices1, psNLSF_CB->nVectors, nSurvivors ); + ALLOC( tempIndices1, nSurvivors, opus_int ); + silk_insertion_sort_increasing( err_Q24, tempIndices1, psNLSF_CB->nVectors, nSurvivors ); + + ALLOC( RD_Q25, nSurvivors, opus_int32 ); + ALLOC( tempIndices2, nSurvivors * MAX_LPC_ORDER, opus_int8 ); /* Loop over survivors */ for( s = 0; s < nSurvivors; s++ ) { @@ -78,23 +83,12 @@ opus_int32 silk_NLSF_encode( /* O Returns /* Residual after first stage */ pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ ind1 * psNLSF_CB->order ]; + pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ ind1 * psNLSF_CB->order ]; for( i = 0; i < psNLSF_CB->order; i++ ) { NLSF_tmp_Q15[ i ] = silk_LSHIFT16( (opus_int16)pCB_element[ i ], 7 ); - res_Q15[ i ] = pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ]; - } - - /* Weights from codebook vector */ - silk_NLSF_VQ_weights_laroia( W_tmp_QW, NLSF_tmp_Q15, psNLSF_CB->order ); - - /* Apply square-rooted weights */ - for( i = 0; i < psNLSF_CB->order; i++ ) { - W_tmp_Q9 = silk_SQRT_APPROX( silk_LSHIFT( (opus_int32)W_tmp_QW[ i ], 18 - NLSF_W_Q ) ); - res_Q10[ i ] = (opus_int16)silk_RSHIFT( silk_SMULBB( res_Q15[ i ], W_tmp_Q9 ), 14 ); - } - - /* Modify input weights accordingly */ - for( i = 0; i < psNLSF_CB->order; i++ ) { - W_adj_Q5[ i ] = silk_DIV32_16( silk_LSHIFT( (opus_int32)pW_QW[ i ], 5 ), W_tmp_QW[ i ] ); + W_tmp_Q9 = pCB_Wght_Q9[ i ]; + res_Q10[ i ] = (opus_int16)silk_RSHIFT( silk_SMULBB( pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ], W_tmp_Q9 ), 14 ); + W_adj_Q5[ i ] = silk_DIV32_varQ( (opus_int32)pW_Q2[ i ], silk_SMULBB( W_tmp_Q9, W_tmp_Q9 ), 21 ); } /* Unpack entropy table indices and predictor for current CB1 index */ @@ -124,5 +118,7 @@ opus_int32 silk_NLSF_encode( /* O Returns /* Decode */ silk_NLSF_decode( pNLSF_Q15, NLSFIndices, psNLSF_CB ); - return RD_Q25[ 0 ]; + ret = RD_Q25[ 0 ]; + RESTORE_STACK; + return ret; } diff --git a/external/opus-1.0.3/silk/NLSF_stabilize.c b/external/opus-1.3.1/silk/NLSF_stabilize.c similarity index 99% rename from external/opus-1.0.3/silk/NLSF_stabilize.c rename to external/opus-1.3.1/silk/NLSF_stabilize.c index 7bf047af..8f3426b9 100644 --- a/external/opus-1.0.3/silk/NLSF_stabilize.c +++ b/external/opus-1.3.1/silk/NLSF_stabilize.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/NLSF_unpack.c b/external/opus-1.3.1/silk/NLSF_unpack.c similarity index 99% rename from external/opus-1.0.3/silk/NLSF_unpack.c rename to external/opus-1.3.1/silk/NLSF_unpack.c index 47f6cfe8..17bd23f7 100644 --- a/external/opus-1.0.3/silk/NLSF_unpack.c +++ b/external/opus-1.3.1/silk/NLSF_unpack.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/NSQ.c b/external/opus-1.3.1/silk/NSQ.c similarity index 80% rename from external/opus-1.0.3/silk/NSQ.c rename to external/opus-1.3.1/silk/NSQ.c index b49cdf58..1d64d8e2 100644 --- a/external/opus-1.0.3/silk/NSQ.c +++ b/external/opus-1.3.1/silk/NSQ.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,11 +30,14 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main.h" +#include "stack_alloc.h" +#include "NSQ.h" -static inline void silk_nsq_scale_states( + +static OPUS_INLINE void silk_nsq_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ - const opus_int32 x_Q3[], /* I input in Q3 */ + const opus_int16 x16[], /* I input */ opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ @@ -45,7 +48,8 @@ static inline void silk_nsq_scale_states( const opus_int signal_type /* I Signal type */ ); -static inline void silk_noise_shape_quantizer( +#if !defined(OPUS_X86_MAY_HAVE_SSE4_1) +static OPUS_INLINE void silk_noise_shape_quantizer( silk_nsq_state *NSQ, /* I/O NSQ state */ opus_int signalType, /* I Signal type */ const opus_int32 x_sc_Q10[], /* I */ @@ -64,18 +68,21 @@ static inline void silk_noise_shape_quantizer( opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int shapingLPCOrder, /* I Noise shaping AR filter order */ - opus_int predictLPCOrder /* I Prediction filter order */ + opus_int predictLPCOrder, /* I Prediction filter order */ + int arch /* I Architecture */ ); +#endif -void silk_NSQ( - const silk_encoder_state *psEncC, /* I/O Encoder State */ +void silk_NSQ_c +( + const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int32 x_Q3[], /* I Prefiltered input signal */ + const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ @@ -88,11 +95,12 @@ void silk_NSQ( opus_int k, lag, start_idx, LSF_interpolation_flag; const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; opus_int16 *pxq; - opus_int32 sLTP_Q15[ 2 * MAX_FRAME_LENGTH ]; - opus_int16 sLTP[ 2 * MAX_FRAME_LENGTH ]; + VARDECL( opus_int32, sLTP_Q15 ); + VARDECL( opus_int16, sLTP ); opus_int32 HarmShapeFIRPacked_Q14; opus_int offset_Q10; - opus_int32 x_sc_Q10[ MAX_SUB_FRAME_LENGTH ]; + VARDECL( opus_int32, x_sc_Q10 ); + SAVE_STACK; NSQ->rand_seed = psIndices->Seed; @@ -109,6 +117,9 @@ void silk_NSQ( LSF_interpolation_flag = 1; } + ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); + ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); + ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); /* Set up pointers to start of sub frame */ NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; @@ -116,7 +127,7 @@ void silk_NSQ( for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; - AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; + AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); @@ -132,23 +143,23 @@ void silk_NSQ( if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - silk_assert( start_idx > 0 ); + celt_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], - A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder ); + A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); NSQ->rewhite_flag = 1; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; } } - silk_nsq_scale_states( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); + silk_nsq_scale_states( psEncC, NSQ, x16, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, - offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder ); + offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->arch ); - x_Q3 += psEncC->subfr_length; + x16 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } @@ -157,15 +168,19 @@ void silk_NSQ( NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech and noise shaping signals */ - /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[ psEncC->ltp_mem_length ], psEncC->frame_length * sizeof( opus_int16 ) ) */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); + RESTORE_STACK; } /***********************************/ /* silk_noise_shape_quantizer */ /***********************************/ -static inline void silk_noise_shape_quantizer( + +#if !defined(OPUS_X86_MAY_HAVE_SSE4_1) +static OPUS_INLINE +#endif +void silk_noise_shape_quantizer( silk_nsq_state *NSQ, /* I/O NSQ state */ opus_int signalType, /* I Signal type */ const opus_int32 x_sc_Q10[], /* I */ @@ -184,15 +199,19 @@ static inline void silk_noise_shape_quantizer( opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int shapingLPCOrder, /* I Noise shaping AR filter order */ - opus_int predictLPCOrder /* I Prediction filter order */ + opus_int predictLPCOrder, /* I Prediction filter order */ + int arch /* I Architecture */ ) { - opus_int i, j; + opus_int i; opus_int32 LTP_pred_Q13, LPC_pred_Q10, n_AR_Q12, n_LTP_Q13; opus_int32 n_LF_Q12, r_Q10, rr_Q10, q1_Q0, q1_Q10, q2_Q10, rd1_Q20, rd2_Q20; opus_int32 exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; opus_int32 *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr; +#ifdef silk_short_prediction_create_arch_coef + opus_int32 a_Q12_arch[MAX_LPC_ORDER]; +#endif shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; @@ -201,32 +220,16 @@ static inline void silk_noise_shape_quantizer( /* Set up short term AR state */ psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 ]; +#ifdef silk_short_prediction_create_arch_coef + silk_short_prediction_create_arch_coef(a_Q12_arch, a_Q12, predictLPCOrder); +#endif + for( i = 0; i < length; i++ ) { /* Generate dither */ NSQ->rand_seed = silk_RAND( NSQ->rand_seed ); /* Short-term prediction */ - silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 ); - /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ - LPC_pred_Q10 = silk_RSHIFT( predictLPCOrder, 1 ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ 0 ], a_Q12[ 0 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -1 ], a_Q12[ 1 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -2 ], a_Q12[ 2 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -3 ], a_Q12[ 3 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -4 ], a_Q12[ 4 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -5 ], a_Q12[ 5 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -6 ], a_Q12[ 6 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -7 ], a_Q12[ 7 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -8 ], a_Q12[ 8 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -9 ], a_Q12[ 9 ] ); - if( predictLPCOrder == 16 ) { - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -10 ], a_Q12[ 10 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -11 ], a_Q12[ 11 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -12 ], a_Q12[ 12 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -13 ], a_Q12[ 13 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -14 ], a_Q12[ 14 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -15 ], a_Q12[ 15 ] ); - } + LPC_pred_Q10 = silk_noise_shape_quantizer_short_prediction(psLPC_Q14, a_Q12, a_Q12_arch, predictLPCOrder, arch); /* Long-term prediction */ if( signalType == TYPE_VOICED ) { @@ -244,30 +247,15 @@ static inline void silk_noise_shape_quantizer( } /* Noise shape feedback */ - silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ - tmp2 = psLPC_Q14[ 0 ]; - tmp1 = NSQ->sAR2_Q14[ 0 ]; - NSQ->sAR2_Q14[ 0 ] = tmp2; - n_AR_Q12 = silk_RSHIFT( shapingLPCOrder, 1 ); - n_AR_Q12 = silk_SMLAWB( n_AR_Q12, tmp2, AR_shp_Q13[ 0 ] ); - for( j = 2; j < shapingLPCOrder; j += 2 ) { - tmp2 = NSQ->sAR2_Q14[ j - 1 ]; - NSQ->sAR2_Q14[ j - 1 ] = tmp1; - n_AR_Q12 = silk_SMLAWB( n_AR_Q12, tmp1, AR_shp_Q13[ j - 1 ] ); - tmp1 = NSQ->sAR2_Q14[ j + 0 ]; - NSQ->sAR2_Q14[ j + 0 ] = tmp2; - n_AR_Q12 = silk_SMLAWB( n_AR_Q12, tmp2, AR_shp_Q13[ j ] ); - } - NSQ->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1; - n_AR_Q12 = silk_SMLAWB( n_AR_Q12, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] ); + celt_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ + n_AR_Q12 = silk_NSQ_noise_shape_feedback_loop(&NSQ->sDiff_shp_Q14, NSQ->sAR2_Q14, AR_shp_Q13, shapingLPCOrder, arch); - n_AR_Q12 = silk_LSHIFT32( n_AR_Q12, 1 ); /* Q11 -> Q12 */ n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sLF_AR_shp_Q14, Tilt_Q14 ); n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 ); n_LF_Q12 = silk_SMLAWT( n_LF_Q12, NSQ->sLF_AR_shp_Q14, LF_shp_Q14 ); - silk_assert( lag > 0 || signalType != TYPE_VOICED ); + celt_assert( lag > 0 || signalType != TYPE_VOICED ); /* Combine prediction and noise shaping signals */ tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 ); /* Q12 */ @@ -289,14 +277,27 @@ static inline void silk_noise_shape_quantizer( r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 ); /* residual error Q10 */ /* Flip sign depending on dither */ - if ( NSQ->rand_seed < 0 ) { - r_Q10 = -r_Q10; + if( NSQ->rand_seed < 0 ) { + r_Q10 = -r_Q10; } r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); + if (Lambda_Q10 > 2048) { + /* For aggressive RDO, the bias becomes more than one pulse. */ + int rdo_offset = Lambda_Q10/2 - 512; + if (q1_Q10 > rdo_offset) { + q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); + } else if (q1_Q10 < -rdo_offset) { + q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); + } else if (q1_Q10 < 0) { + q1_Q0 = -1; + } else { + q1_Q0 = 0; + } + } if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); @@ -347,7 +348,8 @@ static inline void silk_noise_shape_quantizer( /* Update states */ psLPC_Q14++; *psLPC_Q14 = xq_Q14; - sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 ); + NSQ->sDiff_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_sc_Q10[ i ], 4 ); + sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( NSQ->sDiff_shp_Q14, n_AR_Q12, 2 ); NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_shp_Q14, n_LF_Q12, 2 ); @@ -363,10 +365,10 @@ static inline void silk_noise_shape_quantizer( silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); } -static inline void silk_nsq_scale_states( +static OPUS_INLINE void silk_nsq_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ - const opus_int32 x_Q3[], /* I input in Q3 */ + const opus_int16 x16[], /* I input */ opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ @@ -378,28 +380,18 @@ static inline void silk_nsq_scale_states( ) { opus_int i, lag; - opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; + opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); - /* Calculate gain adjustment factor */ - if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { - gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); - } else { - gain_adj_Q16 = (opus_int32)1 << 16; - } - /* Scale input */ - inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); + inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); for( i = 0; i < psEncC->subfr_length; i++ ) { - x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); + x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); } - /* Save inverse gain */ - NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; - /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { @@ -413,7 +405,9 @@ static inline void silk_nsq_scale_states( } /* Adjust for changing gain */ - if( gain_adj_Q16 != (opus_int32)1 << 16 ) { + if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { + gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); + /* Scale long-term shaping state */ for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); @@ -427,6 +421,7 @@ static inline void silk_nsq_scale_states( } NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); + NSQ->sDiff_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sDiff_shp_Q14 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { @@ -435,5 +430,8 @@ static inline void silk_nsq_scale_states( for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] ); } + + /* Save inverse gain */ + NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; } } diff --git a/external/opus-1.3.1/silk/NSQ.h b/external/opus-1.3.1/silk/NSQ.h new file mode 100644 index 00000000..971832f6 --- /dev/null +++ b/external/opus-1.3.1/silk/NSQ.h @@ -0,0 +1,101 @@ +/*********************************************************************** +Copyright (c) 2014 Vidyo. +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ +#ifndef SILK_NSQ_H +#define SILK_NSQ_H + +#include "SigProc_FIX.h" + +#undef silk_short_prediction_create_arch_coef + +static OPUS_INLINE opus_int32 silk_noise_shape_quantizer_short_prediction_c(const opus_int32 *buf32, const opus_int16 *coef16, opus_int order) +{ + opus_int32 out; + silk_assert( order == 10 || order == 16 ); + + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + out = silk_RSHIFT( order, 1 ); + out = silk_SMLAWB( out, buf32[ 0 ], coef16[ 0 ] ); + out = silk_SMLAWB( out, buf32[ -1 ], coef16[ 1 ] ); + out = silk_SMLAWB( out, buf32[ -2 ], coef16[ 2 ] ); + out = silk_SMLAWB( out, buf32[ -3 ], coef16[ 3 ] ); + out = silk_SMLAWB( out, buf32[ -4 ], coef16[ 4 ] ); + out = silk_SMLAWB( out, buf32[ -5 ], coef16[ 5 ] ); + out = silk_SMLAWB( out, buf32[ -6 ], coef16[ 6 ] ); + out = silk_SMLAWB( out, buf32[ -7 ], coef16[ 7 ] ); + out = silk_SMLAWB( out, buf32[ -8 ], coef16[ 8 ] ); + out = silk_SMLAWB( out, buf32[ -9 ], coef16[ 9 ] ); + + if( order == 16 ) + { + out = silk_SMLAWB( out, buf32[ -10 ], coef16[ 10 ] ); + out = silk_SMLAWB( out, buf32[ -11 ], coef16[ 11 ] ); + out = silk_SMLAWB( out, buf32[ -12 ], coef16[ 12 ] ); + out = silk_SMLAWB( out, buf32[ -13 ], coef16[ 13 ] ); + out = silk_SMLAWB( out, buf32[ -14 ], coef16[ 14 ] ); + out = silk_SMLAWB( out, buf32[ -15 ], coef16[ 15 ] ); + } + return out; +} + +#define silk_noise_shape_quantizer_short_prediction(in, coef, coefRev, order, arch) ((void)arch,silk_noise_shape_quantizer_short_prediction_c(in, coef, order)) + +static OPUS_INLINE opus_int32 silk_NSQ_noise_shape_feedback_loop_c(const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order) +{ + opus_int32 out; + opus_int32 tmp1, tmp2; + opus_int j; + + tmp2 = data0[0]; + tmp1 = data1[0]; + data1[0] = tmp2; + + out = silk_RSHIFT(order, 1); + out = silk_SMLAWB(out, tmp2, coef[0]); + + for (j = 2; j < order; j += 2) { + tmp2 = data1[j - 1]; + data1[j - 1] = tmp1; + out = silk_SMLAWB(out, tmp1, coef[j - 1]); + tmp1 = data1[j + 0]; + data1[j + 0] = tmp2; + out = silk_SMLAWB(out, tmp2, coef[j]); + } + data1[order - 1] = tmp1; + out = silk_SMLAWB(out, tmp1, coef[order - 1]); + /* Q11 -> Q12 */ + out = silk_LSHIFT32( out, 1 ); + return out; +} + +#define silk_NSQ_noise_shape_feedback_loop(data0, data1, coef, order, arch) ((void)arch,silk_NSQ_noise_shape_feedback_loop_c(data0, data1, coef, order)) + +#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +#include "arm/NSQ_neon.h" +#endif + +#endif /* SILK_NSQ_H */ diff --git a/external/opus-1.0.3/silk/NSQ_del_dec.c b/external/opus-1.3.1/silk/NSQ_del_dec.c similarity index 87% rename from external/opus-1.0.3/silk/NSQ_del_dec.c rename to external/opus-1.3.1/silk/NSQ_del_dec.c index b877fa96..3fd9fa0d 100644 --- a/external/opus-1.0.3/silk/NSQ_del_dec.c +++ b/external/opus-1.3.1/silk/NSQ_del_dec.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,9 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main.h" +#include "stack_alloc.h" +#include "NSQ.h" + typedef struct { opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; @@ -40,6 +43,7 @@ typedef struct { opus_int32 Shape_Q14[ DECISION_DELAY ]; opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_AR_Q14; + opus_int32 Diff_Q14; opus_int32 Seed; opus_int32 SeedInit; opus_int32 RD_Q10; @@ -50,15 +54,21 @@ typedef struct { opus_int32 RD_Q10; opus_int32 xq_Q14; opus_int32 LF_AR_Q14; + opus_int32 Diff_Q14; opus_int32 sLTP_shp_Q14; opus_int32 LPC_exc_Q14; } NSQ_sample_struct; -static inline void silk_nsq_del_dec_scale_states( +typedef NSQ_sample_struct NSQ_sample_pair[ 2 ]; + +#if defined(MIPSr1_ASM) +#include "mips/NSQ_del_dec_mipsr1.h" +#endif +static OPUS_INLINE void silk_nsq_del_dec_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ - const opus_int32 x_Q3[], /* I Input in Q3 */ + const opus_int16 x16[], /* I Input */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ @@ -74,7 +84,7 @@ static inline void silk_nsq_del_dec_scale_states( /******************************************/ /* Noise shape quantizer for one subframe */ /******************************************/ -static inline void silk_noise_shape_quantizer_del_dec( +static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ @@ -99,19 +109,20 @@ static inline void silk_noise_shape_quantizer_del_dec( opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I Index to newest samples in buffers */ - opus_int decisionDelay /* I */ + opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int decisionDelay, /* I */ + int arch /* I */ ); -void silk_NSQ_del_dec( - const silk_encoder_state *psEncC, /* I/O Encoder State */ +void silk_NSQ_del_dec_c( + const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int32 x_Q3[], /* I Prefiltered input signal */ + const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ @@ -123,17 +134,18 @@ void silk_NSQ_del_dec( { opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr; opus_int last_smple_idx, smpl_buf_idx, decisionDelay; - const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; + const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; opus_int16 *pxq; - opus_int32 sLTP_Q15[ 2 * MAX_FRAME_LENGTH ]; - opus_int16 sLTP[ 2 * MAX_FRAME_LENGTH ]; + VARDECL( opus_int32, sLTP_Q15 ); + VARDECL( opus_int16, sLTP ); opus_int32 HarmShapeFIRPacked_Q14; opus_int offset_Q10; opus_int32 RDmin_Q10, Gain_Q10; - opus_int32 x_sc_Q10[ MAX_SUB_FRAME_LENGTH ]; - opus_int32 delayedGain_Q10[ DECISION_DELAY ]; - NSQ_del_dec_struct psDelDec[ MAX_DEL_DEC_STATES ]; + VARDECL( opus_int32, x_sc_Q10 ); + VARDECL( opus_int32, delayedGain_Q10 ); + VARDECL( NSQ_del_dec_struct, psDelDec ); NSQ_del_dec_struct *psDD; + SAVE_STACK; /* Set unvoiced lag to the previous one, overwrite later for voiced */ lag = NSQ->lagPrev; @@ -141,6 +153,7 @@ void silk_NSQ_del_dec( silk_assert( NSQ->prev_gain_Q16 != 0 ); /* Initialize delayed decision states */ + ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct ); silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) ); for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; @@ -148,6 +161,7 @@ void silk_NSQ_del_dec( psDD->SeedInit = psDD->Seed; psDD->RD_Q10 = 0; psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14; + psDD->Diff_Q14 = NSQ->sDiff_shp_Q14; psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ]; silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) ); @@ -175,6 +189,10 @@ void silk_NSQ_del_dec( LSF_interpolation_flag = 1; } + ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); + ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); + ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); + ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); /* Set up pointers to start of sub frame */ pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; @@ -183,7 +201,7 @@ void silk_NSQ_del_dec( for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; - AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; + AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); @@ -219,7 +237,8 @@ void silk_NSQ_del_dec( psDD = &psDelDec[ Winner_ind ]; last_smple_idx = smpl_buf_idx + decisionDelay; for( i = 0; i < decisionDelay; i++ ) { - last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; + last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; + if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) ); @@ -231,25 +250,25 @@ void silk_NSQ_del_dec( /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - silk_assert( start_idx > 0 ); + celt_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], - A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder ); + A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; NSQ->rewhite_flag = 1; } } - silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, + silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k, psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay ); silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, - psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay ); + psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay, psEncC->arch ); - x_Q3 += psEncC->subfr_length; + x16 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } @@ -270,7 +289,9 @@ void silk_NSQ_del_dec( last_smple_idx = smpl_buf_idx + decisionDelay; Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); for( i = 0; i < decisionDelay; i++ ) { - last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; + last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; + if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; + pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) ); @@ -281,18 +302,20 @@ void silk_NSQ_del_dec( /* Update states */ NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14; + NSQ->sDiff_shp_Q14 = psDD->Diff_Q14; NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech signal */ - /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[psEncC->ltp_mem_length], psEncC->frame_length * sizeof( opus_int16 ) ) */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); + RESTORE_STACK; } /******************************************/ /* Noise shape quantizer for one subframe */ /******************************************/ -static inline void silk_noise_shape_quantizer_del_dec( +#ifndef OVERRIDE_silk_noise_shape_quantizer_del_dec +static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ @@ -317,8 +340,9 @@ static inline void silk_noise_shape_quantizer_del_dec( opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I Index to newest samples in buffers */ - opus_int decisionDelay /* I */ + opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int decisionDelay, /* I */ + int arch /* I */ ) { opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; @@ -328,16 +352,26 @@ static inline void silk_noise_shape_quantizer_del_dec( opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14; - NSQ_sample_struct psSampleState[ MAX_DEL_DEC_STATES ][ 2 ]; +#ifdef silk_short_prediction_create_arch_coef + opus_int32 a_Q12_arch[MAX_LPC_ORDER]; +#endif + + VARDECL( NSQ_sample_pair, psSampleState ); NSQ_del_dec_struct *psDD; NSQ_sample_struct *psSS; + SAVE_STACK; - silk_assert( nStatesDelayedDecision > 0 ); + celt_assert( nStatesDelayedDecision > 0 ); + ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair ); shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); +#ifdef silk_short_prediction_create_arch_coef + silk_short_prediction_create_arch_coef(a_Q12_arch, a_Q12, predictLPCOrder); +#endif + for( i = 0; i < length; i++ ) { /* Perform common calculations used in all states */ @@ -381,33 +415,13 @@ static inline void silk_noise_shape_quantizer_del_dec( /* Pointer used in short term prediction and shaping */ psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; /* Short-term prediction */ - silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 ); - /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ - LPC_pred_Q14 = silk_RSHIFT( predictLPCOrder, 1 ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ 0 ], a_Q12[ 0 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -1 ], a_Q12[ 1 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -2 ], a_Q12[ 2 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -3 ], a_Q12[ 3 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -4 ], a_Q12[ 4 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -5 ], a_Q12[ 5 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -6 ], a_Q12[ 6 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -7 ], a_Q12[ 7 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -8 ], a_Q12[ 8 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -9 ], a_Q12[ 9 ] ); - if( predictLPCOrder == 16 ) { - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -10 ], a_Q12[ 10 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -11 ], a_Q12[ 11 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -12 ], a_Q12[ 12 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -13 ], a_Q12[ 13 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -14 ], a_Q12[ 14 ] ); - LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -15 ], a_Q12[ 15 ] ); - } + LPC_pred_Q14 = silk_noise_shape_quantizer_short_prediction(psLPC_Q14, a_Q12, a_Q12_arch, predictLPCOrder, arch); LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */ /* Noise shape feedback */ - silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ + celt_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ /* Output of lowpass section */ - tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 ); + tmp2 = silk_SMLAWB( psDD->Diff_Q14, psDD->sAR2_Q14[ 0 ], warping_Q16 ); /* Output of allpass section */ tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 ); psDD->sAR2_Q14[ 0 ] = tmp2; @@ -453,6 +467,19 @@ static inline void silk_noise_shape_quantizer_del_dec( /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); + if (Lambda_Q10 > 2048) { + /* For aggressive RDO, the bias becomes more than one pulse. */ + int rdo_offset = Lambda_Q10/2 - 512; + if (q1_Q10 > rdo_offset) { + q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); + } else if (q1_Q10 < -rdo_offset) { + q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); + } else if (q1_Q10 < 0) { + q1_Q0 = -1; + } else { + q1_Q0 = 0; + } + } if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); @@ -506,7 +533,8 @@ static inline void silk_noise_shape_quantizer_del_dec( xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ - sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); + psSS[ 0 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 ); + sLF_AR_shp_Q14 = silk_SUB32( psSS[ 0 ].Diff_Q14, n_AR_Q14 ); psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; @@ -520,21 +548,22 @@ static inline void silk_noise_shape_quantizer_del_dec( exc_Q14 = -exc_Q14; } - /* Add predictions */ LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ - sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); + psSS[ 1 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 ); + sLF_AR_shp_Q14 = silk_SUB32( psSS[ 1 ].Diff_Q14, n_AR_Q14 ); psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; psSS[ 1 ].xq_Q14 = xq_Q14; } - *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK; /* Index to newest samples */ - last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */ + *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; + if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; + last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; /* Find winner */ RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; @@ -598,6 +627,7 @@ static inline void silk_noise_shape_quantizer_del_dec( psDD = &psDelDec[ k ]; psSS = &psSampleState[ k ][ 0 ]; psDD->LF_AR_Q14 = psSS->LF_AR_Q14; + psDD->Diff_Q14 = psSS->Diff_Q14; psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; @@ -614,13 +644,15 @@ static inline void silk_noise_shape_quantizer_del_dec( psDD = &psDelDec[ k ]; silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); } + RESTORE_STACK; } +#endif /* OVERRIDE_silk_noise_shape_quantizer_del_dec */ -static inline void silk_nsq_del_dec_scale_states( +static OPUS_INLINE void silk_nsq_del_dec_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ - const opus_int32 x_Q3[], /* I Input in Q3 */ + const opus_int16 x16[], /* I Input */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ @@ -634,29 +666,19 @@ static inline void silk_nsq_del_dec_scale_states( ) { opus_int i, k, lag; - opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; + opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; NSQ_del_dec_struct *psDD; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); - /* Calculate gain adjustment factor */ - if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { - gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); - } else { - gain_adj_Q16 = (opus_int32)1 << 16; - } - /* Scale input */ - inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); + inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); for( i = 0; i < psEncC->subfr_length; i++ ) { - x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); + x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); } - /* Save inverse gain */ - NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; - /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { @@ -670,7 +692,9 @@ static inline void silk_nsq_del_dec_scale_states( } /* Adjust for changing gain */ - if( gain_adj_Q16 != (opus_int32)1 << 16 ) { + if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { + gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); + /* Scale long-term shaping state */ for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); @@ -688,6 +712,7 @@ static inline void silk_nsq_del_dec_scale_states( /* Scale scalar states */ psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 ); + psDD->Diff_Q14 = silk_SMULWW( gain_adj_Q16, psDD->Diff_Q14 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { @@ -701,5 +726,8 @@ static inline void silk_nsq_del_dec_scale_states( psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q14[ i ] ); } } + + /* Save inverse gain */ + NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; } } diff --git a/external/opus-1.0.3/silk/PLC.c b/external/opus-1.3.1/silk/PLC.c similarity index 87% rename from external/opus-1.0.3/silk/PLC.c rename to external/opus-1.3.1/silk/PLC.c index 8d547295..f8939165 100644 --- a/external/opus-1.0.3/silk/PLC.c +++ b/external/opus-1.3.1/silk/PLC.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -38,15 +38,16 @@ static const opus_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /* static const opus_int16 PLC_RAND_ATTENUATE_V_Q15[NB_ATT] = { 31130, 26214 }; /* 0.95, 0.8 */ static const opus_int16 PLC_RAND_ATTENUATE_UV_Q15[NB_ATT] = { 32440, 29491 }; /* 0.99, 0.9 */ -static inline void silk_PLC_update( +static OPUS_INLINE void silk_PLC_update( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl /* I/O Decoder control */ ); -static inline void silk_PLC_conceal( +static OPUS_INLINE void silk_PLC_conceal( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - opus_int16 frame[] /* O LPC residual signal */ + opus_int16 frame[], /* O LPC residual signal */ + int arch /* I Run-time architecture */ ); @@ -65,7 +66,8 @@ void silk_PLC( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int16 frame[], /* I/O signal */ - opus_int lost /* I Loss flag */ + opus_int lost, /* I Loss flag */ + int arch /* I Run-time architecture */ ) { /* PLC control function */ @@ -78,7 +80,7 @@ void silk_PLC( /****************************/ /* Generate Signal */ /****************************/ - silk_PLC_conceal( psDec, psDecCtrl, frame ); + silk_PLC_conceal( psDec, psDecCtrl, frame, arch ); psDec->lossCnt++; } else { @@ -92,7 +94,7 @@ void silk_PLC( /**************************************************/ /* Update state of PLC */ /**************************************************/ -static inline void silk_PLC_update( +static OPUS_INLINE void silk_PLC_update( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl /* I/O Decoder control */ ) @@ -165,10 +167,35 @@ static inline void silk_PLC_update( psPLC->nb_subfr = psDec->nb_subfr; } -static inline void silk_PLC_conceal( +static OPUS_INLINE void silk_PLC_energy(opus_int32 *energy1, opus_int *shift1, opus_int32 *energy2, opus_int *shift2, + const opus_int32 *exc_Q14, const opus_int32 *prevGain_Q10, int subfr_length, int nb_subfr) +{ + int i, k; + VARDECL( opus_int16, exc_buf ); + opus_int16 *exc_buf_ptr; + SAVE_STACK; + ALLOC( exc_buf, 2*subfr_length, opus_int16 ); + /* Find random noise component */ + /* Scale previous excitation signal */ + exc_buf_ptr = exc_buf; + for( k = 0; k < 2; k++ ) { + for( i = 0; i < subfr_length; i++ ) { + exc_buf_ptr[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT( + silk_SMULWW( exc_Q14[ i + ( k + nb_subfr - 2 ) * subfr_length ], prevGain_Q10[ k ] ), 8 ) ); + } + exc_buf_ptr += subfr_length; + } + /* Find the subframe with lowest energy of the last two and use that as random noise generator */ + silk_sum_sqr_shift( energy1, shift1, exc_buf, subfr_length ); + silk_sum_sqr_shift( energy2, shift2, &exc_buf[ subfr_length ], subfr_length ); + RESTORE_STACK; +} + +static OPUS_INLINE void silk_PLC_conceal( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - opus_int16 frame[] /* O LPC residual signal */ + opus_int16 frame[], /* O LPC residual signal */ + int arch /* I Run-time architecture */ ) { opus_int i, j, k; @@ -177,19 +204,26 @@ static inline void silk_PLC_conceal( opus_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr; opus_int32 LPC_pred_Q10, LTP_pred_Q12; opus_int16 rand_scale_Q14; - opus_int16 *B_Q14, *exc_buf_ptr; + opus_int16 *B_Q14; opus_int32 *sLPC_Q14_ptr; - VARDECL( opus_int16, exc_buf ); opus_int16 A_Q12[ MAX_LPC_ORDER ]; +#ifdef SMALL_FOOTPRINT + opus_int16 *sLTP; +#else VARDECL( opus_int16, sLTP ); +#endif VARDECL( opus_int32, sLTP_Q14 ); silk_PLC_struct *psPLC = &psDec->sPLC; opus_int32 prevGain_Q10[2]; SAVE_STACK; - ALLOC( exc_buf, 2*psPLC->subfr_length, opus_int16 ); - ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); ALLOC( sLTP_Q14, psDec->ltp_mem_length + psDec->frame_length, opus_int32 ); +#ifdef SMALL_FOOTPRINT + /* Ugly hack that breaks aliasing rules to save stack: put sLTP at the very end of sLTP_Q14. */ + sLTP = ((opus_int16*)&sLTP_Q14[psDec->ltp_mem_length + psDec->frame_length])-psDec->ltp_mem_length; +#else + ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); +#endif prevGain_Q10[0] = silk_RSHIFT( psPLC->prevGain_Q16[ 0 ], 6); prevGain_Q10[1] = silk_RSHIFT( psPLC->prevGain_Q16[ 1 ], 6); @@ -198,19 +232,7 @@ static inline void silk_PLC_conceal( silk_memset( psPLC->prevLPC_Q12, 0, sizeof( psPLC->prevLPC_Q12 ) ); } - /* Find random noise component */ - /* Scale previous excitation signal */ - exc_buf_ptr = exc_buf; - for( k = 0; k < 2; k++ ) { - for( i = 0; i < psPLC->subfr_length; i++ ) { - exc_buf_ptr[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT( - silk_SMULWW( psDec->exc_Q14[ i + ( k + psPLC->nb_subfr - 2 ) * psPLC->subfr_length ], prevGain_Q10[ k ] ), 8 ) ); - } - exc_buf_ptr += psPLC->subfr_length; - } - /* Find the subframe with lowest energy of the last two and use that as random noise generator */ - silk_sum_sqr_shift( &energy1, &shift1, exc_buf, psPLC->subfr_length ); - silk_sum_sqr_shift( &energy2, &shift2, &exc_buf[ psPLC->subfr_length ], psPLC->subfr_length ); + silk_PLC_energy(&energy1, &shift1, &energy2, &shift2, psDec->exc_Q14, prevGain_Q10, psDec->subfr_length, psDec->nb_subfr); if( silk_RSHIFT( energy1, shift2 ) < silk_RSHIFT( energy2, shift1 ) ) { /* First sub-frame has lowest energy */ @@ -253,7 +275,7 @@ static inline void silk_PLC_conceal( /* Reduce random noise for unvoiced frames with high LPC gain */ opus_int32 invGain_Q30, down_scale_Q30; - invGain_Q30 = silk_LPC_inverse_pred_gain( psPLC->prevLPC_Q12, psDec->LPC_order ); + invGain_Q30 = silk_LPC_inverse_pred_gain( psPLC->prevLPC_Q12, psDec->LPC_order, arch ); down_scale_Q30 = silk_min_32( silk_RSHIFT( (opus_int32)1 << 30, LOG2_INV_LPC_GAIN_HIGH_THRES ), invGain_Q30 ); down_scale_Q30 = silk_max_32( silk_RSHIFT( (opus_int32)1 << 30, LOG2_INV_LPC_GAIN_LOW_THRES ), down_scale_Q30 ); @@ -269,8 +291,8 @@ static inline void silk_PLC_conceal( /* Rewhiten LTP state */ idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2; - silk_assert( idx > 0 ); - silk_LPC_analysis_filter( &sLTP[ idx ], &psDec->outBuf[ idx ], A_Q12, psDec->ltp_mem_length - idx, psDec->LPC_order ); + celt_assert( idx > 0 ); + silk_LPC_analysis_filter( &sLTP[ idx ], &psDec->outBuf[ idx ], A_Q12, psDec->ltp_mem_length - idx, psDec->LPC_order, arch ); /* Scale LTP state */ inv_gain_Q30 = silk_INVERSE32_varQ( psPLC->prevGain_Q16[ 1 ], 46 ); inv_gain_Q30 = silk_min( inv_gain_Q30, silk_int32_MAX >> 1 ); @@ -306,8 +328,10 @@ static inline void silk_PLC_conceal( for( j = 0; j < LTP_ORDER; j++ ) { B_Q14[ j ] = silk_RSHIFT( silk_SMULBB( harm_Gain_Q15, B_Q14[ j ] ), 15 ); } - /* Gradually reduce excitation gain */ - rand_scale_Q14 = silk_RSHIFT( silk_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 ); + if ( psDec->indices.signalType != TYPE_NO_VOICE_ACTIVITY ) { + /* Gradually reduce excitation gain */ + rand_scale_Q14 = silk_RSHIFT( silk_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 ); + } /* Slowly increase pitch lag */ psPLC->pitchL_Q8 = silk_SMLAWB( psPLC->pitchL_Q8, psPLC->pitchL_Q8, PITCH_DRIFT_FAC_Q16 ); @@ -323,7 +347,7 @@ static inline void silk_PLC_conceal( /* Copy LPC state */ silk_memcpy( sLPC_Q14_ptr, psDec->sLPC_Q14_buf, MAX_LPC_ORDER * sizeof( opus_int32 ) ); - silk_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */ + celt_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */ for( i = 0; i < psDec->frame_length; i++ ) { /* partly unrolled */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ @@ -343,7 +367,8 @@ static inline void silk_PLC_conceal( } /* Add prediction to LPC excitation */ - sLPC_Q14_ptr[ MAX_LPC_ORDER + i ] = silk_ADD_LSHIFT32( sLPC_Q14_ptr[ MAX_LPC_ORDER + i ], LPC_pred_Q10, 4 ); + sLPC_Q14_ptr[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( sLPC_Q14_ptr[ MAX_LPC_ORDER + i ], + silk_LSHIFT_SAT32( LPC_pred_Q10, 4 )); /* Scale with Gain */ frame[ i ] = (opus_int16)silk_SAT16( silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( sLPC_Q14_ptr[ MAX_LPC_ORDER + i ], prevGain_Q10[ 1 ] ), 8 ) ) ); diff --git a/external/opus-1.0.3/silk/PLC.h b/external/opus-1.3.1/silk/PLC.h similarity index 94% rename from external/opus-1.0.3/silk/PLC.h rename to external/opus-1.3.1/silk/PLC.h index 1d2d9061..6438f516 100644 --- a/external/opus-1.0.3/silk/PLC.h +++ b/external/opus-1.3.1/silk/PLC.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -48,7 +48,8 @@ void silk_PLC( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int16 frame[], /* I/O signal */ - opus_int lost /* I Loss flag */ + opus_int lost, /* I Loss flag */ + int arch /* I Run-time architecture */ ); void silk_PLC_glue_frames( diff --git a/external/opus-1.0.3/silk/SigProc_FIX.h b/external/opus-1.3.1/silk/SigProc_FIX.h similarity index 86% rename from external/opus-1.0.3/silk/SigProc_FIX.h rename to external/opus-1.3.1/silk/SigProc_FIX.h index daa5fd04..f9ae3263 100644 --- a/external/opus-1.0.3/silk/SigProc_FIX.h +++ b/external/opus-1.3.1/silk/SigProc_FIX.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -35,13 +35,22 @@ extern "C" /*#define silk_MACRO_COUNT */ /* Used to enable WMOPS counting */ -#define SILK_MAX_ORDER_LPC 16 /* max order of the LPC analysis in schur() and k2a() */ +#define SILK_MAX_ORDER_LPC 24 /* max order of the LPC analysis in schur() and k2a() */ #include /* for memset(), memcpy(), memmove() */ #include "typedef.h" #include "resampler_structs.h" #include "macros.h" +#include "cpu_support.h" +#if defined(OPUS_X86_MAY_HAVE_SSE4_1) +#include "x86/SigProc_FIX_sse.h" +#endif + +#if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#include "arm/biquad_alt_arm.h" +#include "arm/LPC_inv_pred_gain_arm.h" +#endif /********************************************************************/ /* SIGNAL PROCESSING FUNCTIONS */ @@ -92,14 +101,22 @@ void silk_resampler_down2_3( * slower than biquad() but uses more precise coefficients * can handle (slowly) varying coefficients */ -void silk_biquad_alt( +void silk_biquad_alt_stride1( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [2] */ opus_int16 *out, /* O output signal */ - const opus_int32 len, /* I signal length (must be even) */ - opus_int stride /* I Operate on interleaved signal if > 1 */ + const opus_int32 len /* I signal length (must be even) */ +); + +void silk_biquad_alt_stride2_c( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [4] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ ); /* Variable order MA prediction error filter. */ @@ -108,7 +125,8 @@ void silk_LPC_analysis_filter( const opus_int16 *in, /* I Input signal */ const opus_int16 *B, /* I MA prediction coefficients, Q12 [order] */ const opus_int32 len, /* I Signal length */ - const opus_int32 d /* I Filter order */ + const opus_int32 d, /* I Filter order */ + int arch /* I Run-time architecture */ ); /* Chirp (bandwidth expand) LP AR filter */ @@ -127,17 +145,11 @@ void silk_bwexpander_32( /* Compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ -opus_int32 silk_LPC_inverse_pred_gain( /* O Returns inverse prediction gain in energy domain, Q30 */ +opus_int32 silk_LPC_inverse_pred_gain_c( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ); -/* For input in Q24 domain */ -opus_int32 silk_LPC_inverse_pred_gain_Q24( /* O Returns inverse prediction gain in energy domain, Q30 */ - const opus_int32 *A_Q24, /* I Prediction coefficients [order] */ - const opus_int order /* I Prediction order */ -); - /* Split signal in two decimated bands using first-order allpass filters */ void silk_ana_filt_bank_1( const opus_int16 *in, /* I Input signal [N] */ @@ -147,6 +159,14 @@ void silk_ana_filt_bank_1( const opus_int32 N /* I Number of input samples */ ); +#if !defined(OVERRIDE_silk_biquad_alt_stride2) +#define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), silk_biquad_alt_stride2_c(in, B_Q28, A_Q28, S, out, len)) +#endif + +#if !defined(OVERRIDE_silk_LPC_inverse_pred_gain) +#define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), silk_LPC_inverse_pred_gain_c(A_Q12, order)) +#endif + /********************************************************************/ /* SCALAR FUNCTIONS */ /********************************************************************/ @@ -168,12 +188,6 @@ opus_int32 silk_log2lin( const opus_int32 inLog_Q7 /* I input on log scale */ ); -/* Function that returns the maximum absolut value of the input vector */ -opus_int16 silk_int16_array_maxabs( /* O Maximum absolute value, max: 2^15-1 */ - const opus_int16 *vec, /* I Input vector [len] */ - const opus_int32 len /* I Length of input vector */ -); - /* Compute number of bits to right shift the sum of squares of a vector */ /* of int16s to make it fit in an int32 */ void silk_sum_sqr_shift( @@ -233,7 +247,8 @@ void silk_autocorr( opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *inputData, /* I Input data to correlate */ const opus_int inputDataSize, /* I Length of input */ - const opus_int correlationCount /* I Number of correlation taps to compute */ + const opus_int correlationCount, /* I Number of correlation taps to compute */ + int arch /* I Run-time architecture */ ); void silk_decode_pitch( @@ -252,10 +267,11 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 opus_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */ opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ const opus_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */ - const opus_int search_thres2_Q15, /* I Final threshold for lag candidates 0 - 1 */ + const opus_int search_thres2_Q13, /* I Final threshold for lag candidates 0 - 1 */ const opus_int Fs_kHz, /* I Sample frequency (kHz) */ const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ - const opus_int nb_subfr /* I number of 5 ms subframes */ + const opus_int nb_subfr, /* I number of 5 ms subframes */ + int arch /* I Run-time architecture */ ); /* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ @@ -270,7 +286,17 @@ void silk_A2NLSF( void silk_NLSF2A( opus_int16 *a_Q12, /* O monic whitening filter coefficients in Q12, [ d ] */ const opus_int16 *NLSF, /* I normalized line spectral frequencies in Q15, [ d ] */ - const opus_int d /* I filter order (should be even) */ + const opus_int d, /* I filter order (should be even) */ + int arch /* I Run-time architecture */ +); + +/* Convert int32 coefficients to int16 coefs and make sure there's no wrap-around */ +void silk_LPC_fit( + opus_int16 *a_QOUT, /* O Output signal */ + opus_int32 *a_QIN, /* I/O Input signal */ + const opus_int QOUT, /* I Input Q domain */ + const opus_int QIN, /* I Input Q domain */ + const opus_int d /* I Filter order */ ); void silk_insertion_sort_increasing( @@ -307,7 +333,7 @@ void silk_NLSF_VQ_weights_laroia( ); /* Compute reflection coefficients from input signal */ -void silk_burg_modified( +void silk_burg_modified_c( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ @@ -315,7 +341,8 @@ void silk_burg_modified( const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I Number of subframes stacked in x */ - const opus_int D /* I Order */ + const opus_int D, /* I Order */ + int arch /* I Run-time architecture */ ); /* Copy and multiply a vector by a constant */ @@ -338,12 +365,15 @@ void silk_scale_vector32_Q26_lshift_18( /********************************************************************/ /* return sum( inVec1[i] * inVec2[i] ) */ + opus_int32 silk_inner_prod_aligned( const opus_int16 *const inVec1, /* I input vector 1 */ const opus_int16 *const inVec2, /* I input vector 2 */ - const opus_int len /* I vector lengths */ + const opus_int len, /* I vector lengths */ + int arch /* I Run-time architecture */ ); + opus_int32 silk_inner_prod_aligned_scale( const opus_int16 *const inVec1, /* I input vector 1 */ const opus_int16 *const inVec2, /* I input vector 2 */ @@ -351,7 +381,7 @@ opus_int32 silk_inner_prod_aligned_scale( const opus_int len /* I vector lengths */ ); -opus_int64 silk_inner_prod16_aligned_64( +opus_int64 silk_inner_prod16_aligned_64_c( const opus_int16 *inVec1, /* I input vector 1 */ const opus_int16 *inVec2, /* I input vector 2 */ const opus_int len /* I vector lengths */ @@ -364,8 +394,8 @@ opus_int64 silk_inner_prod16_aligned_64( /* Rotate a32 right by 'rot' bits. Negative rot values result in rotating left. Output is 32bit int. Note: contemporary compilers recognize the C expression below and - compile it into a 'ror' instruction if available. No need for inline ASM! */ -static inline opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) + compile it into a 'ror' instruction if available. No need for OPUS_INLINE ASM! */ +static OPUS_INLINE opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) { opus_uint32 x = (opus_uint32) a32; opus_uint32 r = (opus_uint32) rot; @@ -466,8 +496,7 @@ static inline opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) /* Add with saturation for positive input values */ #define silk_ADD_POS_SAT8(a, b) ((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b))) #define silk_ADD_POS_SAT16(a, b) ((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b))) -#define silk_ADD_POS_SAT32(a, b) ((((a)+(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))) -#define silk_ADD_POS_SAT64(a, b) ((((a)+(b)) & 0x8000000000000000LL) ? silk_int64_MAX : ((a)+(b))) +#define silk_ADD_POS_SAT32(a, b) ((((opus_uint32)(a)+(opus_uint32)(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))) #define silk_LSHIFT8(a, shift) ((opus_int8)((opus_uint8)(a)<<(shift))) /* shift >= 0, shift < 8 */ #define silk_LSHIFT16(a, shift) ((opus_int16)((opus_uint16)(a)<<(shift))) /* shift >= 0, shift < 16 */ @@ -514,37 +543,37 @@ static inline opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) #define SILK_FIX_CONST( C, Q ) ((opus_int32)((C) * ((opus_int64)1 << (Q)) + 0.5)) /* silk_min() versions with typecast in the function call */ -static inline opus_int silk_min_int(opus_int a, opus_int b) +static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b) { return (((a) < (b)) ? (a) : (b)); } -static inline opus_int16 silk_min_16(opus_int16 a, opus_int16 b) +static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b) { return (((a) < (b)) ? (a) : (b)); } -static inline opus_int32 silk_min_32(opus_int32 a, opus_int32 b) +static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b) { return (((a) < (b)) ? (a) : (b)); } -static inline opus_int64 silk_min_64(opus_int64 a, opus_int64 b) +static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b) { return (((a) < (b)) ? (a) : (b)); } /* silk_min() versions with typecast in the function call */ -static inline opus_int silk_max_int(opus_int a, opus_int b) +static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b) { return (((a) > (b)) ? (a) : (b)); } -static inline opus_int16 silk_max_16(opus_int16 a, opus_int16 b) +static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b) { return (((a) > (b)) ? (a) : (b)); } -static inline opus_int32 silk_max_32(opus_int32 a, opus_int32 b) +static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b) { return (((a) > (b)) ? (a) : (b)); } -static inline opus_int64 silk_max_64(opus_int64 a, opus_int64 b) +static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) { return (((a) > (b)) ? (a) : (b)); } @@ -567,7 +596,9 @@ static inline opus_int64 silk_max_64(opus_int64 a, opus_int64 b) /* Make sure to store the result as the seed for the next call (also in between */ /* frames), otherwise result won't be random at all. When only using some of the */ /* bits, take the most significant bits by right-shifting. */ -#define silk_RAND(seed) (silk_MLA_ovflw(907633515, (seed), 196314165)) +#define RAND_MULTIPLIER 196314165 +#define RAND_INCREMENT 907633515 +#define silk_RAND(seed) (silk_MLA_ovflw((RAND_INCREMENT), (seed), (RAND_MULTIPLIER))) /* Add some multiplication functions that can be easily mapped to ARM. */ @@ -578,10 +609,31 @@ static inline opus_int64 silk_max_64(opus_int64 a, opus_int64 b) /* the following seems faster on x86 */ #define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT64(silk_SMULL((a32), (b32)), 32) +#if !defined(OPUS_X86_MAY_HAVE_SSE4_1) +#define silk_burg_modified(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch) \ + ((void)(arch), silk_burg_modified_c(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch)) + +#define silk_inner_prod16_aligned_64(inVec1, inVec2, len, arch) \ + ((void)(arch),silk_inner_prod16_aligned_64_c(inVec1, inVec2, len)) +#endif + #include "Inlines.h" #include "MacroCount.h" #include "MacroDebug.h" +#ifdef OPUS_ARM_INLINE_ASM +#include "arm/SigProc_FIX_armv4.h" +#endif + +#ifdef OPUS_ARM_INLINE_EDSP +#include "arm/SigProc_FIX_armv5e.h" +#endif + +#if defined(MIPSr1_ASM) +#include "mips/sigproc_fix_mipsr1.h" +#endif + + #ifdef __cplusplus } #endif diff --git a/external/opus-1.0.3/silk/VAD.c b/external/opus-1.3.1/silk/VAD.c similarity index 82% rename from external/opus-1.0.3/silk/VAD.c rename to external/opus-1.3.1/silk/VAD.c index bac89b44..d0cda521 100644 --- a/external/opus-1.0.3/silk/VAD.c +++ b/external/opus-1.3.1/silk/VAD.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,12 +30,15 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main.h" +#include "stack_alloc.h" /* Silk VAD noise level estimation */ -static inline void silk_VAD_GetNoiseLevels( +# if !defined(OPUS_X86_MAY_HAVE_SSE4_1) +static OPUS_INLINE void silk_VAD_GetNoiseLevels( const opus_int32 pX[ VAD_N_BANDS ], /* I subband energies */ silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ ); +#endif /**********************************/ /* Initialization of the Silk VAD */ @@ -76,51 +79,75 @@ static const opus_int32 tiltWeights[ VAD_N_BANDS ] = { 30000, 6000, -12000, -120 /***************************************/ /* Get the speech activity level in Q8 */ /***************************************/ -opus_int silk_VAD_GetSA_Q8( /* O Return value, 0 if success */ +opus_int silk_VAD_GetSA_Q8_c( /* O Return value, 0 if success */ silk_encoder_state *psEncC, /* I/O Encoder state */ const opus_int16 pIn[] /* I PCM input */ ) { opus_int SA_Q15, pSNR_dB_Q7, input_tilt; - opus_int decimated_framelength, dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s; + opus_int decimated_framelength1, decimated_framelength2; + opus_int decimated_framelength; + opus_int dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s; opus_int32 sumSquared, smooth_coef_Q16; opus_int16 HPstateTmp; - opus_int16 X[ VAD_N_BANDS ][ MAX_FRAME_LENGTH / 2 ]; + VARDECL( opus_int16, X ); opus_int32 Xnrg[ VAD_N_BANDS ]; opus_int32 NrgToNoiseRatio_Q8[ VAD_N_BANDS ]; opus_int32 speech_nrg, x_tmp; + opus_int X_offset[ VAD_N_BANDS ]; opus_int ret = 0; silk_VAD_state *psSilk_VAD = &psEncC->sVAD; + SAVE_STACK; /* Safety checks */ silk_assert( VAD_N_BANDS == 4 ); - silk_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); - silk_assert( psEncC->frame_length <= 512 ); - silk_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); + celt_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); + celt_assert( psEncC->frame_length <= 512 ); + celt_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); /***********************/ /* Filter and Decimate */ /***********************/ + decimated_framelength1 = silk_RSHIFT( psEncC->frame_length, 1 ); + decimated_framelength2 = silk_RSHIFT( psEncC->frame_length, 2 ); + decimated_framelength = silk_RSHIFT( psEncC->frame_length, 3 ); + /* Decimate into 4 bands: + 0 L 3L L 3L 5L + - -- - -- -- + 8 8 2 4 4 + + [0-1 kHz| temp. |1-2 kHz| 2-4 kHz | 4-8 kHz | + + They're arranged to allow the minimal ( frame_length / 4 ) extra + scratch space during the downsampling process */ + X_offset[ 0 ] = 0; + X_offset[ 1 ] = decimated_framelength + decimated_framelength2; + X_offset[ 2 ] = X_offset[ 1 ] + decimated_framelength; + X_offset[ 3 ] = X_offset[ 2 ] + decimated_framelength2; + ALLOC( X, X_offset[ 3 ] + decimated_framelength1, opus_int16 ); + /* 0-8 kHz to 0-4 kHz and 4-8 kHz */ - silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ], &X[ 0 ][ 0 ], &X[ 3 ][ 0 ], psEncC->frame_length ); + silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ], + X, &X[ X_offset[ 3 ] ], psEncC->frame_length ); /* 0-4 kHz to 0-2 kHz and 2-4 kHz */ - silk_ana_filt_bank_1( &X[ 0 ][ 0 ], &psSilk_VAD->AnaState1[ 0 ], &X[ 0 ][ 0 ], &X[ 2 ][ 0 ], silk_RSHIFT( psEncC->frame_length, 1 ) ); + silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState1[ 0 ], + X, &X[ X_offset[ 2 ] ], decimated_framelength1 ); /* 0-2 kHz to 0-1 kHz and 1-2 kHz */ - silk_ana_filt_bank_1( &X[ 0 ][ 0 ], &psSilk_VAD->AnaState2[ 0 ], &X[ 0 ][ 0 ], &X[ 1 ][ 0 ], silk_RSHIFT( psEncC->frame_length, 2 ) ); + silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState2[ 0 ], + X, &X[ X_offset[ 1 ] ], decimated_framelength2 ); /*********************************************/ /* HP filter on lowest band (differentiator) */ /*********************************************/ - decimated_framelength = silk_RSHIFT( psEncC->frame_length, 3 ); - X[ 0 ][ decimated_framelength - 1 ] = silk_RSHIFT( X[ 0 ][ decimated_framelength - 1 ], 1 ); - HPstateTmp = X[ 0 ][ decimated_framelength - 1 ]; + X[ decimated_framelength - 1 ] = silk_RSHIFT( X[ decimated_framelength - 1 ], 1 ); + HPstateTmp = X[ decimated_framelength - 1 ]; for( i = decimated_framelength - 1; i > 0; i-- ) { - X[ 0 ][ i - 1 ] = silk_RSHIFT( X[ 0 ][ i - 1 ], 1 ); - X[ 0 ][ i ] -= X[ 0 ][ i - 1 ]; + X[ i - 1 ] = silk_RSHIFT( X[ i - 1 ], 1 ); + X[ i ] -= X[ i - 1 ]; } - X[ 0 ][ 0 ] -= psSilk_VAD->HPstate; + X[ 0 ] -= psSilk_VAD->HPstate; psSilk_VAD->HPstate = HPstateTmp; /*************************************/ @@ -142,7 +169,8 @@ opus_int silk_VAD_GetSA_Q8( /* O Return v for( i = 0; i < dec_subframe_length; i++ ) { /* The energy will be less than dec_subframe_length * ( silk_int16_MIN / 8 ) ^ 2. */ /* Therefore we can accumulate with no risk of overflow (unless dec_subframe_length > 128) */ - x_tmp = silk_RSHIFT( X[ b ][ i + dec_subframe_offset ], 3 ); + x_tmp = silk_RSHIFT( + X[ X_offset[ b ] + i + dec_subframe_offset ], 3 ); sumSquared = silk_SMLABB( sumSquared, x_tmp, x_tmp ); /* Safety check */ @@ -224,15 +252,14 @@ opus_int silk_VAD_GetSA_Q8( /* O Return v speech_nrg += ( b + 1 ) * silk_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 ); } + if( psEncC->frame_length == 20 * psEncC->fs_kHz ) { + speech_nrg = silk_RSHIFT32( speech_nrg, 1 ); + } /* Power scaling */ if( speech_nrg <= 0 ) { SA_Q15 = silk_RSHIFT( SA_Q15, 1 ); - } else if( speech_nrg < 32768 ) { - if( psEncC->frame_length == 10 * psEncC->fs_kHz ) { - speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 16 ); - } else { - speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 15 ); - } + } else if( speech_nrg < 16384 ) { + speech_nrg = silk_LSHIFT32( speech_nrg, 16 ); /* square-root */ speech_nrg = silk_SQRT_APPROX( speech_nrg ); @@ -263,13 +290,17 @@ opus_int silk_VAD_GetSA_Q8( /* O Return v psEncC->input_quality_bands_Q15[ b ] = silk_sigm_Q15( silk_RSHIFT( SNR_Q7 - 16 * 128, 4 ) ); } + RESTORE_STACK; return( ret ); } /**************************/ /* Noise level estimation */ /**************************/ -static inline void silk_VAD_GetNoiseLevels( +# if !defined(OPUS_X86_MAY_HAVE_SSE4_1) +static OPUS_INLINE +#endif +void silk_VAD_GetNoiseLevels( const opus_int32 pX[ VAD_N_BANDS ], /* I subband energies */ silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ ) @@ -281,6 +312,8 @@ static inline void silk_VAD_GetNoiseLevels( /* Initially faster smoothing */ if( psSilk_VAD->counter < 1000 ) { /* 1000 = 20 sec */ min_coef = silk_DIV32_16( silk_int16_MAX, silk_RSHIFT( psSilk_VAD->counter, 4 ) + 1 ); + /* Increment frame counter */ + psSilk_VAD->counter++; } else { min_coef = 0; } @@ -324,7 +357,4 @@ static inline void silk_VAD_GetNoiseLevels( /* Store as part of state */ psSilk_VAD->NL[ k ] = nl; } - - /* Increment frame counter */ - psSilk_VAD->counter++; } diff --git a/external/opus-1.3.1/silk/VQ_WMat_EC.c b/external/opus-1.3.1/silk/VQ_WMat_EC.c new file mode 100644 index 00000000..0f3d545c --- /dev/null +++ b/external/opus-1.3.1/silk/VQ_WMat_EC.c @@ -0,0 +1,131 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main.h" + +/* Entropy constrained matrix-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */ +void silk_VQ_WMat_EC_c( + opus_int8 *ind, /* O index of best codebook vector */ + opus_int32 *res_nrg_Q15, /* O best residual energy */ + opus_int32 *rate_dist_Q8, /* O best total bitrate */ + opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ + const opus_int32 *XX_Q17, /* I correlation matrix */ + const opus_int32 *xX_Q17, /* I correlation vector */ + const opus_int8 *cb_Q7, /* I codebook */ + const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ + const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ + const opus_int subfr_len, /* I number of samples per subframe */ + const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + const opus_int L /* I number of vectors in codebook */ +) +{ + opus_int k, gain_tmp_Q7; + const opus_int8 *cb_row_Q7; + opus_int32 neg_xX_Q24[ 5 ]; + opus_int32 sum1_Q15, sum2_Q24; + opus_int32 bits_res_Q8, bits_tot_Q8; + + /* Negate and convert to new Q domain */ + neg_xX_Q24[ 0 ] = -silk_LSHIFT32( xX_Q17[ 0 ], 7 ); + neg_xX_Q24[ 1 ] = -silk_LSHIFT32( xX_Q17[ 1 ], 7 ); + neg_xX_Q24[ 2 ] = -silk_LSHIFT32( xX_Q17[ 2 ], 7 ); + neg_xX_Q24[ 3 ] = -silk_LSHIFT32( xX_Q17[ 3 ], 7 ); + neg_xX_Q24[ 4 ] = -silk_LSHIFT32( xX_Q17[ 4 ], 7 ); + + /* Loop over codebook */ + *rate_dist_Q8 = silk_int32_MAX; + *res_nrg_Q15 = silk_int32_MAX; + cb_row_Q7 = cb_Q7; + /* In things go really bad, at least *ind is set to something safe. */ + *ind = 0; + for( k = 0; k < L; k++ ) { + opus_int32 penalty; + gain_tmp_Q7 = cb_gain_Q7[k]; + /* Weighted rate */ + /* Quantization error: 1 - 2 * xX * cb + cb' * XX * cb */ + sum1_Q15 = SILK_FIX_CONST( 1.001, 15 ); + + /* Penalty for too large gain */ + penalty = silk_LSHIFT32( silk_max( silk_SUB32( gain_tmp_Q7, max_gain_Q7 ), 0 ), 11 ); + + /* first row of XX_Q17 */ + sum2_Q24 = silk_MLA( neg_xX_Q24[ 0 ], XX_Q17[ 1 ], cb_row_Q7[ 1 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 2 ], cb_row_Q7[ 2 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 3 ], cb_row_Q7[ 3 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 4 ], cb_row_Q7[ 4 ] ); + sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 0 ], cb_row_Q7[ 0 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 0 ] ); + + /* second row of XX_Q17 */ + sum2_Q24 = silk_MLA( neg_xX_Q24[ 1 ], XX_Q17[ 7 ], cb_row_Q7[ 2 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 8 ], cb_row_Q7[ 3 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 9 ], cb_row_Q7[ 4 ] ); + sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 6 ], cb_row_Q7[ 1 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 1 ] ); + + /* third row of XX_Q17 */ + sum2_Q24 = silk_MLA( neg_xX_Q24[ 2 ], XX_Q17[ 13 ], cb_row_Q7[ 3 ] ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 14 ], cb_row_Q7[ 4 ] ); + sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 12 ], cb_row_Q7[ 2 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 2 ] ); + + /* fourth row of XX_Q17 */ + sum2_Q24 = silk_MLA( neg_xX_Q24[ 3 ], XX_Q17[ 19 ], cb_row_Q7[ 4 ] ); + sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 18 ], cb_row_Q7[ 3 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 3 ] ); + + /* last row of XX_Q17 */ + sum2_Q24 = silk_LSHIFT32( neg_xX_Q24[ 4 ], 1 ); + sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 24 ], cb_row_Q7[ 4 ] ); + sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 4 ] ); + + /* find best */ + if( sum1_Q15 >= 0 ) { + /* Translate residual energy to bits using high-rate assumption (6 dB ==> 1 bit/sample) */ + bits_res_Q8 = silk_SMULBB( subfr_len, silk_lin2log( sum1_Q15 + penalty) - (15 << 7) ); + /* In the following line we reduce the codelength component by half ("-1"); seems to slghtly improve quality */ + bits_tot_Q8 = silk_ADD_LSHIFT32( bits_res_Q8, cl_Q5[ k ], 3-1 ); + if( bits_tot_Q8 <= *rate_dist_Q8 ) { + *rate_dist_Q8 = bits_tot_Q8; + *res_nrg_Q15 = sum1_Q15 + penalty; + *ind = (opus_int8)k; + *gain_Q7 = gain_tmp_Q7; + } + } + + /* Go to next cbk vector */ + cb_row_Q7 += LTP_ORDER; + } +} diff --git a/external/opus-1.0.3/silk/ana_filt_bank_1.c b/external/opus-1.3.1/silk/ana_filt_bank_1.c similarity index 99% rename from external/opus-1.0.3/silk/ana_filt_bank_1.c rename to external/opus-1.3.1/silk/ana_filt_bank_1.c index 4e04bef3..24cfb03f 100644 --- a/external/opus-1.0.3/silk/ana_filt_bank_1.c +++ b/external/opus-1.3.1/silk/ana_filt_bank_1.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.3.1/silk/arm/LPC_inv_pred_gain_arm.h b/external/opus-1.3.1/silk/arm/LPC_inv_pred_gain_arm.h new file mode 100644 index 00000000..9895b555 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/LPC_inv_pred_gain_arm.h @@ -0,0 +1,57 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_LPC_INV_PRED_GAIN_ARM_H +# define SILK_LPC_INV_PRED_GAIN_ARM_H + +# include "celt/arm/armcpu.h" + +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ + const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ + const opus_int order /* I Prediction order */ +); + +# if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) +# define OVERRIDE_silk_LPC_inverse_pred_gain (1) +# define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), PRESUME_NEON(silk_LPC_inverse_pred_gain)(A_Q12, order)) +# endif +# endif + +# if !defined(OVERRIDE_silk_LPC_inverse_pred_gain) +/*Is run-time CPU detection enabled on this platform?*/ +# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) +extern opus_int32 (*const SILK_LPC_INVERSE_PRED_GAIN_IMPL[OPUS_ARCHMASK+1])(const opus_int16 *A_Q12, const opus_int order); +# define OVERRIDE_silk_LPC_inverse_pred_gain (1) +# define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((*SILK_LPC_INVERSE_PRED_GAIN_IMPL[(arch)&OPUS_ARCHMASK])(A_Q12, order)) +# elif defined(OPUS_ARM_PRESUME_NEON_INTR) +# define OVERRIDE_silk_LPC_inverse_pred_gain (1) +# define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), silk_LPC_inverse_pred_gain_neon(A_Q12, order)) +# endif +# endif + +#endif /* end SILK_LPC_INV_PRED_GAIN_ARM_H */ diff --git a/external/opus-1.3.1/silk/arm/LPC_inv_pred_gain_neon_intr.c b/external/opus-1.3.1/silk/arm/LPC_inv_pred_gain_neon_intr.c new file mode 100644 index 00000000..726e6667 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/LPC_inv_pred_gain_neon_intr.c @@ -0,0 +1,288 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "SigProc_FIX.h" +#include "define.h" + +#define QA 24 +#define A_LIMIT SILK_FIX_CONST( 0.99975, QA ) + +#define MUL32_FRAC_Q(a32, b32, Q) ((opus_int32)(silk_RSHIFT_ROUND64(silk_SMULL(a32, b32), Q))) + +/* The difficulty is how to judge a 64-bit signed integer tmp64 is 32-bit overflowed, + * since NEON has no 64-bit min, max or comparison instructions. + * A failed idea is to compare the results of vmovn(tmp64) and vqmovn(tmp64) whether they are equal or not. + * However, this idea fails when the tmp64 is something like 0xFFFFFFF980000000. + * Here we know that mult2Q >= 1, so the highest bit (bit 63, sign bit) of tmp64 must equal to bit 62. + * tmp64 was shifted left by 1 and we got tmp64'. If high_half(tmp64') != 0 and high_half(tmp64') != -1, + * then we know that bit 31 to bit 63 of tmp64 can not all be the sign bit, and therefore tmp64 is 32-bit overflowed. + * That is, we judge if tmp64' > 0x00000000FFFFFFFF, or tmp64' <= 0xFFFFFFFF00000000. + * We use narrowing shift right 31 bits to tmp32' to save data bandwidth and instructions. + * That is, we judge if tmp32' > 0x00000000, or tmp32' <= 0xFFFFFFFF. + */ + +/* Compute inverse of LPC prediction gain, and */ +/* test if LPC coefficients are stable (all poles within unit circle) */ +static OPUS_INLINE opus_int32 LPC_inverse_pred_gain_QA_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ + opus_int32 A_QA[ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ + const opus_int order /* I Prediction order */ +) +{ + opus_int k, n, mult2Q; + opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp1, tmp2; + opus_int32 max, min; + int32x4_t max_s32x4, min_s32x4; + int32x2_t max_s32x2, min_s32x2; + + max_s32x4 = vdupq_n_s32( silk_int32_MIN ); + min_s32x4 = vdupq_n_s32( silk_int32_MAX ); + invGain_Q30 = SILK_FIX_CONST( 1, 30 ); + for( k = order - 1; k > 0; k-- ) { + int32x2_t rc_Q31_s32x2, rc_mult2_s32x2; + int64x2_t mult2Q_s64x2; + + /* Check for stability */ + if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { + return 0; + } + + /* Set RC equal to negated AR coef */ + rc_Q31 = -silk_LSHIFT( A_QA[ k ], 31 - QA ); + + /* rc_mult1_Q30 range: [ 1 : 2^30 ] */ + rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); + silk_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */ + silk_assert( rc_mult1_Q30 <= ( 1 << 30 ) ); + + /* Update inverse gain */ + /* invGain_Q30 range: [ 0 : 2^30 ] */ + invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); + silk_assert( invGain_Q30 >= 0 ); + silk_assert( invGain_Q30 <= ( 1 << 30 ) ); + if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { + return 0; + } + + /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ + mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); + rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); + + /* Update AR coefficient */ + rc_Q31_s32x2 = vdup_n_s32( rc_Q31 ); + mult2Q_s64x2 = vdupq_n_s64( -mult2Q ); + rc_mult2_s32x2 = vdup_n_s32( rc_mult2 ); + + for( n = 0; n < ( ( k + 1 ) >> 1 ) - 3; n += 4 ) { + /* We always calculate extra elements of A_QA buffer when ( k % 4 ) != 0, to take the advantage of SIMD parallelization. */ + int32x4_t tmp1_s32x4, tmp2_s32x4, t0_s32x4, t1_s32x4, s0_s32x4, s1_s32x4, t_QA0_s32x4, t_QA1_s32x4; + int64x2_t t0_s64x2, t1_s64x2, t2_s64x2, t3_s64x2; + tmp1_s32x4 = vld1q_s32( A_QA + n ); + tmp2_s32x4 = vld1q_s32( A_QA + k - n - 4 ); + tmp2_s32x4 = vrev64q_s32( tmp2_s32x4 ); + tmp2_s32x4 = vcombine_s32( vget_high_s32( tmp2_s32x4 ), vget_low_s32( tmp2_s32x4 ) ); + t0_s32x4 = vqrdmulhq_lane_s32( tmp2_s32x4, rc_Q31_s32x2, 0 ); + t1_s32x4 = vqrdmulhq_lane_s32( tmp1_s32x4, rc_Q31_s32x2, 0 ); + t_QA0_s32x4 = vqsubq_s32( tmp1_s32x4, t0_s32x4 ); + t_QA1_s32x4 = vqsubq_s32( tmp2_s32x4, t1_s32x4 ); + t0_s64x2 = vmull_s32( vget_low_s32 ( t_QA0_s32x4 ), rc_mult2_s32x2 ); + t1_s64x2 = vmull_s32( vget_high_s32( t_QA0_s32x4 ), rc_mult2_s32x2 ); + t2_s64x2 = vmull_s32( vget_low_s32 ( t_QA1_s32x4 ), rc_mult2_s32x2 ); + t3_s64x2 = vmull_s32( vget_high_s32( t_QA1_s32x4 ), rc_mult2_s32x2 ); + t0_s64x2 = vrshlq_s64( t0_s64x2, mult2Q_s64x2 ); + t1_s64x2 = vrshlq_s64( t1_s64x2, mult2Q_s64x2 ); + t2_s64x2 = vrshlq_s64( t2_s64x2, mult2Q_s64x2 ); + t3_s64x2 = vrshlq_s64( t3_s64x2, mult2Q_s64x2 ); + t0_s32x4 = vcombine_s32( vmovn_s64( t0_s64x2 ), vmovn_s64( t1_s64x2 ) ); + t1_s32x4 = vcombine_s32( vmovn_s64( t2_s64x2 ), vmovn_s64( t3_s64x2 ) ); + s0_s32x4 = vcombine_s32( vshrn_n_s64( t0_s64x2, 31 ), vshrn_n_s64( t1_s64x2, 31 ) ); + s1_s32x4 = vcombine_s32( vshrn_n_s64( t2_s64x2, 31 ), vshrn_n_s64( t3_s64x2, 31 ) ); + max_s32x4 = vmaxq_s32( max_s32x4, s0_s32x4 ); + min_s32x4 = vminq_s32( min_s32x4, s0_s32x4 ); + max_s32x4 = vmaxq_s32( max_s32x4, s1_s32x4 ); + min_s32x4 = vminq_s32( min_s32x4, s1_s32x4 ); + t1_s32x4 = vrev64q_s32( t1_s32x4 ); + t1_s32x4 = vcombine_s32( vget_high_s32( t1_s32x4 ), vget_low_s32( t1_s32x4 ) ); + vst1q_s32( A_QA + n, t0_s32x4 ); + vst1q_s32( A_QA + k - n - 4, t1_s32x4 ); + } + for( ; n < (k + 1) >> 1; n++ ) { + opus_int64 tmp64; + tmp1 = A_QA[ n ]; + tmp2 = A_QA[ k - n - 1 ]; + tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp1, + MUL32_FRAC_Q( tmp2, rc_Q31, 31 ) ), rc_mult2 ), mult2Q); + if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { + return 0; + } + A_QA[ n ] = ( opus_int32 )tmp64; + tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp2, + MUL32_FRAC_Q( tmp1, rc_Q31, 31 ) ), rc_mult2), mult2Q); + if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { + return 0; + } + A_QA[ k - n - 1 ] = ( opus_int32 )tmp64; + } + } + + /* Check for stability */ + if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { + return 0; + } + + max_s32x2 = vmax_s32( vget_low_s32( max_s32x4 ), vget_high_s32( max_s32x4 ) ); + min_s32x2 = vmin_s32( vget_low_s32( min_s32x4 ), vget_high_s32( min_s32x4 ) ); + max_s32x2 = vmax_s32( max_s32x2, vreinterpret_s32_s64( vshr_n_s64( vreinterpret_s64_s32( max_s32x2 ), 32 ) ) ); + min_s32x2 = vmin_s32( min_s32x2, vreinterpret_s32_s64( vshr_n_s64( vreinterpret_s64_s32( min_s32x2 ), 32 ) ) ); + max = vget_lane_s32( max_s32x2, 0 ); + min = vget_lane_s32( min_s32x2, 0 ); + if( ( max > 0 ) || ( min < -1 ) ) { + return 0; + } + + /* Set RC equal to negated AR coef */ + rc_Q31 = -silk_LSHIFT( A_QA[ 0 ], 31 - QA ); + + /* Range: [ 1 : 2^30 ] */ + rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); + + /* Update inverse gain */ + /* Range: [ 0 : 2^30 ] */ + invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); + silk_assert( invGain_Q30 >= 0 ); + silk_assert( invGain_Q30 <= ( 1 << 30 ) ); + if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { + return 0; + } + + return invGain_Q30; +} + +/* For input in Q12 domain */ +opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ + const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ + const opus_int order /* I Prediction order */ +) +{ +#ifdef OPUS_CHECK_ASM + const opus_int32 invGain_Q30_c = silk_LPC_inverse_pred_gain_c( A_Q12, order ); +#endif + + opus_int32 invGain_Q30; + if( ( SILK_MAX_ORDER_LPC != 24 ) || ( order & 1 )) { + invGain_Q30 = silk_LPC_inverse_pred_gain_c( A_Q12, order ); + } + else { + opus_int32 Atmp_QA[ SILK_MAX_ORDER_LPC ]; + opus_int32 DC_resp; + int16x8_t t0_s16x8, t1_s16x8, t2_s16x8; + int32x4_t t0_s32x4; + const opus_int leftover = order & 7; + + /* Increase Q domain of the AR coefficients */ + t0_s16x8 = vld1q_s16( A_Q12 + 0 ); + t1_s16x8 = vld1q_s16( A_Q12 + 8 ); + if ( order > 16 ) { + t2_s16x8 = vld1q_s16( A_Q12 + 16 ); + } + t0_s32x4 = vpaddlq_s16( t0_s16x8 ); + + switch( order - leftover ) + { + case 24: + t0_s32x4 = vpadalq_s16( t0_s32x4, t2_s16x8 ); + vst1q_s32( Atmp_QA + 16, vshll_n_s16( vget_low_s16 ( t2_s16x8 ), QA - 12 ) ); + vst1q_s32( Atmp_QA + 20, vshll_n_s16( vget_high_s16( t2_s16x8 ), QA - 12 ) ); + /* FALLTHROUGH */ + + case 16: + t0_s32x4 = vpadalq_s16( t0_s32x4, t1_s16x8 ); + vst1q_s32( Atmp_QA + 8, vshll_n_s16( vget_low_s16 ( t1_s16x8 ), QA - 12 ) ); + vst1q_s32( Atmp_QA + 12, vshll_n_s16( vget_high_s16( t1_s16x8 ), QA - 12 ) ); + /* FALLTHROUGH */ + + case 8: + { + const int32x2_t t_s32x2 = vpadd_s32( vget_low_s32( t0_s32x4 ), vget_high_s32( t0_s32x4 ) ); + const int64x1_t t_s64x1 = vpaddl_s32( t_s32x2 ); + DC_resp = vget_lane_s32( vreinterpret_s32_s64( t_s64x1 ), 0 ); + vst1q_s32( Atmp_QA + 0, vshll_n_s16( vget_low_s16 ( t0_s16x8 ), QA - 12 ) ); + vst1q_s32( Atmp_QA + 4, vshll_n_s16( vget_high_s16( t0_s16x8 ), QA - 12 ) ); + } + break; + + default: + DC_resp = 0; + break; + } + A_Q12 += order - leftover; + + switch( leftover ) + { + case 6: + DC_resp += (opus_int32)A_Q12[ 5 ]; + DC_resp += (opus_int32)A_Q12[ 4 ]; + Atmp_QA[ order - leftover + 5 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 5 ], QA - 12 ); + Atmp_QA[ order - leftover + 4 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 4 ], QA - 12 ); + /* FALLTHROUGH */ + + case 4: + DC_resp += (opus_int32)A_Q12[ 3 ]; + DC_resp += (opus_int32)A_Q12[ 2 ]; + Atmp_QA[ order - leftover + 3 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 3 ], QA - 12 ); + Atmp_QA[ order - leftover + 2 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 2 ], QA - 12 ); + /* FALLTHROUGH */ + + case 2: + DC_resp += (opus_int32)A_Q12[ 1 ]; + DC_resp += (opus_int32)A_Q12[ 0 ]; + Atmp_QA[ order - leftover + 1 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 1 ], QA - 12 ); + Atmp_QA[ order - leftover + 0 ] = silk_LSHIFT32( (opus_int32)A_Q12[ 0 ], QA - 12 ); + /* FALLTHROUGH */ + + default: + break; + } + + /* If the DC is unstable, we don't even need to do the full calculations */ + if( DC_resp >= 4096 ) { + invGain_Q30 = 0; + } else { + invGain_Q30 = LPC_inverse_pred_gain_QA_neon( Atmp_QA, order ); + } + } + +#ifdef OPUS_CHECK_ASM + silk_assert( invGain_Q30_c == invGain_Q30 ); +#endif + + return invGain_Q30; +} diff --git a/external/opus-1.3.1/silk/arm/NSQ_del_dec_arm.h b/external/opus-1.3.1/silk/arm/NSQ_del_dec_arm.h new file mode 100644 index 00000000..9e76e169 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/NSQ_del_dec_arm.h @@ -0,0 +1,100 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_NSQ_DEL_DEC_ARM_H +#define SILK_NSQ_DEL_DEC_ARM_H + +#include "celt/arm/armcpu.h" + +#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +void silk_NSQ_del_dec_neon( + const silk_encoder_state *psEncC, silk_nsq_state *NSQ, + SideInfoIndices *psIndices, const opus_int16 x16[], opus_int8 pulses[], + const opus_int16 PredCoef_Q12[2 * MAX_LPC_ORDER], + const opus_int16 LTPCoef_Q14[LTP_ORDER * MAX_NB_SUBFR], + const opus_int16 AR_Q13[MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER], + const opus_int HarmShapeGain_Q14[MAX_NB_SUBFR], + const opus_int Tilt_Q14[MAX_NB_SUBFR], + const opus_int32 LF_shp_Q14[MAX_NB_SUBFR], + const opus_int32 Gains_Q16[MAX_NB_SUBFR], + const opus_int pitchL[MAX_NB_SUBFR], const opus_int Lambda_Q10, + const opus_int LTP_scale_Q14); + +#if !defined(OPUS_HAVE_RTCD) +#define OVERRIDE_silk_NSQ_del_dec (1) +#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ + LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ + LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ + LTP_scale_Q14, arch) \ + ((void)(arch), \ + PRESUME_NEON(silk_NSQ_del_dec)( \ + psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, \ + AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, \ + Lambda_Q10, LTP_scale_Q14)) +#endif +#endif + +#if !defined(OVERRIDE_silk_NSQ_del_dec) +/*Is run-time CPU detection enabled on this platform?*/ +#if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && \ + !defined(OPUS_ARM_PRESUME_NEON_INTR)) +extern void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( + const silk_encoder_state *psEncC, silk_nsq_state *NSQ, + SideInfoIndices *psIndices, const opus_int16 x16[], opus_int8 pulses[], + const opus_int16 PredCoef_Q12[2 * MAX_LPC_ORDER], + const opus_int16 LTPCoef_Q14[LTP_ORDER * MAX_NB_SUBFR], + const opus_int16 AR_Q13[MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER], + const opus_int HarmShapeGain_Q14[MAX_NB_SUBFR], + const opus_int Tilt_Q14[MAX_NB_SUBFR], + const opus_int32 LF_shp_Q14[MAX_NB_SUBFR], + const opus_int32 Gains_Q16[MAX_NB_SUBFR], + const opus_int pitchL[MAX_NB_SUBFR], const opus_int Lambda_Q10, + const opus_int LTP_scale_Q14); +#define OVERRIDE_silk_NSQ_del_dec (1) +#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ + LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ + LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ + LTP_scale_Q14, arch) \ + ((*SILK_NSQ_DEL_DEC_IMPL[(arch)&OPUS_ARCHMASK])( \ + psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, \ + AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, \ + Lambda_Q10, LTP_scale_Q14)) +#elif defined(OPUS_ARM_PRESUME_NEON_INTR) +#define OVERRIDE_silk_NSQ_del_dec (1) +#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ + LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ + LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ + LTP_scale_Q14, arch) \ + ((void)(arch), \ + silk_NSQ_del_dec_neon(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ + LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ + LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ + LTP_scale_Q14)) +#endif +#endif + +#endif /* end SILK_NSQ_DEL_DEC_ARM_H */ diff --git a/external/opus-1.3.1/silk/arm/NSQ_del_dec_neon_intr.c b/external/opus-1.3.1/silk/arm/NSQ_del_dec_neon_intr.c new file mode 100644 index 00000000..212410f3 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/NSQ_del_dec_neon_intr.c @@ -0,0 +1,1124 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef OPUS_CHECK_ASM +# include +#endif +#include "main.h" +#include "stack_alloc.h" + +/* NEON intrinsics optimization now can only parallelize up to 4 delay decision states. */ +/* If there are more states, C function is called, and this optimization must be expanded. */ +#define NEON_MAX_DEL_DEC_STATES 4 + +typedef struct { + opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ][ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 RandState[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 Q_Q10[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 Xq_Q14[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 Pred_Q15[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 Shape_Q14[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ][ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 LF_AR_Q14[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 Diff_Q14[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 Seed[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 SeedInit[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 RD_Q10[ NEON_MAX_DEL_DEC_STATES ]; +} NSQ_del_decs_struct; + +typedef struct { + opus_int32 Q_Q10[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 RD_Q10[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 xq_Q14[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 LF_AR_Q14[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 Diff_Q14[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 sLTP_shp_Q14[ NEON_MAX_DEL_DEC_STATES ]; + opus_int32 LPC_exc_Q14[ NEON_MAX_DEL_DEC_STATES ]; +} NSQ_samples_struct; + +static OPUS_INLINE void silk_nsq_del_dec_scale_states_neon( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ + const opus_int16 x16[], /* I Input */ + opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ + const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ + opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ + opus_int subfr, /* I Subframe number */ + const opus_int LTP_scale_Q14, /* I LTP state scaling */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ + const opus_int signal_type, /* I Signal type */ + const opus_int decisionDelay /* I Decision delay */ +); + +/******************************************/ +/* Noise shape quantizer for one subframe */ +/******************************************/ +static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_neon( + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ + opus_int signalType, /* I Signal type */ + const opus_int32 x_Q10[], /* I */ + opus_int8 pulses[], /* O */ + opus_int16 xq[], /* O */ + opus_int32 sLTP_Q15[], /* I/O LTP filter state */ + opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ + const opus_int16 a_Q12[], /* I Short term prediction coefs */ + const opus_int16 b_Q14[], /* I Long term prediction coefs */ + const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ + opus_int lag, /* I Pitch lag */ + opus_int32 HarmShapeFIRPacked_Q14, /* I */ + opus_int Tilt_Q14, /* I Spectral tilt */ + opus_int32 LF_shp_Q14, /* I */ + opus_int32 Gain_Q16, /* I */ + opus_int Lambda_Q10, /* I */ + opus_int offset_Q10, /* I */ + opus_int length, /* I Input length */ + opus_int subfr, /* I Subframe number */ + opus_int shapingLPCOrder, /* I Shaping LPC filter order */ + opus_int predictLPCOrder, /* I Prediction filter order */ + opus_int warping_Q16, /* I */ + opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ + opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int decisionDelay /* I */ +); + +static OPUS_INLINE void copy_winner_state_kernel( + const NSQ_del_decs_struct *psDelDec, + const opus_int offset, + const opus_int last_smple_idx, + const opus_int Winner_ind, + const int32x2_t gain_lo_s32x2, + const int32x2_t gain_hi_s32x2, + const int32x4_t shift_s32x4, + int32x4_t t0_s32x4, + int32x4_t t1_s32x4, + opus_int8 *const pulses, + opus_int16 *pxq, + silk_nsq_state *NSQ +) +{ + int16x8_t t_s16x8; + int32x4_t o0_s32x4, o1_s32x4; + + t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); + t_s16x8 = vcombine_s16( vrshrn_n_s32( t0_s32x4, 10 ), vrshrn_n_s32( t1_s32x4, 10 ) ); + vst1_s8( &pulses[ offset ], vmovn_s16( t_s16x8 ) ); + + t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); + o0_s32x4 = vqdmulhq_lane_s32( t0_s32x4, gain_lo_s32x2, 0 ); + o1_s32x4 = vqdmulhq_lane_s32( t1_s32x4, gain_lo_s32x2, 0 ); + o0_s32x4 = vmlaq_lane_s32( o0_s32x4, t0_s32x4, gain_hi_s32x2, 0 ); + o1_s32x4 = vmlaq_lane_s32( o1_s32x4, t1_s32x4, gain_hi_s32x2, 0 ); + o0_s32x4 = vrshlq_s32( o0_s32x4, shift_s32x4 ); + o1_s32x4 = vrshlq_s32( o1_s32x4, shift_s32x4 ); + vst1_s16( &pxq[ offset + 0 ], vqmovn_s32( o0_s32x4 ) ); + vst1_s16( &pxq[ offset + 4 ], vqmovn_s32( o1_s32x4 ) ); + + t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); + t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); + t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); + vst1q_s32( &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx + offset + 0 ], t0_s32x4 ); + vst1q_s32( &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx + offset + 4 ], t1_s32x4 ); +} + +static OPUS_INLINE void copy_winner_state( + const NSQ_del_decs_struct *psDelDec, + const opus_int decisionDelay, + const opus_int smpl_buf_idx, + const opus_int Winner_ind, + const opus_int32 gain, + const opus_int32 shift, + opus_int8 *const pulses, + opus_int16 *pxq, + silk_nsq_state *NSQ +) +{ + opus_int i, last_smple_idx; + const int32x2_t gain_lo_s32x2 = vdup_n_s32( silk_LSHIFT32( gain & 0x0000FFFF, 15 ) ); + const int32x2_t gain_hi_s32x2 = vdup_n_s32( gain >> 16 ); + const int32x4_t shift_s32x4 = vdupq_n_s32( -shift ); + int32x4_t t0_s32x4, t1_s32x4; + + t0_s32x4 = t1_s32x4 = vdupq_n_s32( 0 ); /* initialization */ + last_smple_idx = smpl_buf_idx + decisionDelay - 1 + DECISION_DELAY; + if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; + if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; + + for( i = 0; ( i < ( decisionDelay - 7 ) ) && ( last_smple_idx >= 7 ); i += 8, last_smple_idx -= 8 ) { + copy_winner_state_kernel( psDelDec, i - decisionDelay, last_smple_idx, Winner_ind, gain_lo_s32x2, gain_hi_s32x2, shift_s32x4, t0_s32x4, t1_s32x4, pulses, pxq, NSQ ); + } + for( ; ( i < decisionDelay ) && ( last_smple_idx >= 0 ); i++, last_smple_idx-- ) { + pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); + pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], gain ), shift ) ); + NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; + } + + last_smple_idx += DECISION_DELAY; + for( ; i < ( decisionDelay - 7 ); i++, last_smple_idx-- ) { + copy_winner_state_kernel( psDelDec, i - decisionDelay, last_smple_idx, Winner_ind, gain_lo_s32x2, gain_hi_s32x2, shift_s32x4, t0_s32x4, t1_s32x4, pulses, pxq, NSQ ); + } + for( ; i < decisionDelay; i++, last_smple_idx-- ) { + pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); + pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], gain ), shift ) ); + NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; + } +} + +void silk_NSQ_del_dec_neon( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int16 x16[], /* I Input */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +) +{ +#ifdef OPUS_CHECK_ASM + silk_nsq_state NSQ_c; + SideInfoIndices psIndices_c; + opus_int8 pulses_c[ MAX_FRAME_LENGTH ]; + const opus_int8 *const pulses_a = pulses; + + ( void )pulses_a; + silk_memcpy( &NSQ_c, NSQ, sizeof( NSQ_c ) ); + silk_memcpy( &psIndices_c, psIndices, sizeof( psIndices_c ) ); + silk_memcpy( pulses_c, pulses, sizeof( pulses_c ) ); + silk_NSQ_del_dec_c( psEncC, &NSQ_c, &psIndices_c, x16, pulses_c, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, + pitchL, Lambda_Q10, LTP_scale_Q14 ); +#endif + + /* The optimization parallelizes the different delay decision states. */ + if(( psEncC->nStatesDelayedDecision > NEON_MAX_DEL_DEC_STATES ) || ( psEncC->nStatesDelayedDecision <= 2 )) { + /* NEON intrinsics optimization now can only parallelize up to 4 delay decision states. */ + /* If there are more states, C function is called, and this optimization must be expanded. */ + /* When the number of delay decision states is less than 3, there are penalties using this */ + /* optimization, and C function is called. */ + /* When the number of delay decision states is 2, it's better to specialize another */ + /* structure NSQ_del_dec2_struct and optimize with shorter NEON registers. (Low priority) */ + silk_NSQ_del_dec_c( psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, + Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14 ); + } else { + opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr; + opus_int smpl_buf_idx, decisionDelay; + const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; + opus_int16 *pxq; + VARDECL( opus_int32, sLTP_Q15 ); + VARDECL( opus_int16, sLTP ); + opus_int32 HarmShapeFIRPacked_Q14; + opus_int offset_Q10; + opus_int32 RDmin_Q10, Gain_Q10; + VARDECL( opus_int32, x_sc_Q10 ); + VARDECL( opus_int32, delayedGain_Q10 ); + VARDECL( NSQ_del_decs_struct, psDelDec ); + int32x4_t t_s32x4; + SAVE_STACK; + + /* Set unvoiced lag to the previous one, overwrite later for voiced */ + lag = NSQ->lagPrev; + + silk_assert( NSQ->prev_gain_Q16 != 0 ); + + /* Initialize delayed decision states */ + ALLOC( psDelDec, 1, NSQ_del_decs_struct ); + /* Only RandState and RD_Q10 need to be initialized to 0. */ + silk_memset( psDelDec->RandState, 0, sizeof( psDelDec->RandState ) ); + vst1q_s32( psDelDec->RD_Q10, vdupq_n_s32( 0 ) ); + + for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { + psDelDec->SeedInit[ k ] = psDelDec->Seed[ k ] = ( k + psIndices->Seed ) & 3; + } + vst1q_s32( psDelDec->LF_AR_Q14, vld1q_dup_s32( &NSQ->sLF_AR_shp_Q14 ) ); + vst1q_s32( psDelDec->Diff_Q14, vld1q_dup_s32( &NSQ->sDiff_shp_Q14 ) ); + vst1q_s32( psDelDec->Shape_Q14[ 0 ], vld1q_dup_s32( &NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ] ) ); + for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { + vst1q_s32( psDelDec->sLPC_Q14[ i ], vld1q_dup_s32( &NSQ->sLPC_Q14[ i ] ) ); + } + for( i = 0; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) ); i++ ) { + vst1q_s32( psDelDec->sAR2_Q14[ i ], vld1q_dup_s32( &NSQ->sAR2_Q14[ i ] ) ); + } + + offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; + smpl_buf_idx = 0; /* index of oldest samples */ + + decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length ); + + /* For voiced frames limit the decision delay to lower than the pitch lag */ + if( psIndices->signalType == TYPE_VOICED ) { + opus_int pitch_min = pitchL[ 0 ]; + for( k = 1; k < psEncC->nb_subfr; k++ ) { + pitch_min = silk_min_int( pitch_min, pitchL[ k ] ); + } + decisionDelay = silk_min_int( decisionDelay, pitch_min - LTP_ORDER / 2 - 1 ); + } else { + if( lag > 0 ) { + decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 ); + } + } + + if( psIndices->NLSFInterpCoef_Q2 == 4 ) { + LSF_interpolation_flag = 0; + } else { + LSF_interpolation_flag = 1; + } + + ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); + ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); + ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); + ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); + /* Set up pointers to start of sub frame */ + pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; + NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; + NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; + subfr = 0; + for( k = 0; k < psEncC->nb_subfr; k++ ) { + A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; + B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; + AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; + + /* Noise shape parameters */ + silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); + HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); + HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); + + NSQ->rewhite_flag = 0; + if( psIndices->signalType == TYPE_VOICED ) { + /* Voiced */ + lag = pitchL[ k ]; + + /* Re-whitening */ + if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { + if( k == 2 ) { + /* RESET DELAYED DECISIONS */ + /* Find winner */ + int32x4_t RD_Q10_s32x4; + RDmin_Q10 = psDelDec->RD_Q10[ 0 ]; + Winner_ind = 0; + for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) { + if( psDelDec->RD_Q10[ i ] < RDmin_Q10 ) { + RDmin_Q10 = psDelDec->RD_Q10[ i ]; + Winner_ind = i; + } + } + psDelDec->RD_Q10[ Winner_ind ] -= ( silk_int32_MAX >> 4 ); + RD_Q10_s32x4 = vld1q_s32( psDelDec->RD_Q10 ); + RD_Q10_s32x4 = vaddq_s32( RD_Q10_s32x4, vdupq_n_s32( silk_int32_MAX >> 4 ) ); + vst1q_s32( psDelDec->RD_Q10, RD_Q10_s32x4 ); + + /* Copy final part of signals from winner state to output and long-term filter states */ + copy_winner_state( psDelDec, decisionDelay, smpl_buf_idx, Winner_ind, Gains_Q16[ 1 ], 14, pulses, pxq, NSQ ); + + subfr = 0; + } + + /* Rewhiten with new A coefs */ + start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; + silk_assert( start_idx > 0 ); + + silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], + A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); + + NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; + NSQ->rewhite_flag = 1; + } + } + + silk_nsq_del_dec_scale_states_neon( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k, + LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay ); + + silk_noise_shape_quantizer_del_dec_neon( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, + delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], + Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, + psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay ); + + x16 += psEncC->subfr_length; + pulses += psEncC->subfr_length; + pxq += psEncC->subfr_length; + } + + /* Find winner */ + RDmin_Q10 = psDelDec->RD_Q10[ 0 ]; + Winner_ind = 0; + for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { + if( psDelDec->RD_Q10[ k ] < RDmin_Q10 ) { + RDmin_Q10 = psDelDec->RD_Q10[ k ]; + Winner_ind = k; + } + } + + /* Copy final part of signals from winner state to output and long-term filter states */ + psIndices->Seed = psDelDec->SeedInit[ Winner_ind ]; + Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); + copy_winner_state( psDelDec, decisionDelay, smpl_buf_idx, Winner_ind, Gain_Q10, 8, pulses, pxq, NSQ ); + + t_s32x4 = vdupq_n_s32( 0 ); /* initialization */ + for( i = 0; i < ( NSQ_LPC_BUF_LENGTH - 3 ); i += 4 ) { + t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 0 ][ Winner_ind ], t_s32x4, 0 ); + t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 1 ][ Winner_ind ], t_s32x4, 1 ); + t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 2 ][ Winner_ind ], t_s32x4, 2 ); + t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 3 ][ Winner_ind ], t_s32x4, 3 ); + vst1q_s32( &NSQ->sLPC_Q14[ i ], t_s32x4 ); + } + + for( ; i < NSQ_LPC_BUF_LENGTH; i++ ) { + NSQ->sLPC_Q14[ i ] = psDelDec->sLPC_Q14[ i ][ Winner_ind ]; + } + + for( i = 0; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) - 3 ); i += 4 ) { + t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 0 ][ Winner_ind ], t_s32x4, 0 ); + t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 1 ][ Winner_ind ], t_s32x4, 1 ); + t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 2 ][ Winner_ind ], t_s32x4, 2 ); + t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 3 ][ Winner_ind ], t_s32x4, 3 ); + vst1q_s32( &NSQ->sAR2_Q14[ i ], t_s32x4 ); + } + + for( ; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) ); i++ ) { + NSQ->sAR2_Q14[ i ] = psDelDec->sAR2_Q14[ i ][ Winner_ind ]; + } + + /* Update states */ + NSQ->sLF_AR_shp_Q14 = psDelDec->LF_AR_Q14[ Winner_ind ]; + NSQ->sDiff_shp_Q14 = psDelDec->Diff_Q14[ Winner_ind ]; + NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; + + /* Save quantized speech signal */ + silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); + silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); + RESTORE_STACK; + } + +#ifdef OPUS_CHECK_ASM + silk_assert( !memcmp( &NSQ_c, NSQ, sizeof( NSQ_c ) ) ); + silk_assert( !memcmp( &psIndices_c, psIndices, sizeof( psIndices_c ) ) ); + silk_assert( !memcmp( pulses_c, pulses_a, sizeof( pulses_c ) ) ); +#endif +} + +/******************************************/ +/* Noise shape quantizer for one subframe */ +/******************************************/ +/* Note: Function silk_short_prediction_create_arch_coef_neon() defined in NSQ_neon.h is actually a hacking C function. */ +/* Therefore here we append "_local" to the NEON function name to avoid confusion. */ +static OPUS_INLINE void silk_short_prediction_create_arch_coef_neon_local(opus_int32 *out, const opus_int16 *in, opus_int order) +{ + int16x8_t t_s16x8; + int32x4_t t0_s32x4, t1_s32x4, t2_s32x4, t3_s32x4; + silk_assert( order == 10 || order == 16 ); + + t_s16x8 = vld1q_s16( in + 0 ); /* 7 6 5 4 3 2 1 0 */ + t_s16x8 = vrev64q_s16( t_s16x8 ); /* 4 5 6 7 0 1 2 3 */ + t2_s32x4 = vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ); /* 4 5 6 7 */ + t3_s32x4 = vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ); /* 0 1 2 3 */ + + if( order == 16 ) { + t_s16x8 = vld1q_s16( in + 8 ); /* F E D C B A 9 8 */ + t_s16x8 = vrev64q_s16( t_s16x8 ); /* C D E F 8 9 A B */ + t0_s32x4 = vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ); /* C D E F */ + t1_s32x4 = vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ); /* 8 9 A B */ + } else { + int16x4_t t_s16x4; + + t0_s32x4 = vdupq_n_s32( 0 ); /* zero zero zero zero */ + t_s16x4 = vld1_s16( in + 6 ); /* 9 8 7 6 */ + t_s16x4 = vrev64_s16( t_s16x4 ); /* 6 7 8 9 */ + t1_s32x4 = vshll_n_s16( t_s16x4, 15 ); + t1_s32x4 = vcombine_s32( vget_low_s32(t0_s32x4), vget_low_s32( t1_s32x4 ) ); /* 8 9 zero zero */ + } + vst1q_s32( out + 0, t0_s32x4 ); + vst1q_s32( out + 4, t1_s32x4 ); + vst1q_s32( out + 8, t2_s32x4 ); + vst1q_s32( out + 12, t3_s32x4 ); +} + +static OPUS_INLINE int32x4_t silk_SMLAWB_lane0_neon( + const int32x4_t out_s32x4, + const int32x4_t in_s32x4, + const int32x2_t coef_s32x2 +) +{ + return vaddq_s32( out_s32x4, vqdmulhq_lane_s32( in_s32x4, coef_s32x2, 0 ) ); +} + +static OPUS_INLINE int32x4_t silk_SMLAWB_lane1_neon( + const int32x4_t out_s32x4, + const int32x4_t in_s32x4, + const int32x2_t coef_s32x2 +) +{ + return vaddq_s32( out_s32x4, vqdmulhq_lane_s32( in_s32x4, coef_s32x2, 1 ) ); +} + +/* Note: This function has different return value than silk_noise_shape_quantizer_short_prediction_neon(). */ +/* Therefore here we append "_local" to the function name to avoid confusion. */ +static OPUS_INLINE int32x4_t silk_noise_shape_quantizer_short_prediction_neon_local(const opus_int32 *buf32, const opus_int32 *a_Q12_arch, opus_int order) +{ + const int32x4_t a_Q12_arch0_s32x4 = vld1q_s32( a_Q12_arch + 0 ); + const int32x4_t a_Q12_arch1_s32x4 = vld1q_s32( a_Q12_arch + 4 ); + const int32x4_t a_Q12_arch2_s32x4 = vld1q_s32( a_Q12_arch + 8 ); + const int32x4_t a_Q12_arch3_s32x4 = vld1q_s32( a_Q12_arch + 12 ); + int32x4_t LPC_pred_Q14_s32x4; + + silk_assert( order == 10 || order == 16 ); + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LPC_pred_Q14_s32x4 = vdupq_n_s32( silk_RSHIFT( order, 1 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 0 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch0_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 1 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch0_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 2 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch0_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 3 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch0_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 4 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch1_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 5 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch1_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 6 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch1_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 7 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch1_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 8 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch2_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 9 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch2_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 10 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch2_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 11 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch2_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 12 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch3_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 13 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch3_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 14 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch3_s32x4 ) ); + LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 15 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch3_s32x4 ) ); + + return LPC_pred_Q14_s32x4; +} + +static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_neon( + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ + opus_int signalType, /* I Signal type */ + const opus_int32 x_Q10[], /* I */ + opus_int8 pulses[], /* O */ + opus_int16 xq[], /* O */ + opus_int32 sLTP_Q15[], /* I/O LTP filter state */ + opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ + const opus_int16 a_Q12[], /* I Short term prediction coefs */ + const opus_int16 b_Q14[], /* I Long term prediction coefs */ + const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ + opus_int lag, /* I Pitch lag */ + opus_int32 HarmShapeFIRPacked_Q14, /* I */ + opus_int Tilt_Q14, /* I Spectral tilt */ + opus_int32 LF_shp_Q14, /* I */ + opus_int32 Gain_Q16, /* I */ + opus_int Lambda_Q10, /* I */ + opus_int offset_Q10, /* I */ + opus_int length, /* I Input length */ + opus_int subfr, /* I Subframe number */ + opus_int shapingLPCOrder, /* I Shaping LPC filter order */ + opus_int predictLPCOrder, /* I Prediction filter order */ + opus_int warping_Q16, /* I */ + opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ + opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int decisionDelay /* I */ +) +{ + opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; + opus_int32 Winner_rand_state; + opus_int32 LTP_pred_Q14, n_LTP_Q14; + opus_int32 RDmin_Q10, RDmax_Q10; + opus_int32 Gain_Q10; + opus_int32 *pred_lag_ptr, *shp_lag_ptr; + opus_int32 a_Q12_arch[MAX_LPC_ORDER]; + const int32x2_t warping_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( warping_Q16, 16 ) >> 1 ); + const opus_int32 LF_shp_Q29 = silk_LSHIFT32( LF_shp_Q14, 16 ) >> 1; + opus_int32 AR_shp_Q28[ MAX_SHAPE_LPC_ORDER ]; + const uint32x4_t rand_multiplier_u32x4 = vdupq_n_u32( RAND_MULTIPLIER ); + const uint32x4_t rand_increment_u32x4 = vdupq_n_u32( RAND_INCREMENT ); + + VARDECL( NSQ_samples_struct, psSampleState ); + SAVE_STACK; + + silk_assert( nStatesDelayedDecision > 0 ); + silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ + ALLOC( psSampleState, 2, NSQ_samples_struct ); + + shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; + pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; + Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); + + for( i = 0; i < ( MAX_SHAPE_LPC_ORDER - 7 ); i += 8 ) { + const int16x8_t t_s16x8 = vld1q_s16( AR_shp_Q13 + i ); + vst1q_s32( AR_shp_Q28 + i + 0, vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ) ); + vst1q_s32( AR_shp_Q28 + i + 4, vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ) ); + } + + for( ; i < MAX_SHAPE_LPC_ORDER; i++ ) { + AR_shp_Q28[i] = silk_LSHIFT32( AR_shp_Q13[i], 15 ); + } + + silk_short_prediction_create_arch_coef_neon_local( a_Q12_arch, a_Q12, predictLPCOrder ); + + for( i = 0; i < length; i++ ) { + int32x4_t Seed_s32x4, LPC_pred_Q14_s32x4; + int32x4_t sign_s32x4, tmp1_s32x4, tmp2_s32x4; + int32x4_t n_AR_Q14_s32x4, n_LF_Q14_s32x4; + int32x2_t AR_shp_Q28_s32x2; + int16x4_t r_Q10_s16x4, rr_Q10_s16x4; + + /* Perform common calculations used in all states */ + + /* Long-term prediction */ + if( signalType == TYPE_VOICED ) { + /* Unrolled loop */ + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LTP_pred_Q14 = 2; + LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ 0 ], b_Q14[ 0 ] ); + LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] ); + LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] ); + LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] ); + LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); + LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */ + pred_lag_ptr++; + } else { + LTP_pred_Q14 = 0; + } + + /* Long-term shaping */ + if( lag > 0 ) { + /* Symmetric, packed FIR coefficients */ + n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); + n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); + n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */ + shp_lag_ptr++; + } else { + n_LTP_Q14 = 0; + } + + /* Generate dither */ + Seed_s32x4 = vld1q_s32( psDelDec->Seed ); + Seed_s32x4 = vreinterpretq_s32_u32( vmlaq_u32( rand_increment_u32x4, vreinterpretq_u32_s32( Seed_s32x4 ), rand_multiplier_u32x4 ) ); + vst1q_s32( psDelDec->Seed, Seed_s32x4 ); + + /* Short-term prediction */ + LPC_pred_Q14_s32x4 = silk_noise_shape_quantizer_short_prediction_neon_local(psDelDec->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 16 + i ], a_Q12_arch, predictLPCOrder); + LPC_pred_Q14_s32x4 = vshlq_n_s32( LPC_pred_Q14_s32x4, 4 ); /* Q10 -> Q14 */ + + /* Noise shape feedback */ + /* Output of lowpass section */ + tmp2_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->Diff_Q14 ), vld1q_s32( psDelDec->sAR2_Q14[ 0 ] ), warping_Q16_s32x2 ); + /* Output of allpass section */ + tmp1_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ 1 ] ), tmp2_s32x4 ); + tmp1_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ 0 ] ), tmp1_s32x4, warping_Q16_s32x2 ); + vst1q_s32( psDelDec->sAR2_Q14[ 0 ], tmp2_s32x4 ); + AR_shp_Q28_s32x2 = vld1_s32( AR_shp_Q28 ); + n_AR_Q14_s32x4 = vaddq_s32( vdupq_n_s32( silk_RSHIFT( shapingLPCOrder, 1 ) ), vqdmulhq_lane_s32( tmp2_s32x4, AR_shp_Q28_s32x2, 0 ) ); + + /* Loop over allpass sections */ + for( j = 2; j < shapingLPCOrder; j += 2 ) { + /* Output of allpass section */ + tmp2_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ j + 0 ] ), tmp1_s32x4 ); + tmp2_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ j - 1 ] ), tmp2_s32x4, warping_Q16_s32x2 ); + vst1q_s32( psDelDec->sAR2_Q14[ j - 1 ], tmp1_s32x4 ); + n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp1_s32x4, AR_shp_Q28_s32x2, 1 ) ); + /* Output of allpass section */ + tmp1_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ j + 1 ] ), tmp2_s32x4 ); + tmp1_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ j + 0 ] ), tmp1_s32x4, warping_Q16_s32x2 ); + vst1q_s32( psDelDec->sAR2_Q14[ j + 0 ], tmp2_s32x4 ); + AR_shp_Q28_s32x2 = vld1_s32( &AR_shp_Q28[ j ] ); + n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp2_s32x4, AR_shp_Q28_s32x2, 0 ) ); + } + vst1q_s32( psDelDec->sAR2_Q14[ shapingLPCOrder - 1 ], tmp1_s32x4 ); + n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp1_s32x4, AR_shp_Q28_s32x2, 1 ) ); + n_AR_Q14_s32x4 = vshlq_n_s32( n_AR_Q14_s32x4, 1 ); /* Q11 -> Q12 */ + n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_n_s32( vld1q_s32( psDelDec->LF_AR_Q14 ), silk_LSHIFT32( Tilt_Q14, 16 ) >> 1 ) ); /* Q12 */ + n_AR_Q14_s32x4 = vshlq_n_s32( n_AR_Q14_s32x4, 2 ); /* Q12 -> Q14 */ + n_LF_Q14_s32x4 = vqdmulhq_n_s32( vld1q_s32( psDelDec->Shape_Q14[ *smpl_buf_idx ] ), LF_shp_Q29 ); /* Q12 */ + n_LF_Q14_s32x4 = vaddq_s32( n_LF_Q14_s32x4, vqdmulhq_n_s32( vld1q_s32( psDelDec->LF_AR_Q14 ), silk_LSHIFT32( LF_shp_Q14 >> 16 , 15 ) ) ); /* Q12 */ + n_LF_Q14_s32x4 = vshlq_n_s32( n_LF_Q14_s32x4, 2 ); /* Q12 -> Q14 */ + + /* Input minus prediction plus noise feedback */ + /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ + tmp1_s32x4 = vaddq_s32( n_AR_Q14_s32x4, n_LF_Q14_s32x4 ); /* Q14 */ + tmp2_s32x4 = vaddq_s32( vdupq_n_s32( n_LTP_Q14 ), LPC_pred_Q14_s32x4 ); /* Q13 */ + tmp1_s32x4 = vsubq_s32( tmp2_s32x4, tmp1_s32x4 ); /* Q13 */ + tmp1_s32x4 = vrshrq_n_s32( tmp1_s32x4, 4 ); /* Q10 */ + tmp1_s32x4 = vsubq_s32( vdupq_n_s32( x_Q10[ i ] ), tmp1_s32x4 ); /* residual error Q10 */ + + /* Flip sign depending on dither */ + sign_s32x4 = vreinterpretq_s32_u32( vcltq_s32( Seed_s32x4, vdupq_n_s32( 0 ) ) ); + tmp1_s32x4 = veorq_s32( tmp1_s32x4, sign_s32x4 ); + tmp1_s32x4 = vsubq_s32( tmp1_s32x4, sign_s32x4 ); + tmp1_s32x4 = vmaxq_s32( tmp1_s32x4, vdupq_n_s32( -( 31 << 10 ) ) ); + tmp1_s32x4 = vminq_s32( tmp1_s32x4, vdupq_n_s32( 30 << 10 ) ); + r_Q10_s16x4 = vmovn_s32( tmp1_s32x4 ); + + /* Find two quantization level candidates and measure their rate-distortion */ + { + int16x4_t q1_Q10_s16x4 = vsub_s16( r_Q10_s16x4, vdup_n_s16( offset_Q10 ) ); + int16x4_t q1_Q0_s16x4 = vshr_n_s16( q1_Q10_s16x4, 10 ); + int16x4_t q2_Q10_s16x4; + int32x4_t rd1_Q10_s32x4, rd2_Q10_s32x4; + uint32x4_t t_u32x4; + + if( Lambda_Q10 > 2048 ) { + /* For aggressive RDO, the bias becomes more than one pulse. */ + const int rdo_offset = Lambda_Q10/2 - 512; + const uint16x4_t greaterThanRdo = vcgt_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ); + const uint16x4_t lessThanMinusRdo = vclt_s16( q1_Q10_s16x4, vdup_n_s16( -rdo_offset ) ); + /* If Lambda_Q10 > 32767, then q1_Q0, q1_Q10 and q2_Q10 must change to 32-bit. */ + silk_assert( Lambda_Q10 <= 32767 ); + + q1_Q0_s16x4 = vreinterpret_s16_u16( vclt_s16( q1_Q10_s16x4, vdup_n_s16( 0 ) ) ); + q1_Q0_s16x4 = vbsl_s16( greaterThanRdo, vsub_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ), q1_Q0_s16x4 ); + q1_Q0_s16x4 = vbsl_s16( lessThanMinusRdo, vadd_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ), q1_Q0_s16x4 ); + q1_Q0_s16x4 = vshr_n_s16( q1_Q0_s16x4, 10 ); + } + { + const uint16x4_t equal0_u16x4 = vceq_s16( q1_Q0_s16x4, vdup_n_s16( 0 ) ); + const uint16x4_t equalMinus1_u16x4 = vceq_s16( q1_Q0_s16x4, vdup_n_s16( -1 ) ); + const uint16x4_t lessThanMinus1_u16x4 = vclt_s16( q1_Q0_s16x4, vdup_n_s16( -1 ) ); + int16x4_t tmp1_s16x4, tmp2_s16x4; + + q1_Q10_s16x4 = vshl_n_s16( q1_Q0_s16x4, 10 ); + tmp1_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( offset_Q10 - QUANT_LEVEL_ADJUST_Q10 ) ); + q1_Q10_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( offset_Q10 + QUANT_LEVEL_ADJUST_Q10 ) ); + q1_Q10_s16x4 = vbsl_s16( lessThanMinus1_u16x4, q1_Q10_s16x4, tmp1_s16x4 ); + q1_Q10_s16x4 = vbsl_s16( equal0_u16x4, vdup_n_s16( offset_Q10 ), q1_Q10_s16x4 ); + q1_Q10_s16x4 = vbsl_s16( equalMinus1_u16x4, vdup_n_s16( offset_Q10 - ( 1024 - QUANT_LEVEL_ADJUST_Q10 ) ), q1_Q10_s16x4 ); + q2_Q10_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( 1024 ) ); + q2_Q10_s16x4 = vbsl_s16( equal0_u16x4, vdup_n_s16( offset_Q10 + 1024 - QUANT_LEVEL_ADJUST_Q10 ), q2_Q10_s16x4 ); + q2_Q10_s16x4 = vbsl_s16( equalMinus1_u16x4, vdup_n_s16( offset_Q10 ), q2_Q10_s16x4 ); + tmp1_s16x4 = q1_Q10_s16x4; + tmp2_s16x4 = q2_Q10_s16x4; + tmp1_s16x4 = vbsl_s16( vorr_u16( equalMinus1_u16x4, lessThanMinus1_u16x4 ), vneg_s16( tmp1_s16x4 ), tmp1_s16x4 ); + tmp2_s16x4 = vbsl_s16( lessThanMinus1_u16x4, vneg_s16( tmp2_s16x4 ), tmp2_s16x4 ); + rd1_Q10_s32x4 = vmull_s16( tmp1_s16x4, vdup_n_s16( Lambda_Q10 ) ); + rd2_Q10_s32x4 = vmull_s16( tmp2_s16x4, vdup_n_s16( Lambda_Q10 ) ); + } + + rr_Q10_s16x4 = vsub_s16( r_Q10_s16x4, q1_Q10_s16x4 ); + rd1_Q10_s32x4 = vmlal_s16( rd1_Q10_s32x4, rr_Q10_s16x4, rr_Q10_s16x4 ); + rd1_Q10_s32x4 = vshrq_n_s32( rd1_Q10_s32x4, 10 ); + + rr_Q10_s16x4 = vsub_s16( r_Q10_s16x4, q2_Q10_s16x4 ); + rd2_Q10_s32x4 = vmlal_s16( rd2_Q10_s32x4, rr_Q10_s16x4, rr_Q10_s16x4 ); + rd2_Q10_s32x4 = vshrq_n_s32( rd2_Q10_s32x4, 10 ); + + tmp2_s32x4 = vld1q_s32( psDelDec->RD_Q10 ); + tmp1_s32x4 = vaddq_s32( tmp2_s32x4, vminq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ) ); + tmp2_s32x4 = vaddq_s32( tmp2_s32x4, vmaxq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ) ); + vst1q_s32( psSampleState[ 0 ].RD_Q10, tmp1_s32x4 ); + vst1q_s32( psSampleState[ 1 ].RD_Q10, tmp2_s32x4 ); + t_u32x4 = vcltq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ); + tmp1_s32x4 = vbslq_s32( t_u32x4, vmovl_s16( q1_Q10_s16x4 ), vmovl_s16( q2_Q10_s16x4 ) ); + tmp2_s32x4 = vbslq_s32( t_u32x4, vmovl_s16( q2_Q10_s16x4 ), vmovl_s16( q1_Q10_s16x4 ) ); + vst1q_s32( psSampleState[ 0 ].Q_Q10, tmp1_s32x4 ); + vst1q_s32( psSampleState[ 1 ].Q_Q10, tmp2_s32x4 ); + } + + { + /* Update states for best quantization */ + int32x4_t exc_Q14_s32x4, LPC_exc_Q14_s32x4, xq_Q14_s32x4, sLF_AR_shp_Q14_s32x4; + + /* Quantized excitation */ + exc_Q14_s32x4 = vshlq_n_s32( tmp1_s32x4, 4 ); + exc_Q14_s32x4 = veorq_s32( exc_Q14_s32x4, sign_s32x4 ); + exc_Q14_s32x4 = vsubq_s32( exc_Q14_s32x4, sign_s32x4 ); + + /* Add predictions */ + LPC_exc_Q14_s32x4 = vaddq_s32( exc_Q14_s32x4, vdupq_n_s32( LTP_pred_Q14 ) ); + xq_Q14_s32x4 = vaddq_s32( LPC_exc_Q14_s32x4, LPC_pred_Q14_s32x4 ); + + /* Update states */ + tmp1_s32x4 = vsubq_s32( xq_Q14_s32x4, vshlq_n_s32( vdupq_n_s32( x_Q10[ i ] ), 4 ) ); + vst1q_s32( psSampleState[ 0 ].Diff_Q14, tmp1_s32x4 ); + sLF_AR_shp_Q14_s32x4 = vsubq_s32( tmp1_s32x4, n_AR_Q14_s32x4 ); + vst1q_s32( psSampleState[ 0 ].sLTP_shp_Q14, vsubq_s32( sLF_AR_shp_Q14_s32x4, n_LF_Q14_s32x4 ) ); + vst1q_s32( psSampleState[ 0 ].LF_AR_Q14, sLF_AR_shp_Q14_s32x4 ); + vst1q_s32( psSampleState[ 0 ].LPC_exc_Q14, LPC_exc_Q14_s32x4 ); + vst1q_s32( psSampleState[ 0 ].xq_Q14, xq_Q14_s32x4 ); + + /* Quantized excitation */ + exc_Q14_s32x4 = vshlq_n_s32( tmp2_s32x4, 4 ); + exc_Q14_s32x4 = veorq_s32( exc_Q14_s32x4, sign_s32x4 ); + exc_Q14_s32x4 = vsubq_s32( exc_Q14_s32x4, sign_s32x4 ); + + /* Add predictions */ + LPC_exc_Q14_s32x4 = vaddq_s32( exc_Q14_s32x4, vdupq_n_s32( LTP_pred_Q14 ) ); + xq_Q14_s32x4 = vaddq_s32( LPC_exc_Q14_s32x4, LPC_pred_Q14_s32x4 ); + + /* Update states */ + tmp1_s32x4 = vsubq_s32( xq_Q14_s32x4, vshlq_n_s32( vdupq_n_s32( x_Q10[ i ] ), 4 ) ); + vst1q_s32( psSampleState[ 1 ].Diff_Q14, tmp1_s32x4 ); + sLF_AR_shp_Q14_s32x4 = vsubq_s32( tmp1_s32x4, n_AR_Q14_s32x4 ); + vst1q_s32( psSampleState[ 1 ].sLTP_shp_Q14, vsubq_s32( sLF_AR_shp_Q14_s32x4, n_LF_Q14_s32x4 ) ); + vst1q_s32( psSampleState[ 1 ].LF_AR_Q14, sLF_AR_shp_Q14_s32x4 ); + vst1q_s32( psSampleState[ 1 ].LPC_exc_Q14, LPC_exc_Q14_s32x4 ); + vst1q_s32( psSampleState[ 1 ].xq_Q14, xq_Q14_s32x4 ); + } + + *smpl_buf_idx = *smpl_buf_idx ? ( *smpl_buf_idx - 1 ) : ( DECISION_DELAY - 1); + last_smple_idx = *smpl_buf_idx + decisionDelay + DECISION_DELAY; + if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; + if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; + + /* Find winner */ + RDmin_Q10 = psSampleState[ 0 ].RD_Q10[ 0 ]; + Winner_ind = 0; + for( k = 1; k < nStatesDelayedDecision; k++ ) { + if( psSampleState[ 0 ].RD_Q10[ k ] < RDmin_Q10 ) { + RDmin_Q10 = psSampleState[ 0 ].RD_Q10[ k ]; + Winner_ind = k; + } + } + + /* Increase RD values of expired states */ + { + uint32x4_t t_u32x4; + Winner_rand_state = psDelDec->RandState[ last_smple_idx ][ Winner_ind ]; + t_u32x4 = vceqq_s32( vld1q_s32( psDelDec->RandState[ last_smple_idx ] ), vdupq_n_s32( Winner_rand_state ) ); + t_u32x4 = vmvnq_u32( t_u32x4 ); + t_u32x4 = vshrq_n_u32( t_u32x4, 5 ); + tmp1_s32x4 = vld1q_s32( psSampleState[ 0 ].RD_Q10 ); + tmp2_s32x4 = vld1q_s32( psSampleState[ 1 ].RD_Q10 ); + tmp1_s32x4 = vaddq_s32( tmp1_s32x4, vreinterpretq_s32_u32( t_u32x4 ) ); + tmp2_s32x4 = vaddq_s32( tmp2_s32x4, vreinterpretq_s32_u32( t_u32x4 ) ); + vst1q_s32( psSampleState[ 0 ].RD_Q10, tmp1_s32x4 ); + vst1q_s32( psSampleState[ 1 ].RD_Q10, tmp2_s32x4 ); + + /* Find worst in first set and best in second set */ + RDmax_Q10 = psSampleState[ 0 ].RD_Q10[ 0 ]; + RDmin_Q10 = psSampleState[ 1 ].RD_Q10[ 0 ]; + RDmax_ind = 0; + RDmin_ind = 0; + for( k = 1; k < nStatesDelayedDecision; k++ ) { + /* find worst in first set */ + if( psSampleState[ 0 ].RD_Q10[ k ] > RDmax_Q10 ) { + RDmax_Q10 = psSampleState[ 0 ].RD_Q10[ k ]; + RDmax_ind = k; + } + /* find best in second set */ + if( psSampleState[ 1 ].RD_Q10[ k ] < RDmin_Q10 ) { + RDmin_Q10 = psSampleState[ 1 ].RD_Q10[ k ]; + RDmin_ind = k; + } + } + } + + /* Replace a state if best from second set outperforms worst in first set */ + if( RDmin_Q10 < RDmax_Q10 ) { + opus_int32 (*ptr)[NEON_MAX_DEL_DEC_STATES] = psDelDec->RandState; + const int numOthers = (int)( ( sizeof( NSQ_del_decs_struct ) - sizeof( ( (NSQ_del_decs_struct *)0 )->sLPC_Q14 ) ) + / ( NEON_MAX_DEL_DEC_STATES * sizeof( opus_int32 ) ) ); + /* Only ( predictLPCOrder - 1 ) of sLPC_Q14 buffer need to be updated, though the first several */ + /* useless sLPC_Q14[] will be different comparing with C when predictLPCOrder < NSQ_LPC_BUF_LENGTH. */ + /* Here just update constant ( NSQ_LPC_BUF_LENGTH - 1 ) for simplicity. */ + for( j = i + 1; j < i + NSQ_LPC_BUF_LENGTH; j++ ) { + psDelDec->sLPC_Q14[ j ][ RDmax_ind ] = psDelDec->sLPC_Q14[ j ][ RDmin_ind ]; + } + for( j = 0; j < numOthers; j++ ) { + ptr[ j ][ RDmax_ind ] = ptr[ j ][ RDmin_ind ]; + } + + psSampleState[ 0 ].Q_Q10[ RDmax_ind ] = psSampleState[ 1 ].Q_Q10[ RDmin_ind ]; + psSampleState[ 0 ].RD_Q10[ RDmax_ind ] = psSampleState[ 1 ].RD_Q10[ RDmin_ind ]; + psSampleState[ 0 ].xq_Q14[ RDmax_ind ] = psSampleState[ 1 ].xq_Q14[ RDmin_ind ]; + psSampleState[ 0 ].LF_AR_Q14[ RDmax_ind ] = psSampleState[ 1 ].LF_AR_Q14[ RDmin_ind ]; + psSampleState[ 0 ].Diff_Q14[ RDmax_ind ] = psSampleState[ 1 ].Diff_Q14[ RDmin_ind ]; + psSampleState[ 0 ].sLTP_shp_Q14[ RDmax_ind ] = psSampleState[ 1 ].sLTP_shp_Q14[ RDmin_ind ]; + psSampleState[ 0 ].LPC_exc_Q14[ RDmax_ind ] = psSampleState[ 1 ].LPC_exc_Q14[ RDmin_ind ]; + } + + /* Write samples from winner to output and long-term filter states */ + if( subfr > 0 || i >= decisionDelay ) { + pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); + xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( + silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], delayedGain_Q10[ last_smple_idx ] ), 8 ) ); + NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; + sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDelDec->Pred_Q15[ last_smple_idx ][ Winner_ind ]; + } + NSQ->sLTP_shp_buf_idx++; + NSQ->sLTP_buf_idx++; + + /* Update states */ + vst1q_s32( psDelDec->LF_AR_Q14, vld1q_s32( psSampleState[ 0 ].LF_AR_Q14 ) ); + vst1q_s32( psDelDec->Diff_Q14, vld1q_s32( psSampleState[ 0 ].Diff_Q14 ) ); + vst1q_s32( psDelDec->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ], vld1q_s32( psSampleState[ 0 ].xq_Q14 ) ); + vst1q_s32( psDelDec->Xq_Q14[ *smpl_buf_idx ], vld1q_s32( psSampleState[ 0 ].xq_Q14 ) ); + tmp1_s32x4 = vld1q_s32( psSampleState[ 0 ].Q_Q10 ); + vst1q_s32( psDelDec->Q_Q10[ *smpl_buf_idx ], tmp1_s32x4 ); + vst1q_s32( psDelDec->Pred_Q15[ *smpl_buf_idx ], vshlq_n_s32( vld1q_s32( psSampleState[ 0 ].LPC_exc_Q14 ), 1 ) ); + vst1q_s32( psDelDec->Shape_Q14[ *smpl_buf_idx ], vld1q_s32( psSampleState[ 0 ].sLTP_shp_Q14 ) ); + tmp1_s32x4 = vrshrq_n_s32( tmp1_s32x4, 10 ); + tmp1_s32x4 = vaddq_s32( vld1q_s32( psDelDec->Seed ), tmp1_s32x4 ); + vst1q_s32( psDelDec->Seed, tmp1_s32x4 ); + vst1q_s32( psDelDec->RandState[ *smpl_buf_idx ], tmp1_s32x4 ); + vst1q_s32( psDelDec->RD_Q10, vld1q_s32( psSampleState[ 0 ].RD_Q10 ) ); + delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; + } + /* Update LPC states */ + silk_memcpy( psDelDec->sLPC_Q14[ 0 ], psDelDec->sLPC_Q14[ length ], NEON_MAX_DEL_DEC_STATES * NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); + + RESTORE_STACK; +} + +static OPUS_INLINE void silk_SMULWB_8_neon( + const opus_int16 *a, + const int32x2_t b, + opus_int32 *o +) +{ + const int16x8_t a_s16x8 = vld1q_s16( a ); + int32x4_t o0_s32x4, o1_s32x4; + + o0_s32x4 = vshll_n_s16( vget_low_s16( a_s16x8 ), 15 ); + o1_s32x4 = vshll_n_s16( vget_high_s16( a_s16x8 ), 15 ); + o0_s32x4 = vqdmulhq_lane_s32( o0_s32x4, b, 0 ); + o1_s32x4 = vqdmulhq_lane_s32( o1_s32x4, b, 0 ); + vst1q_s32( o, o0_s32x4 ); + vst1q_s32( o + 4, o1_s32x4 ); +} + +/* Only works when ( b >= -65536 ) && ( b < 65536 ). */ +static OPUS_INLINE void silk_SMULWW_small_b_4_neon( + opus_int32 *a, + const int32x2_t b_s32x2) +{ + int32x4_t o_s32x4; + + o_s32x4 = vld1q_s32( a ); + o_s32x4 = vqdmulhq_lane_s32( o_s32x4, b_s32x2, 0 ); + vst1q_s32( a, o_s32x4 ); +} + +/* Only works when ( b >= -65536 ) && ( b < 65536 ). */ +static OPUS_INLINE void silk_SMULWW_small_b_8_neon( + opus_int32 *a, + const int32x2_t b_s32x2 +) +{ + int32x4_t o0_s32x4, o1_s32x4; + + o0_s32x4 = vld1q_s32( a ); + o1_s32x4 = vld1q_s32( a + 4 ); + o0_s32x4 = vqdmulhq_lane_s32( o0_s32x4, b_s32x2, 0 ); + o1_s32x4 = vqdmulhq_lane_s32( o1_s32x4, b_s32x2, 0 ); + vst1q_s32( a, o0_s32x4 ); + vst1q_s32( a + 4, o1_s32x4 ); +} + +static OPUS_INLINE void silk_SMULWW_4_neon( + opus_int32 *a, + const int32x2_t b_s32x2) +{ + int32x4_t a_s32x4, o_s32x4; + + a_s32x4 = vld1q_s32( a ); + o_s32x4 = vqdmulhq_lane_s32( a_s32x4, b_s32x2, 0 ); + o_s32x4 = vmlaq_lane_s32( o_s32x4, a_s32x4, b_s32x2, 1 ); + vst1q_s32( a, o_s32x4 ); +} + +static OPUS_INLINE void silk_SMULWW_8_neon( + opus_int32 *a, + const int32x2_t b_s32x2 +) +{ + int32x4_t a0_s32x4, a1_s32x4, o0_s32x4, o1_s32x4; + + a0_s32x4 = vld1q_s32( a ); + a1_s32x4 = vld1q_s32( a + 4 ); + o0_s32x4 = vqdmulhq_lane_s32( a0_s32x4, b_s32x2, 0 ); + o1_s32x4 = vqdmulhq_lane_s32( a1_s32x4, b_s32x2, 0 ); + o0_s32x4 = vmlaq_lane_s32( o0_s32x4, a0_s32x4, b_s32x2, 1 ); + o1_s32x4 = vmlaq_lane_s32( o1_s32x4, a1_s32x4, b_s32x2, 1 ); + vst1q_s32( a, o0_s32x4 ); + vst1q_s32( a + 4, o1_s32x4 ); +} + +static OPUS_INLINE void silk_SMULWW_loop_neon( + const opus_int16 *a, + const opus_int32 b, + opus_int32 *o, + const opus_int loop_num +) +{ + opus_int i; + int32x2_t b_s32x2; + + b_s32x2 = vdup_n_s32( b ); + for( i = 0; i < loop_num - 7; i += 8 ) { + silk_SMULWB_8_neon( a + i, b_s32x2, o + i ); + } + for( ; i < loop_num; i++ ) { + o[ i ] = silk_SMULWW( a[ i ], b ); + } +} + +static OPUS_INLINE void silk_nsq_del_dec_scale_states_neon( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ + const opus_int16 x16[], /* I Input */ + opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ + const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ + opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ + opus_int subfr, /* I Subframe number */ + const opus_int LTP_scale_Q14, /* I LTP state scaling */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ + const opus_int signal_type, /* I Signal type */ + const opus_int decisionDelay /* I Decision delay */ +) +{ + opus_int i, lag; + opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; + + lag = pitchL[ subfr ]; + inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); + silk_assert( inv_gain_Q31 != 0 ); + + /* Scale input */ + inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); + silk_SMULWW_loop_neon( x16, inv_gain_Q26, x_sc_Q10, psEncC->subfr_length ); + + /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ + if( NSQ->rewhite_flag ) { + if( subfr == 0 ) { + /* Do LTP downscaling */ + inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); + } + silk_SMULWW_loop_neon( sLTP + NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2, inv_gain_Q31, sLTP_Q15 + NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2, lag + LTP_ORDER / 2 ); + } + + /* Adjust for changing gain */ + if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { + int32x2_t gain_adj_Q16_s32x2; + gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); + + /* Scale long-term shaping state */ + if( ( gain_adj_Q16 >= -65536 ) && ( gain_adj_Q16 < 65536 ) ) { + gain_adj_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( gain_adj_Q16, 15 ) ); + for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 7; i += 8 ) { + silk_SMULWW_small_b_8_neon( NSQ->sLTP_shp_Q14 + i, gain_adj_Q16_s32x2 ); + } + for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { + NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); + } + + /* Scale long-term prediction state */ + if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { + for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay - 7; i += 8 ) { + silk_SMULWW_small_b_8_neon( sLTP_Q15 + i, gain_adj_Q16_s32x2 ); + } + for( ; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { + sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); + } + } + + /* Scale scalar states */ + silk_SMULWW_small_b_4_neon( psDelDec->LF_AR_Q14, gain_adj_Q16_s32x2 ); + silk_SMULWW_small_b_4_neon( psDelDec->Diff_Q14, gain_adj_Q16_s32x2 ); + + /* Scale short-term prediction and shaping states */ + for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { + silk_SMULWW_small_b_4_neon( psDelDec->sLPC_Q14[ i ], gain_adj_Q16_s32x2 ); + } + + for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { + silk_SMULWW_small_b_4_neon( psDelDec->sAR2_Q14[ i ], gain_adj_Q16_s32x2 ); + } + + for( i = 0; i < DECISION_DELAY; i++ ) { + silk_SMULWW_small_b_4_neon( psDelDec->Pred_Q15[ i ], gain_adj_Q16_s32x2 ); + silk_SMULWW_small_b_4_neon( psDelDec->Shape_Q14[ i ], gain_adj_Q16_s32x2 ); + } + } else { + gain_adj_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( gain_adj_Q16 & 0x0000FFFF, 15 ) ); + gain_adj_Q16_s32x2 = vset_lane_s32( gain_adj_Q16 >> 16, gain_adj_Q16_s32x2, 1 ); + for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 7; i += 8 ) { + silk_SMULWW_8_neon( NSQ->sLTP_shp_Q14 + i, gain_adj_Q16_s32x2 ); + } + for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { + NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); + } + + /* Scale long-term prediction state */ + if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { + for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay - 7; i += 8 ) { + silk_SMULWW_8_neon( sLTP_Q15 + i, gain_adj_Q16_s32x2 ); + } + for( ; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { + sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); + } + } + + /* Scale scalar states */ + silk_SMULWW_4_neon( psDelDec->LF_AR_Q14, gain_adj_Q16_s32x2 ); + silk_SMULWW_4_neon( psDelDec->Diff_Q14, gain_adj_Q16_s32x2 ); + + /* Scale short-term prediction and shaping states */ + for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { + silk_SMULWW_4_neon( psDelDec->sLPC_Q14[ i ], gain_adj_Q16_s32x2 ); + } + + for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { + silk_SMULWW_4_neon( psDelDec->sAR2_Q14[ i ], gain_adj_Q16_s32x2 ); + } + + for( i = 0; i < DECISION_DELAY; i++ ) { + silk_SMULWW_4_neon( psDelDec->Pred_Q15[ i ], gain_adj_Q16_s32x2 ); + silk_SMULWW_4_neon( psDelDec->Shape_Q14[ i ], gain_adj_Q16_s32x2 ); + } + } + + /* Save inverse gain */ + NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; + } +} diff --git a/external/opus-1.3.1/silk/arm/NSQ_neon.c b/external/opus-1.3.1/silk/arm/NSQ_neon.c new file mode 100644 index 00000000..96425299 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/NSQ_neon.c @@ -0,0 +1,112 @@ +/*********************************************************************** +Copyright (C) 2014 Vidyo +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "main.h" +#include "stack_alloc.h" +#include "NSQ.h" +#include "celt/cpu_support.h" +#include "celt/arm/armcpu.h" + +opus_int32 silk_noise_shape_quantizer_short_prediction_neon(const opus_int32 *buf32, const opus_int32 *coef32, opus_int order) +{ + int32x4_t coef0 = vld1q_s32(coef32); + int32x4_t coef1 = vld1q_s32(coef32 + 4); + int32x4_t coef2 = vld1q_s32(coef32 + 8); + int32x4_t coef3 = vld1q_s32(coef32 + 12); + + int32x4_t a0 = vld1q_s32(buf32 - 15); + int32x4_t a1 = vld1q_s32(buf32 - 11); + int32x4_t a2 = vld1q_s32(buf32 - 7); + int32x4_t a3 = vld1q_s32(buf32 - 3); + + int32x4_t b0 = vqdmulhq_s32(coef0, a0); + int32x4_t b1 = vqdmulhq_s32(coef1, a1); + int32x4_t b2 = vqdmulhq_s32(coef2, a2); + int32x4_t b3 = vqdmulhq_s32(coef3, a3); + + int32x4_t c0 = vaddq_s32(b0, b1); + int32x4_t c1 = vaddq_s32(b2, b3); + + int32x4_t d = vaddq_s32(c0, c1); + + int64x2_t e = vpaddlq_s32(d); + + int64x1_t f = vadd_s64(vget_low_s64(e), vget_high_s64(e)); + + opus_int32 out = vget_lane_s32(vreinterpret_s32_s64(f), 0); + + out += silk_RSHIFT( order, 1 ); + + return out; +} + + +opus_int32 silk_NSQ_noise_shape_feedback_loop_neon(const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order) +{ + opus_int32 out; + if (order == 8) + { + int32x4_t a00 = vdupq_n_s32(data0[0]); + int32x4_t a01 = vld1q_s32(data1); /* data1[0] ... [3] */ + + int32x4_t a0 = vextq_s32 (a00, a01, 3); /* data0[0] data1[0] ...[2] */ + int32x4_t a1 = vld1q_s32(data1 + 3); /* data1[3] ... [6] */ + + /*TODO: Convert these once in advance instead of once per sample, like + silk_noise_shape_quantizer_short_prediction_neon() does.*/ + int16x8_t coef16 = vld1q_s16(coef); + int32x4_t coef0 = vmovl_s16(vget_low_s16(coef16)); + int32x4_t coef1 = vmovl_s16(vget_high_s16(coef16)); + + /*This is not bit-exact with the C version, since we do not drop the + lower 16 bits of each multiply, but wait until the end to truncate + precision. This is an encoder-specific calculation (and unlike + silk_noise_shape_quantizer_short_prediction_neon(), is not meant to + simulate what the decoder will do). We still could use vqdmulhq_s32() + like silk_noise_shape_quantizer_short_prediction_neon() and save + half the multiplies, but the speed difference is not large, since we + then need two extra adds.*/ + int64x2_t b0 = vmull_s32(vget_low_s32(a0), vget_low_s32(coef0)); + int64x2_t b1 = vmlal_s32(b0, vget_high_s32(a0), vget_high_s32(coef0)); + int64x2_t b2 = vmlal_s32(b1, vget_low_s32(a1), vget_low_s32(coef1)); + int64x2_t b3 = vmlal_s32(b2, vget_high_s32(a1), vget_high_s32(coef1)); + + int64x1_t c = vadd_s64(vget_low_s64(b3), vget_high_s64(b3)); + int64x1_t cS = vrshr_n_s64(c, 15); + int32x2_t d = vreinterpret_s32_s64(cS); + + out = vget_lane_s32(d, 0); + vst1q_s32(data1, a0); + vst1q_s32(data1 + 4, a1); + return out; + } + return silk_NSQ_noise_shape_feedback_loop_c(data0, data1, coef, order); +} diff --git a/external/opus-1.3.1/silk/arm/NSQ_neon.h b/external/opus-1.3.1/silk/arm/NSQ_neon.h new file mode 100644 index 00000000..b31d9442 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/NSQ_neon.h @@ -0,0 +1,114 @@ +/*********************************************************************** +Copyright (C) 2014 Vidyo +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ +#ifndef SILK_NSQ_NEON_H +#define SILK_NSQ_NEON_H + +#include "cpu_support.h" +#include "SigProc_FIX.h" + +#undef silk_short_prediction_create_arch_coef +/* For vectorized calc, reverse a_Q12 coefs, convert to 32-bit, and shift for vqdmulhq_s32. */ +static OPUS_INLINE void silk_short_prediction_create_arch_coef_neon(opus_int32 *out, const opus_int16 *in, opus_int order) +{ + out[15] = silk_LSHIFT32(in[0], 15); + out[14] = silk_LSHIFT32(in[1], 15); + out[13] = silk_LSHIFT32(in[2], 15); + out[12] = silk_LSHIFT32(in[3], 15); + out[11] = silk_LSHIFT32(in[4], 15); + out[10] = silk_LSHIFT32(in[5], 15); + out[9] = silk_LSHIFT32(in[6], 15); + out[8] = silk_LSHIFT32(in[7], 15); + out[7] = silk_LSHIFT32(in[8], 15); + out[6] = silk_LSHIFT32(in[9], 15); + + if (order == 16) + { + out[5] = silk_LSHIFT32(in[10], 15); + out[4] = silk_LSHIFT32(in[11], 15); + out[3] = silk_LSHIFT32(in[12], 15); + out[2] = silk_LSHIFT32(in[13], 15); + out[1] = silk_LSHIFT32(in[14], 15); + out[0] = silk_LSHIFT32(in[15], 15); + } + else + { + out[5] = 0; + out[4] = 0; + out[3] = 0; + out[2] = 0; + out[1] = 0; + out[0] = 0; + } +} + +#if defined(OPUS_ARM_PRESUME_NEON_INTR) + +#define silk_short_prediction_create_arch_coef(out, in, order) \ + (silk_short_prediction_create_arch_coef_neon(out, in, order)) + +#elif defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_MAY_HAVE_NEON_INTR) + +#define silk_short_prediction_create_arch_coef(out, in, order) \ + do { if (arch == OPUS_ARCH_ARM_NEON) { silk_short_prediction_create_arch_coef_neon(out, in, order); } } while (0) + +#endif + +opus_int32 silk_noise_shape_quantizer_short_prediction_neon(const opus_int32 *buf32, const opus_int32 *coef32, opus_int order); + +opus_int32 silk_NSQ_noise_shape_feedback_loop_neon(const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order); + +#if defined(OPUS_ARM_PRESUME_NEON_INTR) +#undef silk_noise_shape_quantizer_short_prediction +#define silk_noise_shape_quantizer_short_prediction(in, coef, coefRev, order, arch) \ + ((void)arch,silk_noise_shape_quantizer_short_prediction_neon(in, coefRev, order)) + +#undef silk_NSQ_noise_shape_feedback_loop +#define silk_NSQ_noise_shape_feedback_loop(data0, data1, coef, order, arch) ((void)arch,silk_NSQ_noise_shape_feedback_loop_neon(data0, data1, coef, order)) + +#elif defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_MAY_HAVE_NEON_INTR) + +/* silk_noise_shape_quantizer_short_prediction implementations take different parameters based on arch + (coef vs. coefRev) so can't use the usual IMPL table implementation */ +#undef silk_noise_shape_quantizer_short_prediction +#define silk_noise_shape_quantizer_short_prediction(in, coef, coefRev, order, arch) \ + (arch == OPUS_ARCH_ARM_NEON ? \ + silk_noise_shape_quantizer_short_prediction_neon(in, coefRev, order) : \ + silk_noise_shape_quantizer_short_prediction_c(in, coef, order)) + +extern opus_int32 + (*const SILK_NSQ_NOISE_SHAPE_FEEDBACK_LOOP_IMPL[OPUS_ARCHMASK+1])( + const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, + opus_int order); + +#undef silk_NSQ_noise_shape_feedback_loop +#define silk_NSQ_noise_shape_feedback_loop(data0, data1, coef, order, arch) \ + (SILK_NSQ_NOISE_SHAPE_FEEDBACK_LOOP_IMPL[(arch)&OPUS_ARCHMASK](data0, data1, \ + coef, order)) + +#endif + +#endif /* SILK_NSQ_NEON_H */ diff --git a/external/opus-1.0.3/win32/config.h b/external/opus-1.3.1/silk/arm/SigProc_FIX_armv4.h similarity index 71% rename from external/opus-1.0.3/win32/config.h rename to external/opus-1.3.1/silk/arm/SigProc_FIX_armv4.h index d89ee9ea..ff62b1e5 100644 --- a/external/opus-1.0.3/win32/config.h +++ b/external/opus-1.3.1/silk/arm/SigProc_FIX_armv4.h @@ -1,5 +1,6 @@ /*********************************************************************** -Copyright (c) 2011, Skype Limited. All rights reserved. +Copyright (C) 2013 Xiph.Org Foundation and contributors +Copyright (c) 2013 Parrot Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -12,7 +13,7 @@ documentation and/or other materials provided with the distribution. names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -25,26 +26,22 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -#ifndef CONFIG_H -#define CONFIG_H +#ifndef SILK_SIGPROC_FIX_ARMv4_H +#define SILK_SIGPROC_FIX_ARMv4_H + +#undef silk_MLA +static OPUS_INLINE opus_int32 silk_MLA_armv4(opus_int32 a, opus_int32 b, + opus_int32 c) +{ + opus_int32 res; + __asm__( + "#silk_MLA\n\t" + "mla %0, %1, %2, %3\n\t" + : "=&r"(res) + : "r"(b), "r"(c), "r"(a) + ); + return res; +} +#define silk_MLA(a, b, c) (silk_MLA_armv4(a, b, c)) -#define inline __inline - -#define USE_ALLOCA 1 - -/* Comment out the next line for floating-point code */ -/*#define FIXED_POINT 1 */ - -/* Compile with encoder support */ -#define OPUS_ENABLE_ENCODER 1 - -#define OPUS_BUILD 1 - -/* Get rid of the CELT VS compile warnings */ -#if 1 -#pragma warning(disable : 4996)/* This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. */ #endif - -#include "version.h" - -#endif CONFIG_H diff --git a/external/opus-1.0.3/silk/float/levinsondurbin_FLP.c b/external/opus-1.3.1/silk/arm/SigProc_FIX_armv5e.h similarity index 50% rename from external/opus-1.0.3/silk/float/levinsondurbin_FLP.c rename to external/opus-1.3.1/silk/arm/SigProc_FIX_armv5e.h index b4cd34e2..617a09ca 100644 --- a/external/opus-1.0.3/silk/float/levinsondurbin_FLP.c +++ b/external/opus-1.3.1/silk/arm/SigProc_FIX_armv5e.h @@ -1,5 +1,6 @@ /*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Copyright (c) 2013 Parrot Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -8,11 +9,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -25,57 +26,36 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "SigProc_FLP.h" +#ifndef SILK_SIGPROC_FIX_ARMv5E_H +#define SILK_SIGPROC_FIX_ARMv5E_H -/* Solve the normal equations using the Levinson-Durbin recursion */ -silk_float silk_levinsondurbin_FLP( /* O prediction error energy */ - silk_float A[], /* O prediction coefficients [order] */ - const silk_float corr[], /* I input auto-correlations [order + 1] */ - const opus_int order /* I prediction order */ -) +#undef silk_SMULTT +static OPUS_INLINE opus_int32 silk_SMULTT_armv5e(opus_int32 a, opus_int32 b) { - opus_int i, mHalf, m; - silk_float min_nrg, nrg, t, km, Atmp1, Atmp2; - - min_nrg = 1e-12f * corr[ 0 ] + 1e-9f; - nrg = corr[ 0 ]; - nrg = silk_max_float(min_nrg, nrg); - A[ 0 ] = corr[ 1 ] / nrg; - nrg -= A[ 0 ] * corr[ 1 ]; - nrg = silk_max_float(min_nrg, nrg); - - for( m = 1; m < order; m++ ) - { - t = corr[ m + 1 ]; - for( i = 0; i < m; i++ ) { - t -= A[ i ] * corr[ m - i ]; - } - - /* reflection coefficient */ - km = t / nrg; - - /* residual energy */ - nrg -= km * t; - nrg = silk_max_float(min_nrg, nrg); - - mHalf = m >> 1; - for( i = 0; i < mHalf; i++ ) { - Atmp1 = A[ i ]; - Atmp2 = A[ m - i - 1 ]; - A[ m - i - 1 ] -= km * Atmp1; - A[ i ] -= km * Atmp2; - } - if( m & 1 ) { - A[ mHalf ] -= km * A[ mHalf ]; - } - A[ m ] = km; - } + opus_int32 res; + __asm__( + "#silk_SMULTT\n\t" + "smultt %0, %1, %2\n\t" + : "=r"(res) + : "%r"(a), "r"(b) + ); + return res; +} +#define silk_SMULTT(a, b) (silk_SMULTT_armv5e(a, b)) - /* return the residual energy */ - return nrg; +#undef silk_SMLATT +static OPUS_INLINE opus_int32 silk_SMLATT_armv5e(opus_int32 a, opus_int32 b, + opus_int32 c) +{ + opus_int32 res; + __asm__( + "#silk_SMLATT\n\t" + "smlatt %0, %1, %2, %3\n\t" + : "=r"(res) + : "%r"(b), "r"(c), "r"(a) + ); + return res; } +#define silk_SMLATT(a, b, c) (silk_SMLATT_armv5e(a, b, c)) +#endif diff --git a/external/opus-1.3.1/silk/arm/arm_silk_map.c b/external/opus-1.3.1/silk/arm/arm_silk_map.c new file mode 100644 index 00000000..0b9bfec2 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/arm_silk_map.c @@ -0,0 +1,123 @@ +/*********************************************************************** +Copyright (C) 2014 Vidyo +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "main_FIX.h" +#include "NSQ.h" +#include "SigProc_FIX.h" + +#if defined(OPUS_HAVE_RTCD) + +# if (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && \ + !defined(OPUS_ARM_PRESUME_NEON_INTR)) + +void (*const SILK_BIQUAD_ALT_STRIDE2_IMPL[OPUS_ARCHMASK + 1])( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [4] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ +) = { + silk_biquad_alt_stride2_c, /* ARMv4 */ + silk_biquad_alt_stride2_c, /* EDSP */ + silk_biquad_alt_stride2_c, /* Media */ + silk_biquad_alt_stride2_neon, /* Neon */ +}; + +opus_int32 (*const SILK_LPC_INVERSE_PRED_GAIN_IMPL[OPUS_ARCHMASK + 1])( /* O Returns inverse prediction gain in energy domain, Q30 */ + const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ + const opus_int order /* I Prediction order */ +) = { + silk_LPC_inverse_pred_gain_c, /* ARMv4 */ + silk_LPC_inverse_pred_gain_c, /* EDSP */ + silk_LPC_inverse_pred_gain_c, /* Media */ + silk_LPC_inverse_pred_gain_neon, /* Neon */ +}; + +void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int16 x16[], /* I Input */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +) = { + silk_NSQ_del_dec_c, /* ARMv4 */ + silk_NSQ_del_dec_c, /* EDSP */ + silk_NSQ_del_dec_c, /* Media */ + silk_NSQ_del_dec_neon, /* Neon */ +}; + +/*There is no table for silk_noise_shape_quantizer_short_prediction because the + NEON version takes different parameters than the C version. + Instead RTCD is done via if statements at the call sites. + See NSQ_neon.h for details.*/ + +opus_int32 + (*const SILK_NSQ_NOISE_SHAPE_FEEDBACK_LOOP_IMPL[OPUS_ARCHMASK+1])( + const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, + opus_int order) = { + silk_NSQ_noise_shape_feedback_loop_c, /* ARMv4 */ + silk_NSQ_noise_shape_feedback_loop_c, /* EDSP */ + silk_NSQ_noise_shape_feedback_loop_c, /* Media */ + silk_NSQ_noise_shape_feedback_loop_neon, /* NEON */ +}; + +# endif + +# if defined(FIXED_POINT) && \ + defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) + +void (*const SILK_WARPED_AUTOCORRELATION_FIX_IMPL[OPUS_ARCHMASK + 1])( + opus_int32 *corr, /* O Result [order + 1] */ + opus_int *scale, /* O Scaling of the correlation vector */ + const opus_int16 *input, /* I Input data to correlate */ + const opus_int warping_Q16, /* I Warping coefficient */ + const opus_int length, /* I Length of input */ + const opus_int order /* I Correlation order (even) */ +) = { + silk_warped_autocorrelation_FIX_c, /* ARMv4 */ + silk_warped_autocorrelation_FIX_c, /* EDSP */ + silk_warped_autocorrelation_FIX_c, /* Media */ + silk_warped_autocorrelation_FIX_neon, /* Neon */ +}; + +# endif + +#endif /* OPUS_HAVE_RTCD */ diff --git a/external/opus-1.3.1/silk/arm/biquad_alt_arm.h b/external/opus-1.3.1/silk/arm/biquad_alt_arm.h new file mode 100644 index 00000000..66ea9f43 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/biquad_alt_arm.h @@ -0,0 +1,68 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_BIQUAD_ALT_ARM_H +# define SILK_BIQUAD_ALT_ARM_H + +# include "celt/arm/armcpu.h" + +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +void silk_biquad_alt_stride2_neon( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [4] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ +); + +# if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) +# define OVERRIDE_silk_biquad_alt_stride2 (1) +# define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), PRESUME_NEON(silk_biquad_alt_stride2)(in, B_Q28, A_Q28, S, out, len)) +# endif +# endif + +# if !defined(OVERRIDE_silk_biquad_alt_stride2) +/*Is run-time CPU detection enabled on this platform?*/ +# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) +extern void (*const SILK_BIQUAD_ALT_STRIDE2_IMPL[OPUS_ARCHMASK+1])( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [4] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ + ); +# define OVERRIDE_silk_biquad_alt_stride2 (1) +# define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((*SILK_BIQUAD_ALT_STRIDE2_IMPL[(arch)&OPUS_ARCHMASK])(in, B_Q28, A_Q28, S, out, len)) +# elif defined(OPUS_ARM_PRESUME_NEON_INTR) +# define OVERRIDE_silk_biquad_alt_stride2 (1) +# define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), silk_biquad_alt_stride2_neon(in, B_Q28, A_Q28, S, out, len)) +# endif +# endif + +#endif /* end SILK_BIQUAD_ALT_ARM_H */ diff --git a/external/opus-1.3.1/silk/arm/biquad_alt_neon_intr.c b/external/opus-1.3.1/silk/arm/biquad_alt_neon_intr.c new file mode 100644 index 00000000..97157331 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/biquad_alt_neon_intr.c @@ -0,0 +1,156 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef OPUS_CHECK_ASM +# include +# include "stack_alloc.h" +#endif +#include "SigProc_FIX.h" + +static inline void silk_biquad_alt_stride2_kernel( const int32x4_t A_L_s32x4, const int32x4_t A_U_s32x4, const int32x4_t B_Q28_s32x4, const int32x2_t t_s32x2, const int32x4_t in_s32x4, int32x4_t *S_s32x4, int32x2_t *out32_Q14_s32x2 ) +{ + int32x4_t t_s32x4, out32_Q14_s32x4; + + *out32_Q14_s32x2 = vadd_s32( vget_low_s32( *S_s32x4 ), t_s32x2 ); /* silk_SMLAWB( S{0,1}, B_Q28[ 0 ], in{0,1} ) */ + *S_s32x4 = vcombine_s32( vget_high_s32( *S_s32x4 ), vdup_n_s32( 0 ) ); /* S{0,1} = S{2,3}; S{2,3} = 0; */ + *out32_Q14_s32x2 = vshl_n_s32( *out32_Q14_s32x2, 2 ); /* out32_Q14_{0,1} = silk_LSHIFT( silk_SMLAWB( S{0,1}, B_Q28[ 0 ], in{0,1} ), 2 ); */ + out32_Q14_s32x4 = vcombine_s32( *out32_Q14_s32x2, *out32_Q14_s32x2 ); /* out32_Q14_{0,1,0,1} */ + t_s32x4 = vqdmulhq_s32( out32_Q14_s32x4, A_L_s32x4 ); /* silk_SMULWB( out32_Q14_{0,1,0,1}, A{0,0,1,1}_L_Q28 ) */ + *S_s32x4 = vrsraq_n_s32( *S_s32x4, t_s32x4, 14 ); /* S{0,1} = S{2,3} + silk_RSHIFT_ROUND(); S{2,3} = silk_RSHIFT_ROUND(); */ + t_s32x4 = vqdmulhq_s32( out32_Q14_s32x4, A_U_s32x4 ); /* silk_SMULWB( out32_Q14_{0,1,0,1}, A{0,0,1,1}_U_Q28 ) */ + *S_s32x4 = vaddq_s32( *S_s32x4, t_s32x4 ); /* S0 = silk_SMLAWB( S{0,1,2,3}, out32_Q14_{0,1,0,1}, A{0,0,1,1}_U_Q28 ); */ + t_s32x4 = vqdmulhq_s32( in_s32x4, B_Q28_s32x4 ); /* silk_SMULWB( B_Q28[ {1,1,2,2} ], in{0,1,0,1} ) */ + *S_s32x4 = vaddq_s32( *S_s32x4, t_s32x4 ); /* S0 = silk_SMLAWB( S0, B_Q28[ {1,1,2,2} ], in{0,1,0,1} ); */ +} + +void silk_biquad_alt_stride2_neon( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [4] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ +) +{ + /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ + opus_int k = 0; + const int32x2_t offset_s32x2 = vdup_n_s32( (1<<14) - 1 ); + const int32x4_t offset_s32x4 = vcombine_s32( offset_s32x2, offset_s32x2 ); + int16x4_t in_s16x4 = vdup_n_s16( 0 ); + int16x4_t out_s16x4; + int32x2_t A_Q28_s32x2, A_L_s32x2, A_U_s32x2, B_Q28_s32x2, t_s32x2; + int32x4_t A_L_s32x4, A_U_s32x4, B_Q28_s32x4, S_s32x4, out32_Q14_s32x4; + int32x2x2_t t0_s32x2x2, t1_s32x2x2, t2_s32x2x2, S_s32x2x2; + +#ifdef OPUS_CHECK_ASM + opus_int32 S_c[ 4 ]; + VARDECL( opus_int16, out_c ); + SAVE_STACK; + ALLOC( out_c, 2 * len, opus_int16 ); + + silk_memcpy( &S_c, S, sizeof( S_c ) ); + silk_biquad_alt_stride2_c( in, B_Q28, A_Q28, S_c, out_c, len ); +#endif + + /* Negate A_Q28 values and split in two parts */ + A_Q28_s32x2 = vld1_s32( A_Q28 ); + A_Q28_s32x2 = vneg_s32( A_Q28_s32x2 ); + A_L_s32x2 = vshl_n_s32( A_Q28_s32x2, 18 ); /* ( -A_Q28[] & 0x00003FFF ) << 18 */ + A_L_s32x2 = vreinterpret_s32_u32( vshr_n_u32( vreinterpret_u32_s32( A_L_s32x2 ), 3 ) ); /* ( -A_Q28[] & 0x00003FFF ) << 15 */ + A_U_s32x2 = vshr_n_s32( A_Q28_s32x2, 14 ); /* silk_RSHIFT( -A_Q28[], 14 ) */ + A_U_s32x2 = vshl_n_s32( A_U_s32x2, 16 ); /* silk_RSHIFT( -A_Q28[], 14 ) << 16 (Clip two leading bits to conform to C function.) */ + A_U_s32x2 = vshr_n_s32( A_U_s32x2, 1 ); /* silk_RSHIFT( -A_Q28[], 14 ) << 15 */ + + B_Q28_s32x2 = vld1_s32( B_Q28 ); + t_s32x2 = vld1_s32( B_Q28 + 1 ); + t0_s32x2x2 = vzip_s32( A_L_s32x2, A_L_s32x2 ); + t1_s32x2x2 = vzip_s32( A_U_s32x2, A_U_s32x2 ); + t2_s32x2x2 = vzip_s32( t_s32x2, t_s32x2 ); + A_L_s32x4 = vcombine_s32( t0_s32x2x2.val[ 0 ], t0_s32x2x2.val[ 1 ] ); /* A{0,0,1,1}_L_Q28 */ + A_U_s32x4 = vcombine_s32( t1_s32x2x2.val[ 0 ], t1_s32x2x2.val[ 1 ] ); /* A{0,0,1,1}_U_Q28 */ + B_Q28_s32x4 = vcombine_s32( t2_s32x2x2.val[ 0 ], t2_s32x2x2.val[ 1 ] ); /* B_Q28[ {1,1,2,2} ] */ + S_s32x4 = vld1q_s32( S ); /* S0 = S[ 0 ]; S3 = S[ 3 ]; */ + S_s32x2x2 = vtrn_s32( vget_low_s32( S_s32x4 ), vget_high_s32( S_s32x4 ) ); /* S2 = S[ 1 ]; S1 = S[ 2 ]; */ + S_s32x4 = vcombine_s32( S_s32x2x2.val[ 0 ], S_s32x2x2.val[ 1 ] ); + + for( ; k < len - 1; k += 2 ) { + int32x4_t in_s32x4[ 2 ], t_s32x4; + int32x2_t out32_Q14_s32x2[ 2 ]; + + /* S[ 2 * i + 0 ], S[ 2 * i + 1 ], S[ 2 * i + 2 ], S[ 2 * i + 3 ]: Q12 */ + in_s16x4 = vld1_s16( &in[ 2 * k ] ); /* in{0,1,2,3} = in[ 2 * k + {0,1,2,3} ]; */ + in_s32x4[ 0 ] = vshll_n_s16( in_s16x4, 15 ); /* in{0,1,2,3} << 15 */ + t_s32x4 = vqdmulhq_lane_s32( in_s32x4[ 0 ], B_Q28_s32x2, 0 ); /* silk_SMULWB( B_Q28[ 0 ], in{0,1,2,3} ) */ + in_s32x4[ 1 ] = vcombine_s32( vget_high_s32( in_s32x4[ 0 ] ), vget_high_s32( in_s32x4[ 0 ] ) ); /* in{2,3,2,3} << 15 */ + in_s32x4[ 0 ] = vcombine_s32( vget_low_s32 ( in_s32x4[ 0 ] ), vget_low_s32 ( in_s32x4[ 0 ] ) ); /* in{0,1,0,1} << 15 */ + silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, vget_low_s32 ( t_s32x4 ), in_s32x4[ 0 ], &S_s32x4, &out32_Q14_s32x2[ 0 ] ); + silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, vget_high_s32( t_s32x4 ), in_s32x4[ 1 ], &S_s32x4, &out32_Q14_s32x2[ 1 ] ); + + /* Scale back to Q0 and saturate */ + out32_Q14_s32x4 = vcombine_s32( out32_Q14_s32x2[ 0 ], out32_Q14_s32x2[ 1 ] ); /* out32_Q14_{0,1,2,3} */ + out32_Q14_s32x4 = vaddq_s32( out32_Q14_s32x4, offset_s32x4 ); /* out32_Q14_{0,1,2,3} + (1<<14) - 1 */ + out_s16x4 = vqshrn_n_s32( out32_Q14_s32x4, 14 ); /* (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,2,3} + (1<<14) - 1, 14 ) ) */ + vst1_s16( &out[ 2 * k ], out_s16x4 ); /* out[ 2 * k + {0,1,2,3} ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,2,3} + (1<<14) - 1, 14 ) ); */ + } + + /* Process leftover. */ + if( k < len ) { + int32x4_t in_s32x4; + int32x2_t out32_Q14_s32x2; + + /* S[ 2 * i + 0 ], S[ 2 * i + 1 ]: Q12 */ + in_s16x4 = vld1_lane_s16( &in[ 2 * k + 0 ], in_s16x4, 0 ); /* in{0,1} = in[ 2 * k + {0,1} ]; */ + in_s16x4 = vld1_lane_s16( &in[ 2 * k + 1 ], in_s16x4, 1 ); /* in{0,1} = in[ 2 * k + {0,1} ]; */ + in_s32x4 = vshll_n_s16( in_s16x4, 15 ); /* in{0,1} << 15 */ + t_s32x2 = vqdmulh_lane_s32( vget_low_s32( in_s32x4 ), B_Q28_s32x2, 0 ); /* silk_SMULWB( B_Q28[ 0 ], in{0,1} ) */ + in_s32x4 = vcombine_s32( vget_low_s32( in_s32x4 ), vget_low_s32( in_s32x4 ) ); /* in{0,1,0,1} << 15 */ + silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, t_s32x2, in_s32x4, &S_s32x4, &out32_Q14_s32x2 ); + + /* Scale back to Q0 and saturate */ + out32_Q14_s32x2 = vadd_s32( out32_Q14_s32x2, offset_s32x2 ); /* out32_Q14_{0,1} + (1<<14) - 1 */ + out32_Q14_s32x4 = vcombine_s32( out32_Q14_s32x2, out32_Q14_s32x2 ); /* out32_Q14_{0,1,0,1} + (1<<14) - 1 */ + out_s16x4 = vqshrn_n_s32( out32_Q14_s32x4, 14 ); /* (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,0,1} + (1<<14) - 1, 14 ) ) */ + vst1_lane_s16( &out[ 2 * k + 0 ], out_s16x4, 0 ); /* out[ 2 * k + 0 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_0 + (1<<14) - 1, 14 ) ); */ + vst1_lane_s16( &out[ 2 * k + 1 ], out_s16x4, 1 ); /* out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_1 + (1<<14) - 1, 14 ) ); */ + } + + vst1q_lane_s32( &S[ 0 ], S_s32x4, 0 ); /* S[ 0 ] = S0; */ + vst1q_lane_s32( &S[ 1 ], S_s32x4, 2 ); /* S[ 1 ] = S2; */ + vst1q_lane_s32( &S[ 2 ], S_s32x4, 1 ); /* S[ 2 ] = S1; */ + vst1q_lane_s32( &S[ 3 ], S_s32x4, 3 ); /* S[ 3 ] = S3; */ + +#ifdef OPUS_CHECK_ASM + silk_assert( !memcmp( S_c, S, sizeof( S_c ) ) ); + silk_assert( !memcmp( out_c, out, 2 * len * sizeof( opus_int16 ) ) ); + RESTORE_STACK; +#endif +} diff --git a/external/opus-1.3.1/silk/arm/macros_arm64.h b/external/opus-1.3.1/silk/arm/macros_arm64.h new file mode 100644 index 00000000..ed030413 --- /dev/null +++ b/external/opus-1.3.1/silk/arm/macros_arm64.h @@ -0,0 +1,39 @@ +/*********************************************************************** +Copyright (C) 2015 Vidyo +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_MACROS_ARM64_H +#define SILK_MACROS_ARM64_H + +#include + +#undef silk_ADD_SAT32 +#define silk_ADD_SAT32(a, b) (vqadds_s32((a), (b))) + +#undef silk_SUB_SAT32 +#define silk_SUB_SAT32(a, b) (vqsubs_s32((a), (b))) + +#endif /* SILK_MACROS_ARM64_H */ diff --git a/external/opus-1.3.1/silk/arm/macros_armv4.h b/external/opus-1.3.1/silk/arm/macros_armv4.h new file mode 100644 index 00000000..877eb18d --- /dev/null +++ b/external/opus-1.3.1/silk/arm/macros_armv4.h @@ -0,0 +1,110 @@ +/*********************************************************************** +Copyright (C) 2013 Xiph.Org Foundation and contributors. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_MACROS_ARMv4_H +#define SILK_MACROS_ARMv4_H + +/* This macro only avoids the undefined behaviour from a left shift of + a negative value. It should only be used in macros that can't include + SigProc_FIX.h. In other cases, use silk_LSHIFT32(). */ +#define SAFE_SHL(a,b) ((opus_int32)((opus_uint32)(a) << (b))) + +/* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ +#undef silk_SMULWB +static OPUS_INLINE opus_int32 silk_SMULWB_armv4(opus_int32 a, opus_int16 b) +{ + unsigned rd_lo; + int rd_hi; + __asm__( + "#silk_SMULWB\n\t" + "smull %0, %1, %2, %3\n\t" + : "=&r"(rd_lo), "=&r"(rd_hi) + : "%r"(a), "r"(SAFE_SHL(b,16)) + ); + return rd_hi; +} +#define silk_SMULWB(a, b) (silk_SMULWB_armv4(a, b)) + +/* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ +#undef silk_SMLAWB +#define silk_SMLAWB(a, b, c) ((a) + silk_SMULWB(b, c)) + +/* (a32 * (b32 >> 16)) >> 16 */ +#undef silk_SMULWT +static OPUS_INLINE opus_int32 silk_SMULWT_armv4(opus_int32 a, opus_int32 b) +{ + unsigned rd_lo; + int rd_hi; + __asm__( + "#silk_SMULWT\n\t" + "smull %0, %1, %2, %3\n\t" + : "=&r"(rd_lo), "=&r"(rd_hi) + : "%r"(a), "r"(b&~0xFFFF) + ); + return rd_hi; +} +#define silk_SMULWT(a, b) (silk_SMULWT_armv4(a, b)) + +/* a32 + (b32 * (c32 >> 16)) >> 16 */ +#undef silk_SMLAWT +#define silk_SMLAWT(a, b, c) ((a) + silk_SMULWT(b, c)) + +/* (a32 * b32) >> 16 */ +#undef silk_SMULWW +static OPUS_INLINE opus_int32 silk_SMULWW_armv4(opus_int32 a, opus_int32 b) +{ + unsigned rd_lo; + int rd_hi; + __asm__( + "#silk_SMULWW\n\t" + "smull %0, %1, %2, %3\n\t" + : "=&r"(rd_lo), "=&r"(rd_hi) + : "%r"(a), "r"(b) + ); + return SAFE_SHL(rd_hi,16)+(rd_lo>>16); +} +#define silk_SMULWW(a, b) (silk_SMULWW_armv4(a, b)) + +#undef silk_SMLAWW +static OPUS_INLINE opus_int32 silk_SMLAWW_armv4(opus_int32 a, opus_int32 b, + opus_int32 c) +{ + unsigned rd_lo; + int rd_hi; + __asm__( + "#silk_SMLAWW\n\t" + "smull %0, %1, %2, %3\n\t" + : "=&r"(rd_lo), "=&r"(rd_hi) + : "%r"(b), "r"(c) + ); + return a+SAFE_SHL(rd_hi,16)+(rd_lo>>16); +} +#define silk_SMLAWW(a, b, c) (silk_SMLAWW_armv4(a, b, c)) + +#undef SAFE_SHL + +#endif /* SILK_MACROS_ARMv4_H */ diff --git a/external/opus-1.3.1/silk/arm/macros_armv5e.h b/external/opus-1.3.1/silk/arm/macros_armv5e.h new file mode 100644 index 00000000..b14ec65d --- /dev/null +++ b/external/opus-1.3.1/silk/arm/macros_armv5e.h @@ -0,0 +1,220 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Copyright (c) 2013 Parrot +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_MACROS_ARMv5E_H +#define SILK_MACROS_ARMv5E_H + +/* This macro only avoids the undefined behaviour from a left shift of + a negative value. It should only be used in macros that can't include + SigProc_FIX.h. In other cases, use silk_LSHIFT32(). */ +#define SAFE_SHL(a,b) ((opus_int32)((opus_uint32)(a) << (b))) + +/* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ +#undef silk_SMULWB +static OPUS_INLINE opus_int32 silk_SMULWB_armv5e(opus_int32 a, opus_int16 b) +{ + int res; + __asm__( + "#silk_SMULWB\n\t" + "smulwb %0, %1, %2\n\t" + : "=r"(res) + : "r"(a), "r"(b) + ); + return res; +} +#define silk_SMULWB(a, b) (silk_SMULWB_armv5e(a, b)) + +/* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ +#undef silk_SMLAWB +static OPUS_INLINE opus_int32 silk_SMLAWB_armv5e(opus_int32 a, opus_int32 b, + opus_int16 c) +{ + int res; + __asm__( + "#silk_SMLAWB\n\t" + "smlawb %0, %1, %2, %3\n\t" + : "=r"(res) + : "r"(b), "r"(c), "r"(a) + ); + return res; +} +#define silk_SMLAWB(a, b, c) (silk_SMLAWB_armv5e(a, b, c)) + +/* (a32 * (b32 >> 16)) >> 16 */ +#undef silk_SMULWT +static OPUS_INLINE opus_int32 silk_SMULWT_armv5e(opus_int32 a, opus_int32 b) +{ + int res; + __asm__( + "#silk_SMULWT\n\t" + "smulwt %0, %1, %2\n\t" + : "=r"(res) + : "r"(a), "r"(b) + ); + return res; +} +#define silk_SMULWT(a, b) (silk_SMULWT_armv5e(a, b)) + +/* a32 + (b32 * (c32 >> 16)) >> 16 */ +#undef silk_SMLAWT +static OPUS_INLINE opus_int32 silk_SMLAWT_armv5e(opus_int32 a, opus_int32 b, + opus_int32 c) +{ + int res; + __asm__( + "#silk_SMLAWT\n\t" + "smlawt %0, %1, %2, %3\n\t" + : "=r"(res) + : "r"(b), "r"(c), "r"(a) + ); + return res; +} +#define silk_SMLAWT(a, b, c) (silk_SMLAWT_armv5e(a, b, c)) + +/* (opus_int32)((opus_int16)(a3))) * (opus_int32)((opus_int16)(b32)) output have to be 32bit int */ +#undef silk_SMULBB +static OPUS_INLINE opus_int32 silk_SMULBB_armv5e(opus_int32 a, opus_int32 b) +{ + int res; + __asm__( + "#silk_SMULBB\n\t" + "smulbb %0, %1, %2\n\t" + : "=r"(res) + : "%r"(a), "r"(b) + ); + return res; +} +#define silk_SMULBB(a, b) (silk_SMULBB_armv5e(a, b)) + +/* a32 + (opus_int32)((opus_int16)(b32)) * (opus_int32)((opus_int16)(c32)) output have to be 32bit int */ +#undef silk_SMLABB +static OPUS_INLINE opus_int32 silk_SMLABB_armv5e(opus_int32 a, opus_int32 b, + opus_int32 c) +{ + int res; + __asm__( + "#silk_SMLABB\n\t" + "smlabb %0, %1, %2, %3\n\t" + : "=r"(res) + : "%r"(b), "r"(c), "r"(a) + ); + return res; +} +#define silk_SMLABB(a, b, c) (silk_SMLABB_armv5e(a, b, c)) + +/* (opus_int32)((opus_int16)(a32)) * (b32 >> 16) */ +#undef silk_SMULBT +static OPUS_INLINE opus_int32 silk_SMULBT_armv5e(opus_int32 a, opus_int32 b) +{ + int res; + __asm__( + "#silk_SMULBT\n\t" + "smulbt %0, %1, %2\n\t" + : "=r"(res) + : "r"(a), "r"(b) + ); + return res; +} +#define silk_SMULBT(a, b) (silk_SMULBT_armv5e(a, b)) + +/* a32 + (opus_int32)((opus_int16)(b32)) * (c32 >> 16) */ +#undef silk_SMLABT +static OPUS_INLINE opus_int32 silk_SMLABT_armv5e(opus_int32 a, opus_int32 b, + opus_int32 c) +{ + int res; + __asm__( + "#silk_SMLABT\n\t" + "smlabt %0, %1, %2, %3\n\t" + : "=r"(res) + : "r"(b), "r"(c), "r"(a) + ); + return res; +} +#define silk_SMLABT(a, b, c) (silk_SMLABT_armv5e(a, b, c)) + +/* add/subtract with output saturated */ +#undef silk_ADD_SAT32 +static OPUS_INLINE opus_int32 silk_ADD_SAT32_armv5e(opus_int32 a, opus_int32 b) +{ + int res; + __asm__( + "#silk_ADD_SAT32\n\t" + "qadd %0, %1, %2\n\t" + : "=r"(res) + : "%r"(a), "r"(b) + ); + return res; +} +#define silk_ADD_SAT32(a, b) (silk_ADD_SAT32_armv5e(a, b)) + +#undef silk_SUB_SAT32 +static OPUS_INLINE opus_int32 silk_SUB_SAT32_armv5e(opus_int32 a, opus_int32 b) +{ + int res; + __asm__( + "#silk_SUB_SAT32\n\t" + "qsub %0, %1, %2\n\t" + : "=r"(res) + : "r"(a), "r"(b) + ); + return res; +} +#define silk_SUB_SAT32(a, b) (silk_SUB_SAT32_armv5e(a, b)) + +#undef silk_CLZ16 +static OPUS_INLINE opus_int32 silk_CLZ16_armv5(opus_int16 in16) +{ + int res; + __asm__( + "#silk_CLZ16\n\t" + "clz %0, %1;\n" + : "=r"(res) + : "r"(SAFE_SHL(in16,16)|0x8000) + ); + return res; +} +#define silk_CLZ16(in16) (silk_CLZ16_armv5(in16)) + +#undef silk_CLZ32 +static OPUS_INLINE opus_int32 silk_CLZ32_armv5(opus_int32 in32) +{ + int res; + __asm__( + "#silk_CLZ32\n\t" + "clz %0, %1\n\t" + : "=r"(res) + : "r"(in32) + ); + return res; +} +#define silk_CLZ32(in32) (silk_CLZ32_armv5(in32)) + +#undef SAFE_SHL + +#endif /* SILK_MACROS_ARMv5E_H */ diff --git a/external/opus-1.0.3/silk/biquad_alt.c b/external/opus-1.3.1/silk/biquad_alt.c similarity index 57% rename from external/opus-1.0.3/silk/biquad_alt.c rename to external/opus-1.3.1/silk/biquad_alt.c index a639e21a..54566a43 100644 --- a/external/opus-1.0.3/silk/biquad_alt.c +++ b/external/opus-1.3.1/silk/biquad_alt.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -39,14 +39,13 @@ POSSIBILITY OF SUCH DAMAGE. #include "SigProc_FIX.h" /* Second order ARMA filter, alternative implementation */ -void silk_biquad_alt( +void silk_biquad_alt_stride1( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [2] */ opus_int16 *out, /* O output signal */ - const opus_int32 len, /* I signal length (must be even) */ - opus_int stride /* I Operate on interleaved signal if > 1 */ + const opus_int32 len /* I signal length (must be even) */ ) { /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ @@ -61,7 +60,7 @@ void silk_biquad_alt( for( k = 0; k < len; k++ ) { /* S[ 0 ], S[ 1 ]: Q12 */ - inval = in[ k * stride ]; + inval = in[ k ]; out32_Q14 = silk_LSHIFT( silk_SMLAWB( S[ 0 ], B_Q28[ 0 ], inval ), 2 ); S[ 0 ] = S[1] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14, A0_L_Q28 ), 14 ); @@ -73,6 +72,50 @@ void silk_biquad_alt( S[ 1 ] = silk_SMLAWB( S[ 1 ], B_Q28[ 2 ], inval ); /* Scale back to Q0 and saturate */ - out[ k * stride ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14 + (1<<14) - 1, 14 ) ); + out[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14 + (1<<14) - 1, 14 ) ); + } +} + +void silk_biquad_alt_stride2_c( + const opus_int16 *in, /* I input signal */ + const opus_int32 *B_Q28, /* I MA coefficients [3] */ + const opus_int32 *A_Q28, /* I AR coefficients [2] */ + opus_int32 *S, /* I/O State vector [4] */ + opus_int16 *out, /* O output signal */ + const opus_int32 len /* I signal length (must be even) */ +) +{ + /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ + opus_int k; + opus_int32 A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14[ 2 ]; + + /* Negate A_Q28 values and split in two parts */ + A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */ + A0_U_Q28 = silk_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */ + A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */ + A1_U_Q28 = silk_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */ + + for( k = 0; k < len; k++ ) { + /* S[ 0 ], S[ 1 ], S[ 2 ], S[ 3 ]: Q12 */ + out32_Q14[ 0 ] = silk_LSHIFT( silk_SMLAWB( S[ 0 ], B_Q28[ 0 ], in[ 2 * k + 0 ] ), 2 ); + out32_Q14[ 1 ] = silk_LSHIFT( silk_SMLAWB( S[ 2 ], B_Q28[ 0 ], in[ 2 * k + 1 ] ), 2 ); + + S[ 0 ] = S[ 1 ] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 0 ], A0_L_Q28 ), 14 ); + S[ 2 ] = S[ 3 ] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 1 ], A0_L_Q28 ), 14 ); + S[ 0 ] = silk_SMLAWB( S[ 0 ], out32_Q14[ 0 ], A0_U_Q28 ); + S[ 2 ] = silk_SMLAWB( S[ 2 ], out32_Q14[ 1 ], A0_U_Q28 ); + S[ 0 ] = silk_SMLAWB( S[ 0 ], B_Q28[ 1 ], in[ 2 * k + 0 ] ); + S[ 2 ] = silk_SMLAWB( S[ 2 ], B_Q28[ 1 ], in[ 2 * k + 1 ] ); + + S[ 1 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 0 ], A1_L_Q28 ), 14 ); + S[ 3 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 1 ], A1_L_Q28 ), 14 ); + S[ 1 ] = silk_SMLAWB( S[ 1 ], out32_Q14[ 0 ], A1_U_Q28 ); + S[ 3 ] = silk_SMLAWB( S[ 3 ], out32_Q14[ 1 ], A1_U_Q28 ); + S[ 1 ] = silk_SMLAWB( S[ 1 ], B_Q28[ 2 ], in[ 2 * k + 0 ] ); + S[ 3 ] = silk_SMLAWB( S[ 3 ], B_Q28[ 2 ], in[ 2 * k + 1 ] ); + + /* Scale back to Q0 and saturate */ + out[ 2 * k + 0 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14[ 0 ] + (1<<14) - 1, 14 ) ); + out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14[ 1 ] + (1<<14) - 1, 14 ) ); } } diff --git a/external/opus-1.0.3/silk/bwexpander.c b/external/opus-1.3.1/silk/bwexpander.c similarity index 95% rename from external/opus-1.0.3/silk/bwexpander.c rename to external/opus-1.3.1/silk/bwexpander.c index 77ea1163..afa97907 100644 --- a/external/opus-1.0.3/silk/bwexpander.c +++ b/external/opus-1.3.1/silk/bwexpander.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -45,7 +45,7 @@ void silk_bwexpander( /* Bias in silk_SMULWB can lead to unstable filters */ for( i = 0; i < d - 1; i++ ) { ar[ i ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ i ] ), 16 ); - chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); + chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); } ar[ d - 1 ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ d - 1 ] ), 16 ); } diff --git a/external/opus-1.0.3/silk/bwexpander_32.c b/external/opus-1.3.1/silk/bwexpander_32.c similarity index 99% rename from external/opus-1.0.3/silk/bwexpander_32.c rename to external/opus-1.3.1/silk/bwexpander_32.c index 5ad92dd4..d0010f73 100644 --- a/external/opus-1.0.3/silk/bwexpander_32.c +++ b/external/opus-1.3.1/silk/bwexpander_32.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/check_control_input.c b/external/opus-1.3.1/silk/check_control_input.c similarity index 93% rename from external/opus-1.0.3/silk/check_control_input.c rename to external/opus-1.3.1/silk/check_control_input.c index 972a480d..739fb01f 100644 --- a/external/opus-1.0.3/silk/check_control_input.c +++ b/external/opus-1.3.1/silk/check_control_input.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -38,7 +38,7 @@ opus_int check_control_input( silk_EncControlStruct *encControl /* I Control structure */ ) { - silk_assert( encControl != NULL ); + celt_assert( encControl != NULL ); if( ( ( encControl->API_sampleRate != 8000 ) && ( encControl->API_sampleRate != 12000 ) && @@ -59,46 +59,46 @@ opus_int check_control_input( ( encControl->minInternalSampleRate > encControl->desiredInternalSampleRate ) || ( encControl->maxInternalSampleRate < encControl->desiredInternalSampleRate ) || ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_FS_NOT_SUPPORTED; } if( encControl->payloadSize_ms != 10 && encControl->payloadSize_ms != 20 && encControl->payloadSize_ms != 40 && encControl->payloadSize_ms != 60 ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; } if( encControl->packetLossPercentage < 0 || encControl->packetLossPercentage > 100 ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_INVALID_LOSS_RATE; } if( encControl->useDTX < 0 || encControl->useDTX > 1 ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_INVALID_DTX_SETTING; } if( encControl->useCBR < 0 || encControl->useCBR > 1 ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_INVALID_CBR_SETTING; } if( encControl->useInBandFEC < 0 || encControl->useInBandFEC > 1 ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_INVALID_INBAND_FEC_SETTING; } if( encControl->nChannelsAPI < 1 || encControl->nChannelsAPI > ENCODER_NUM_CHANNELS ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->nChannelsInternal < 1 || encControl->nChannelsInternal > ENCODER_NUM_CHANNELS ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->nChannelsInternal > encControl->nChannelsAPI ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->complexity < 0 || encControl->complexity > 10 ) { - silk_assert( 0 ); + celt_assert( 0 ); return SILK_ENC_INVALID_COMPLEXITY_SETTING; } diff --git a/external/opus-1.0.3/silk/code_signs.c b/external/opus-1.3.1/silk/code_signs.c similarity index 96% rename from external/opus-1.0.3/silk/code_signs.c rename to external/opus-1.3.1/silk/code_signs.c index 2be94f09..dfd1dca9 100644 --- a/external/opus-1.0.3/silk/code_signs.c +++ b/external/opus-1.3.1/silk/code_signs.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -37,7 +37,6 @@ POSSIBILITY OF SUCH DAMAGE. #define silk_enc_map(a) ( silk_RSHIFT( (a), 15 ) + 1 ) #define silk_dec_map(a) ( silk_LSHIFT( (a), 1 ) - 1 ) -#ifdef OPUS_ENABLE_ENCODER /* Encodes signs of excitation */ void silk_encode_signs( ec_enc *psRangeEnc, /* I/O Compressor data structure */ @@ -71,12 +70,11 @@ void silk_encode_signs( q_ptr += SHELL_CODEC_FRAME_LENGTH; } } -#endif /* OPUS_ENABLE_ENCODER */ /* Decodes signs of excitation */ void silk_decode_signs( ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int pulses[], /* I/O pulse signal */ + opus_int16 pulses[], /* I/O pulse signal */ opus_int length, /* I length of input */ const opus_int signalType, /* I Signal type */ const opus_int quantOffsetType, /* I Quantization offset type */ @@ -85,7 +83,7 @@ void silk_decode_signs( { opus_int i, j, p; opus_uint8 icdf[ 2 ]; - opus_int *q_ptr; + opus_int16 *q_ptr; const opus_uint8 *icdf_ptr; icdf[ 1 ] = 0; diff --git a/external/opus-1.0.3/silk/control.h b/external/opus-1.3.1/silk/control.h similarity index 93% rename from external/opus-1.0.3/silk/control.h rename to external/opus-1.3.1/silk/control.h index c52ec3fe..b76ec33c 100644 --- a/external/opus-1.0.3/silk/control.h +++ b/external/opus-1.3.1/silk/control.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -77,6 +77,9 @@ typedef struct { /* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */ opus_int useInBandFEC; + /* I: Flag to actually code in-band Forward Error Correction (FEC) in the current packet; 0/1 */ + opus_int LBRR_coded; + /* I: Flag to enable discontinuous transmission (DTX); 0/1 */ opus_int useDTX; @@ -92,6 +95,9 @@ typedef struct { /* I: Opus encoder is allowing us to switch bandwidth */ opus_int opusCanSwitch; + /* I: Make frames as independent as possible (but still use LPC) */ + opus_int reducedDependency; + /* O: Internal sampling rate used, in Hertz; 8000/12000/16000 */ opus_int32 internalSampleRate; @@ -107,6 +113,11 @@ typedef struct { /* O: Tells the Opus encoder we're ready to switch */ opus_int switchReady; + /* O: SILK Signal type */ + opus_int signalType; + + /* O: SILK offset (dithering) */ + opus_int offset; } silk_EncControlStruct; /**************************************************************************/ diff --git a/external/opus-1.3.1/silk/control_SNR.c b/external/opus-1.3.1/silk/control_SNR.c new file mode 100644 index 00000000..9a6db275 --- /dev/null +++ b/external/opus-1.3.1/silk/control_SNR.c @@ -0,0 +1,113 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main.h" +#include "tuning_parameters.h" + +/* These tables hold SNR values divided by 21 (so they fit in 8 bits) + for different target bitrates spaced at 400 bps interval. The first + 10 values are omitted (0-4 kb/s) because they're all zeros. + These tables were obtained by running different SNRs through the + encoder and measuring the active bitrate. */ +static const unsigned char silk_TargetRate_NB_21[117 - 10] = { + 0, 15, 39, 52, 61, 68, + 74, 79, 84, 88, 92, 95, 99,102,105,108,111,114,117,119,122,124, + 126,129,131,133,135,137,139,142,143,145,147,149,151,153,155,157, + 158,160,162,163,165,167,168,170,171,173,174,176,177,179,180,182, + 183,185,186,187,189,190,192,193,194,196,197,199,200,201,203,204, + 205,207,208,209,211,212,213,215,216,217,219,220,221,223,224,225, + 227,228,230,231,232,234,235,236,238,239,241,242,243,245,246,248, + 249,250,252,253,255 +}; + +static const unsigned char silk_TargetRate_MB_21[165 - 10] = { + 0, 0, 28, 43, 52, 59, + 65, 70, 74, 78, 81, 85, 87, 90, 93, 95, 98,100,102,105,107,109, + 111,113,115,116,118,120,122,123,125,127,128,130,131,133,134,136, + 137,138,140,141,143,144,145,147,148,149,151,152,153,154,156,157, + 158,159,160,162,163,164,165,166,167,168,169,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,188,189,190, + 191,192,193,194,195,196,197,198,199,200,201,202,203,203,204,205, + 206,207,208,209,210,211,212,213,214,214,215,216,217,218,219,220, + 221,222,223,224,224,225,226,227,228,229,230,231,232,233,234,235, + 236,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250, + 251,252,253,254,255 +}; + +static const unsigned char silk_TargetRate_WB_21[201 - 10] = { + 0, 0, 0, 8, 29, 41, + 49, 56, 62, 66, 70, 74, 77, 80, 83, 86, 88, 91, 93, 95, 97, 99, + 101,103,105,107,108,110,112,113,115,116,118,119,121,122,123,125, + 126,127,129,130,131,132,134,135,136,137,138,140,141,142,143,144, + 145,146,147,148,149,150,151,152,153,154,156,157,158,159,159,160, + 161,162,163,164,165,166,167,168,169,170,171,171,172,173,174,175, + 176,177,177,178,179,180,181,181,182,183,184,185,185,186,187,188, + 189,189,190,191,192,192,193,194,195,195,196,197,198,198,199,200, + 200,201,202,203,203,204,205,206,206,207,208,209,209,210,211,211, + 212,213,214,214,215,216,216,217,218,219,219,220,221,221,222,223, + 224,224,225,226,226,227,228,229,229,230,231,232,232,233,234,234, + 235,236,237,237,238,239,240,240,241,242,243,243,244,245,246,246, + 247,248,249,249,250,251,252,253,255 +}; + +/* Control SNR of redidual quantizer */ +opus_int silk_control_SNR( + silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ + opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ +) +{ + int id; + int bound; + const unsigned char *snr_table; + + psEncC->TargetRate_bps = TargetRate_bps; + if( psEncC->nb_subfr == 2 ) { + TargetRate_bps -= 2000 + psEncC->fs_kHz/16; + } + if( psEncC->fs_kHz == 8 ) { + bound = sizeof(silk_TargetRate_NB_21); + snr_table = silk_TargetRate_NB_21; + } else if( psEncC->fs_kHz == 12 ) { + bound = sizeof(silk_TargetRate_MB_21); + snr_table = silk_TargetRate_MB_21; + } else { + bound = sizeof(silk_TargetRate_WB_21); + snr_table = silk_TargetRate_WB_21; + } + id = (TargetRate_bps+200)/400; + id = silk_min(id - 10, bound-1); + if( id <= 0 ) { + psEncC->SNR_dB_Q7 = 0; + } else { + psEncC->SNR_dB_Q7 = snr_table[id]*21; + } + return SILK_NO_ERROR; +} diff --git a/external/opus-1.0.3/silk/control_audio_bandwidth.c b/external/opus-1.3.1/silk/control_audio_bandwidth.c similarity index 90% rename from external/opus-1.0.3/silk/control_audio_bandwidth.c rename to external/opus-1.3.1/silk/control_audio_bandwidth.c index ef02feda..f6d22d83 100644 --- a/external/opus-1.0.3/silk/control_audio_bandwidth.c +++ b/external/opus-1.3.1/silk/control_audio_bandwidth.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -39,9 +39,15 @@ opus_int silk_control_audio_bandwidth( ) { opus_int fs_kHz; + opus_int orig_kHz; opus_int32 fs_Hz; - fs_kHz = psEncC->fs_kHz; + orig_kHz = psEncC->fs_kHz; + /* Handle a bandwidth-switching reset where we need to be aware what the last sampling rate was. */ + if( orig_kHz == 0 ) { + orig_kHz = psEncC->sLP.saved_fs_kHz; + } + fs_kHz = orig_kHz; fs_Hz = silk_SMULBB( fs_kHz, 1000 ); if( fs_Hz == 0 ) { /* Encoder has just been initialized */ @@ -61,7 +67,7 @@ opus_int silk_control_audio_bandwidth( } if( psEncC->allow_bandwidth_switch || encControl->opusCanSwitch ) { /* Check if we should switch down */ - if( silk_SMULBB( psEncC->fs_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) + if( silk_SMULBB( orig_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) { /* Switch down */ if( psEncC->sLP.mode == 0 ) { @@ -76,7 +82,7 @@ opus_int silk_control_audio_bandwidth( psEncC->sLP.mode = 0; /* Switch to a lower sample frequency */ - fs_kHz = psEncC->fs_kHz == 16 ? 12 : 8; + fs_kHz = orig_kHz == 16 ? 12 : 8; } else { if( psEncC->sLP.transition_frame_no <= 0 ) { encControl->switchReady = 1; @@ -90,12 +96,12 @@ opus_int silk_control_audio_bandwidth( } else /* Check if we should switch up */ - if( silk_SMULBB( psEncC->fs_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz ) + if( silk_SMULBB( orig_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz ) { /* Switch up */ if( encControl->opusCanSwitch ) { /* Switch to a higher sample frequency */ - fs_kHz = psEncC->fs_kHz == 8 ? 12 : 16; + fs_kHz = orig_kHz == 8 ? 12 : 16; /* New transition */ psEncC->sLP.transition_frame_no = 0; diff --git a/external/opus-1.0.3/silk/control_codec.c b/external/opus-1.3.1/silk/control_codec.c similarity index 79% rename from external/opus-1.0.3/silk/control_codec.c rename to external/opus-1.3.1/silk/control_codec.c index 801988d1..52aa8fde 100644 --- a/external/opus-1.0.3/silk/control_codec.c +++ b/external/opus-1.3.1/silk/control_codec.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -35,6 +35,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "main_FLP.h" #define silk_encoder_state_Fxx silk_encoder_state_FLP #endif +#include "stack_alloc.h" #include "tuning_parameters.h" #include "pitch_est_defines.h" @@ -54,9 +55,9 @@ static opus_int silk_setup_complexity( opus_int Complexity /* I */ ); -static inline opus_int silk_setup_LBRR( +static OPUS_INLINE opus_int silk_setup_LBRR( silk_encoder_state *psEncC, /* I/O */ - const opus_int32 TargetRate_bps /* I */ + const silk_EncControlStruct *encControl /* I */ ); @@ -64,7 +65,6 @@ static inline opus_int silk_setup_LBRR( opus_int silk_control_encoder( silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ silk_EncControlStruct *encControl, /* I Control structure */ - const opus_int32 TargetRate_bps, /* I Target max bitrate (bps) */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz @@ -124,7 +124,7 @@ opus_int silk_control_encoder( /********************************************/ /* Set LBRR usage */ /********************************************/ - ret += silk_setup_LBRR( &psEnc->sCmn, TargetRate_bps ); + ret += silk_setup_LBRR( &psEnc->sCmn, encControl ); psEnc->sCmn.controlled_since_last_payload = 1; @@ -137,7 +137,7 @@ static opus_int silk_setup_resamplers( ) { opus_int ret = SILK_NO_ERROR; - opus_int32 nSamples_temp; + SAVE_STACK; if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz ) { @@ -145,44 +145,54 @@ static opus_int silk_setup_resamplers( /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 ); } else { - /* Allocate worst case space for temporary upsampling, 8 to 48 kHz, so a factor 6 */ - opus_int16 x_buf_API_fs_Hz[ ( 2 * MAX_FRAME_LENGTH_MS + LA_SHAPE_MS ) * MAX_API_FS_KHZ ]; - silk_resampler_state_struct temp_resampler_state; + VARDECL( opus_int16, x_buf_API_fs_Hz ); + VARDECL( silk_resampler_state_struct, temp_resampler_state ); #ifdef FIXED_POINT opus_int16 *x_bufFIX = psEnc->x_buf; #else - opus_int16 x_bufFIX[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ]; + VARDECL( opus_int16, x_bufFIX ); + opus_int32 new_buf_samples; #endif + opus_int32 api_buf_samples; + opus_int32 old_buf_samples; + opus_int32 buf_length_ms; - nSamples_temp = silk_LSHIFT( psEnc->sCmn.frame_length, 1 ) + LA_SHAPE_MS * psEnc->sCmn.fs_kHz; + buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS; + old_buf_samples = buf_length_ms * psEnc->sCmn.fs_kHz; #ifndef FIXED_POINT - silk_float2short_array( x_bufFIX, psEnc->x_buf, nSamples_temp ); + new_buf_samples = buf_length_ms * fs_kHz; + ALLOC( x_bufFIX, silk_max( old_buf_samples, new_buf_samples ), + opus_int16 ); + silk_float2short_array( x_bufFIX, psEnc->x_buf, old_buf_samples ); #endif /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */ - ret += silk_resampler_init( &temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 ); + ALLOC( temp_resampler_state, 1, silk_resampler_state_struct ); + ret += silk_resampler_init( temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 ); - /* Temporary resampling of x_buf data to API_fs_Hz */ - ret += silk_resampler( &temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, nSamples_temp ); + /* Calculate number of samples to temporarily upsample */ + api_buf_samples = buf_length_ms * silk_DIV32_16( psEnc->sCmn.API_fs_Hz, 1000 ); - /* Calculate number of samples that has been temporarily upsampled */ - nSamples_temp = silk_DIV32_16( nSamples_temp * psEnc->sCmn.API_fs_Hz, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ) ); + /* Temporary resampling of x_buf data to API_fs_Hz */ + ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 ); + ret += silk_resampler( temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, old_buf_samples ); /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, silk_SMULBB( fs_kHz, 1000 ), 1 ); /* Correct resampler state by resampling buffered data from API_fs_Hz to fs_kHz */ - ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, nSamples_temp ); + ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, api_buf_samples ); #ifndef FIXED_POINT - silk_short2float_array( psEnc->x_buf, x_bufFIX, ( 2 * MAX_FRAME_LENGTH_MS + LA_SHAPE_MS ) * fs_kHz ); + silk_short2float_array( psEnc->x_buf, x_bufFIX, new_buf_samples); #endif } } psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz; + RESTORE_STACK; return ret; } @@ -228,12 +238,11 @@ static opus_int silk_setup_fs( } /* Set internal sampling frequency */ - silk_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); - silk_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 ); + celt_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); + celt_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 ); if( psEnc->sCmn.fs_kHz != fs_kHz ) { /* reset part of the state */ silk_memset( &psEnc->sShape, 0, sizeof( psEnc->sShape ) ); - silk_memset( &psEnc->sPrefilt, 0, sizeof( psEnc->sPrefilt ) ); silk_memset( &psEnc->sCmn.sNSQ, 0, sizeof( psEnc->sCmn.sNSQ ) ); silk_memset( psEnc->sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); silk_memset( &psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) ); @@ -244,7 +253,6 @@ static opus_int silk_setup_fs( /* Initialize non-zero parameters */ psEnc->sCmn.prevLag = 100; psEnc->sCmn.first_frame_after_reset = 1; - psEnc->sPrefilt.lagPrev = 100; psEnc->sShape.LastGainIndex = 10; psEnc->sCmn.sNSQ.lagPrev = 100; psEnc->sCmn.sNSQ.prev_gain_Q16 = 65536; @@ -282,19 +290,16 @@ static opus_int silk_setup_fs( psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); } if( psEnc->sCmn.fs_kHz == 16 ) { - psEnc->sCmn.mu_LTP_Q9 = SILK_FIX_CONST( MU_LTP_QUANT_WB, 9 ); psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform8_iCDF; } else if( psEnc->sCmn.fs_kHz == 12 ) { - psEnc->sCmn.mu_LTP_Q9 = SILK_FIX_CONST( MU_LTP_QUANT_MB, 9 ); psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform6_iCDF; } else { - psEnc->sCmn.mu_LTP_Q9 = SILK_FIX_CONST( MU_LTP_QUANT_NB, 9 ); psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; } } /* Check that settings are valid */ - silk_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length ); + celt_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length ); return ret; } @@ -307,61 +312,76 @@ static opus_int silk_setup_complexity( opus_int ret = 0; /* Set encoding complexity */ - silk_assert( Complexity >= 0 && Complexity <= 10 ); - if( Complexity < 2 ) { + celt_assert( Complexity >= 0 && Complexity <= 10 ); + if( Complexity < 1 ) { psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); psEncC->pitchEstimationLPCOrder = 6; - psEncC->shapingLPCOrder = 8; + psEncC->shapingLPCOrder = 12; psEncC->la_shape = 3 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 1; psEncC->useInterpolatedNLSFs = 0; - psEncC->LTPQuantLowComplexity = 1; psEncC->NLSF_MSVQ_Survivors = 2; psEncC->warping_Q16 = 0; - } else if( Complexity < 4 ) { + } else if( Complexity < 2 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); psEncC->pitchEstimationLPCOrder = 8; - psEncC->shapingLPCOrder = 10; + psEncC->shapingLPCOrder = 14; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 1; psEncC->useInterpolatedNLSFs = 0; - psEncC->LTPQuantLowComplexity = 0; + psEncC->NLSF_MSVQ_Survivors = 3; + psEncC->warping_Q16 = 0; + } else if( Complexity < 3 ) { + psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); + psEncC->pitchEstimationLPCOrder = 6; + psEncC->shapingLPCOrder = 12; + psEncC->la_shape = 3 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 2; + psEncC->useInterpolatedNLSFs = 0; + psEncC->NLSF_MSVQ_Survivors = 2; + psEncC->warping_Q16 = 0; + } else if( Complexity < 4 ) { + psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); + psEncC->pitchEstimationLPCOrder = 8; + psEncC->shapingLPCOrder = 14; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 2; + psEncC->useInterpolatedNLSFs = 0; psEncC->NLSF_MSVQ_Survivors = 4; psEncC->warping_Q16 = 0; } else if( Complexity < 6 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.74, 16 ); psEncC->pitchEstimationLPCOrder = 10; - psEncC->shapingLPCOrder = 12; + psEncC->shapingLPCOrder = 16; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 2; psEncC->useInterpolatedNLSFs = 1; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 8; + psEncC->NLSF_MSVQ_Survivors = 6; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } else if( Complexity < 8 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.72, 16 ); psEncC->pitchEstimationLPCOrder = 12; - psEncC->shapingLPCOrder = 14; + psEncC->shapingLPCOrder = 20; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 3; psEncC->useInterpolatedNLSFs = 1; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 16; + psEncC->NLSF_MSVQ_Survivors = 8; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } else { psEncC->pitchEstimationComplexity = SILK_PE_MAX_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.7, 16 ); psEncC->pitchEstimationLPCOrder = 16; - psEncC->shapingLPCOrder = 16; + psEncC->shapingLPCOrder = 24; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = MAX_DEL_DEC_STATES; psEncC->useInterpolatedNLSFs = 1; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 32; + psEncC->NLSF_MSVQ_Survivors = 16; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } @@ -370,46 +390,32 @@ static opus_int silk_setup_complexity( psEncC->shapeWinLength = SUB_FRAME_LENGTH_MS * psEncC->fs_kHz + 2 * psEncC->la_shape; psEncC->Complexity = Complexity; - silk_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER ); - silk_assert( psEncC->shapingLPCOrder <= MAX_SHAPE_LPC_ORDER ); - silk_assert( psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES ); - silk_assert( psEncC->warping_Q16 <= 32767 ); - silk_assert( psEncC->la_shape <= LA_SHAPE_MAX ); - silk_assert( psEncC->shapeWinLength <= SHAPE_LPC_WIN_MAX ); - silk_assert( psEncC->NLSF_MSVQ_Survivors <= NLSF_VQ_MAX_SURVIVORS ); + celt_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER ); + celt_assert( psEncC->shapingLPCOrder <= MAX_SHAPE_LPC_ORDER ); + celt_assert( psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES ); + celt_assert( psEncC->warping_Q16 <= 32767 ); + celt_assert( psEncC->la_shape <= LA_SHAPE_MAX ); + celt_assert( psEncC->shapeWinLength <= SHAPE_LPC_WIN_MAX ); return ret; } -static inline opus_int silk_setup_LBRR( +static OPUS_INLINE opus_int silk_setup_LBRR( silk_encoder_state *psEncC, /* I/O */ - const opus_int32 TargetRate_bps /* I */ + const silk_EncControlStruct *encControl /* I */ ) { opus_int LBRR_in_previous_packet, ret = SILK_NO_ERROR; - opus_int32 LBRR_rate_thres_bps; LBRR_in_previous_packet = psEncC->LBRR_enabled; - psEncC->LBRR_enabled = 0; - if( psEncC->useInBandFEC && psEncC->PacketLoss_perc > 0 ) { - if( psEncC->fs_kHz == 8 ) { - LBRR_rate_thres_bps = LBRR_NB_MIN_RATE_BPS; - } else if( psEncC->fs_kHz == 12 ) { - LBRR_rate_thres_bps = LBRR_MB_MIN_RATE_BPS; + psEncC->LBRR_enabled = encControl->LBRR_coded; + if( psEncC->LBRR_enabled ) { + /* Set gain increase for coding LBRR excitation */ + if( LBRR_in_previous_packet == 0 ) { + /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */ + psEncC->LBRR_GainIncreases = 7; } else { - LBRR_rate_thres_bps = LBRR_WB_MIN_RATE_BPS; - } - LBRR_rate_thres_bps = silk_SMULWB( silk_MUL( LBRR_rate_thres_bps, 125 - silk_min( psEncC->PacketLoss_perc, 25 ) ), SILK_FIX_CONST( 0.01, 16 ) ); - - if( TargetRate_bps > LBRR_rate_thres_bps ) { - /* Set gain increase for coding LBRR excitation */ - if( LBRR_in_previous_packet == 0 ) { - /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */ - psEncC->LBRR_GainIncreases = 7; - } else { - psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.4, 16 ) ), 2 ); - } - psEncC->LBRR_enabled = 1; + psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.4, 16 ) ), 2 ); } } diff --git a/external/opus-1.0.3/silk/debug.c b/external/opus-1.3.1/silk/debug.c similarity index 97% rename from external/opus-1.0.3/silk/debug.c rename to external/opus-1.3.1/silk/debug.c index 1d4d6fd4..52f1bb6e 100644 --- a/external/opus-1.0.3/silk/debug.c +++ b/external/opus-1.3.1/silk/debug.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -35,13 +35,6 @@ POSSIBILITY OF SUCH DAMAGE. #if SILK_TIC_TOC #ifdef _WIN32 - -#if (defined(_WIN32) || defined(_WINCE)) -#include /* timer */ -#else /* Linux or Mac*/ -#include -#endif - unsigned long silk_GetHighResolutionTime(void) /* O time in usec*/ { /* Returns a time counter in microsec */ diff --git a/external/opus-1.0.3/silk/debug.h b/external/opus-1.3.1/silk/debug.h similarity index 96% rename from external/opus-1.0.3/silk/debug.h rename to external/opus-1.3.1/silk/debug.h index 8ae7094f..6f68c1ca 100644 --- a/external/opus-1.0.3/silk/debug.h +++ b/external/opus-1.3.1/silk/debug.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -28,10 +28,6 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef SILK_DEBUG_H #define SILK_DEBUG_H -#ifdef _WIN32 -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - #include "typedef.h" #include /* file writing */ #include /* strcpy, strcmp */ @@ -43,23 +39,10 @@ extern "C" unsigned long GetHighResolutionTime(void); /* O time in usec*/ -/* make SILK_DEBUG dependent on compiler's _DEBUG */ -#if defined _WIN32 - #ifdef _DEBUG - #define SILK_DEBUG 1 - #else - #define SILK_DEBUG 0 - #endif - - /* overrule the above */ - #if 0 - /* #define NO_ASSERTS*/ - #undef SILK_DEBUG - #define SILK_DEBUG 1 - #endif -#else - #define SILK_DEBUG 0 -#endif +/* Set to 1 to enable DEBUG_STORE_DATA() macros for dumping + * intermediate signals from the codec. + */ +#define SILK_DEBUG 0 /* Flag for using timers */ #define SILK_TIC_TOC 0 @@ -69,7 +52,6 @@ unsigned long GetHighResolutionTime(void); /* O time in usec*/ #if (defined(_WIN32) || defined(_WINCE)) #include /* timer */ -#pragma warning( disable : 4996 ) /* stop bitching about strcpy in TIC()*/ #else /* Linux or Mac*/ #include #endif diff --git a/external/opus-1.0.3/silk/dec_API.c b/external/opus-1.3.1/silk/dec_API.c similarity index 89% rename from external/opus-1.0.3/silk/dec_API.c rename to external/opus-1.3.1/silk/dec_API.c index f1cf639c..7d5ca7fb 100644 --- a/external/opus-1.0.3/silk/dec_API.c +++ b/external/opus-1.3.1/silk/dec_API.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -31,6 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "API.h" #include "main.h" #include "stack_alloc.h" +#include "os_support.h" /************************/ /* Decoder Super Struct */ @@ -84,13 +85,15 @@ opus_int silk_Decode( /* O Returns error co opus_int newPacketFlag, /* I Indicates first decoder call for this packet */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 *samplesOut, /* O Decoded output speech vector */ - opus_int32 *nSamplesOut /* O Number of samples decoded */ + opus_int32 *nSamplesOut, /* O Number of samples decoded */ + int arch /* I Run-time architecture */ ) { opus_int i, n, decode_only_middle = 0, ret = SILK_NO_ERROR; opus_int32 nSamplesOutDec, LBRR_symbol; opus_int16 *samplesOut1_tmp[ 2 ]; - VARDECL( opus_int16, samplesOut1_tmp_storage ); + VARDECL( opus_int16, samplesOut1_tmp_storage1 ); + VARDECL( opus_int16, samplesOut1_tmp_storage2 ); VARDECL( opus_int16, samplesOut2_tmp ); opus_int32 MS_pred_Q13[ 2 ] = { 0 }; opus_int16 *resample_out_ptr; @@ -98,8 +101,11 @@ opus_int silk_Decode( /* O Returns error co silk_decoder_state *channel_state = psDec->channel_state; opus_int has_side; opus_int stereo_to_mono; + int delay_stack_alloc; SAVE_STACK; + celt_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 ); + /**********************************/ /* Test if first frame in payload */ /**********************************/ @@ -137,13 +143,13 @@ opus_int silk_Decode( /* O Returns error co channel_state[ n ].nFramesPerPacket = 3; channel_state[ n ].nb_subfr = 4; } else { - silk_assert( 0 ); + celt_assert( 0 ); RESTORE_STACK; return SILK_DEC_INVALID_FRAME_SIZE; } fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1; if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) { - silk_assert( 0 ); + celt_assert( 0 ); RESTORE_STACK; return SILK_DEC_INVALID_SAMPLING_FREQUENCY; } @@ -194,7 +200,7 @@ opus_int silk_Decode( /* O Returns error co for( i = 0; i < channel_state[ 0 ].nFramesPerPacket; i++ ) { for( n = 0; n < decControl->nChannelsInternal; n++ ) { if( channel_state[ n ].LBRR_flags[ i ] ) { - opus_int pulses[ MAX_FRAME_LENGTH ]; + opus_int16 pulses[ MAX_FRAME_LENGTH ]; opus_int condCoding; if( decControl->nChannelsInternal == 2 && n == 0 ) { @@ -249,13 +255,22 @@ opus_int silk_Decode( /* O Returns error co psDec->channel_state[ 1 ].first_frame_after_reset = 1; } - ALLOC( samplesOut1_tmp_storage, - decControl->nChannelsInternal*( - channel_state[ 0 ].frame_length + 2 ), + /* Check if the temp buffer fits into the output PCM buffer. If it fits, + we can delay allocating the temp buffer until after the SILK peak stack + usage. We need to use a < and not a <= because of the two extra samples. */ + delay_stack_alloc = decControl->internalSampleRate*decControl->nChannelsInternal + < decControl->API_sampleRate*decControl->nChannelsAPI; + ALLOC( samplesOut1_tmp_storage1, delay_stack_alloc ? ALLOC_NONE + : decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ), opus_int16 ); - samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage; - samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage - + channel_state[ 0 ].frame_length + 2; + if ( delay_stack_alloc ) + { + samplesOut1_tmp[ 0 ] = samplesOut; + samplesOut1_tmp[ 1 ] = samplesOut + channel_state[ 0 ].frame_length + 2; + } else { + samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage1; + samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage1 + channel_state[ 0 ].frame_length + 2; + } if( lostFlag == FLAG_DECODE_NORMAL ) { has_side = !decode_only_middle; @@ -282,7 +297,7 @@ opus_int silk_Decode( /* O Returns error co } else { condCoding = CODE_CONDITIONALLY; } - ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 ], &nSamplesOutDec, lostFlag, condCoding); + ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 ], &nSamplesOutDec, lostFlag, condCoding, arch); } else { silk_memset( &samplesOut1_tmp[ n ][ 2 ], 0, nSamplesOutDec * sizeof( opus_int16 ) ); } @@ -303,13 +318,22 @@ opus_int silk_Decode( /* O Returns error co /* Set up pointers to temp buffers */ ALLOC( samplesOut2_tmp, - decControl->nChannelsAPI == 2 ? *nSamplesOut : 0, opus_int16 ); + decControl->nChannelsAPI == 2 ? *nSamplesOut : ALLOC_NONE, opus_int16 ); if( decControl->nChannelsAPI == 2 ) { resample_out_ptr = samplesOut2_tmp; } else { resample_out_ptr = samplesOut; } + ALLOC( samplesOut1_tmp_storage2, delay_stack_alloc + ? decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ) + : ALLOC_NONE, + opus_int16 ); + if ( delay_stack_alloc ) { + OPUS_COPY(samplesOut1_tmp_storage2, samplesOut, decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2)); + samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage2; + samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage2 + channel_state[ 0 ].frame_length + 2; + } for( n = 0; n < silk_min( decControl->nChannelsAPI, decControl->nChannelsInternal ); n++ ) { /* Resample decoded signal to API_sampleRate */ diff --git a/external/opus-1.0.3/silk/decode_core.c b/external/opus-1.3.1/silk/decode_core.c similarity index 96% rename from external/opus-1.0.3/silk/decode_core.c rename to external/opus-1.3.1/silk/decode_core.c index 0365ffdf..1c352a65 100644 --- a/external/opus-1.0.3/silk/decode_core.c +++ b/external/opus-1.3.1/silk/decode_core.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -39,7 +39,8 @@ void silk_decode_core( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I Decoder control */ opus_int16 xq[], /* O Decoded speech */ - const opus_int pulses[ MAX_FRAME_LENGTH ] /* I Pulse signal */ + const opus_int16 pulses[ MAX_FRAME_LENGTH ], /* I Pulse signal */ + int arch /* I Run-time architecture */ ) { opus_int i, k, lag = 0, start_idx, sLTP_buf_idx, NLSF_interpolation_flag, signalType; @@ -140,14 +141,14 @@ void silk_decode_core( if( k == 0 || ( k == 2 && NLSF_interpolation_flag ) ) { /* Rewhiten with new A coefs */ start_idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2; - silk_assert( start_idx > 0 ); + celt_assert( start_idx > 0 ); if( k == 2 ) { silk_memcpy( &psDec->outBuf[ psDec->ltp_mem_length ], xq, 2 * psDec->subfr_length * sizeof( opus_int16 ) ); } silk_LPC_analysis_filter( &sLTP[ start_idx ], &psDec->outBuf[ start_idx + k * psDec->subfr_length ], - A_Q12, psDec->ltp_mem_length - start_idx, psDec->LPC_order ); + A_Q12, psDec->ltp_mem_length - start_idx, psDec->LPC_order, arch ); /* After rewhitening the LTP state is unscaled */ if( k == 0 ) { @@ -195,7 +196,7 @@ void silk_decode_core( for( i = 0; i < psDec->subfr_length; i++ ) { /* Short-term prediction */ - silk_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); + celt_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12_tmp[ 0 ] ); @@ -218,14 +219,12 @@ void silk_decode_core( } /* Add prediction to LPC excitation */ - sLPC_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_LSHIFT32( pres_Q14[ i ], LPC_pred_Q10, 4 ); + sLPC_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( pres_Q14[ i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); /* Scale with gain */ pxq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( sLPC_Q14[ MAX_LPC_ORDER + i ], Gain_Q10 ), 8 ) ); } - /* DEBUG_STORE_DATA( dec.pcm, pxq, psDec->subfr_length * sizeof( opus_int16 ) ) */ - /* Update LPC filter state */ silk_memcpy( sLPC_Q14, &sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); pexc_Q14 += psDec->subfr_length; diff --git a/external/opus-1.0.3/silk/decode_frame.c b/external/opus-1.3.1/silk/decode_frame.c similarity index 87% rename from external/opus-1.0.3/silk/decode_frame.c rename to external/opus-1.3.1/silk/decode_frame.c index 8d7c6eb6..e73825b2 100644 --- a/external/opus-1.0.3/silk/decode_frame.c +++ b/external/opus-1.3.1/silk/decode_frame.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -42,26 +42,27 @@ opus_int silk_decode_frame( opus_int16 pOut[], /* O Pointer to output speech frame */ opus_int32 *pN, /* O Pointer to size of output frame */ opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ - opus_int condCoding /* I The type of conditional coding to use */ + opus_int condCoding, /* I The type of conditional coding to use */ + int arch /* I Run-time architecture */ ) { VARDECL( silk_decoder_control, psDecCtrl ); opus_int L, mv_len, ret = 0; - VARDECL( opus_int, pulses ); SAVE_STACK; L = psDec->frame_length; ALLOC( psDecCtrl, 1, silk_decoder_control ); - ALLOC( pulses, (L + SHELL_CODEC_FRAME_LENGTH - 1) & - ~(SHELL_CODEC_FRAME_LENGTH - 1), opus_int ); psDecCtrl->LTP_scale_Q14 = 0; /* Safety checks */ - silk_assert( L > 0 && L <= MAX_FRAME_LENGTH ); + celt_assert( L > 0 && L <= MAX_FRAME_LENGTH ); if( lostFlag == FLAG_DECODE_NORMAL || ( lostFlag == FLAG_DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 1 ) ) { + VARDECL( opus_int16, pulses ); + ALLOC( pulses, (L + SHELL_CODEC_FRAME_LENGTH - 1) & + ~(SHELL_CODEC_FRAME_LENGTH - 1), opus_int16 ); /*********************************************/ /* Decode quantization indices of side info */ /*********************************************/ @@ -81,28 +82,29 @@ opus_int silk_decode_frame( /********************************************************/ /* Run inverse NSQ */ /********************************************************/ - silk_decode_core( psDec, psDecCtrl, pOut, pulses ); + silk_decode_core( psDec, psDecCtrl, pOut, pulses, arch ); /********************************************************/ /* Update PLC state */ /********************************************************/ - silk_PLC( psDec, psDecCtrl, pOut, 0 ); + silk_PLC( psDec, psDecCtrl, pOut, 0, arch ); psDec->lossCnt = 0; psDec->prevSignalType = psDec->indices.signalType; - silk_assert( psDec->prevSignalType >= 0 && psDec->prevSignalType <= 2 ); + celt_assert( psDec->prevSignalType >= 0 && psDec->prevSignalType <= 2 ); /* A frame has been decoded without errors */ psDec->first_frame_after_reset = 0; } else { /* Handle packet loss by extrapolation */ - silk_PLC( psDec, psDecCtrl, pOut, 1 ); + psDec->indices.signalType = psDec->prevSignalType; + silk_PLC( psDec, psDecCtrl, pOut, 1, arch ); } /*************************/ /* Update output buffer. */ /*************************/ - silk_assert( psDec->ltp_mem_length >= psDec->frame_length ); + celt_assert( psDec->ltp_mem_length >= psDec->frame_length ); mv_len = psDec->ltp_mem_length - psDec->frame_length; silk_memmove( psDec->outBuf, &psDec->outBuf[ psDec->frame_length ], mv_len * sizeof(opus_int16) ); silk_memcpy( &psDec->outBuf[ mv_len ], pOut, psDec->frame_length * sizeof( opus_int16 ) ); diff --git a/external/opus-1.0.3/silk/decode_indices.c b/external/opus-1.3.1/silk/decode_indices.c similarity index 98% rename from external/opus-1.0.3/silk/decode_indices.c rename to external/opus-1.3.1/silk/decode_indices.c index 69172102..0bb4a997 100644 --- a/external/opus-1.0.3/silk/decode_indices.c +++ b/external/opus-1.3.1/silk/decode_indices.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -79,7 +79,7 @@ void silk_decode_indices( /**********************/ psDec->indices.NLSFIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, &psDec->psNLSF_CB->CB1_iCDF[ ( psDec->indices.signalType >> 1 ) * psDec->psNLSF_CB->nVectors ], 8 ); silk_NLSF_unpack( ec_ix, pred_Q8, psDec->psNLSF_CB, psDec->indices.NLSFIndices[ 0 ] ); - silk_assert( psDec->psNLSF_CB->order == psDec->LPC_order ); + celt_assert( psDec->psNLSF_CB->order == psDec->LPC_order ); for( i = 0; i < psDec->psNLSF_CB->order; i++ ) { Ix = ec_dec_icdf( psRangeDec, &psDec->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); if( Ix == 0 ) { diff --git a/external/opus-1.0.3/silk/decode_parameters.c b/external/opus-1.3.1/silk/decode_parameters.c similarity index 98% rename from external/opus-1.0.3/silk/decode_parameters.c rename to external/opus-1.3.1/silk/decode_parameters.c index e4c7e7a4..a56a4098 100644 --- a/external/opus-1.0.3/silk/decode_parameters.c +++ b/external/opus-1.3.1/silk/decode_parameters.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -52,7 +52,7 @@ void silk_decode_parameters( silk_NLSF_decode( pNLSF_Q15, psDec->indices.NLSFIndices, psDec->psNLSF_CB ); /* Convert NLSF parameters to AR prediction filter coefficients */ - silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order ); + silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order, psDec->arch ); /* If just reset, e.g., because internal Fs changed, do not allow interpolation */ /* improves the case of packet loss in the first frame after a switch */ @@ -69,7 +69,7 @@ void silk_decode_parameters( } /* Convert NLSF parameters to AR prediction filter coefficients */ - silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order ); + silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order, psDec->arch ); } else { /* Copy LPC coefficients for first half from second half */ silk_memcpy( psDecCtrl->PredCoef_Q12[ 0 ], psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( opus_int16 ) ); diff --git a/external/opus-1.0.3/silk/decode_pitch.c b/external/opus-1.3.1/silk/decode_pitch.c similarity index 96% rename from external/opus-1.0.3/silk/decode_pitch.c rename to external/opus-1.3.1/silk/decode_pitch.c index 80fb4d9f..fd1b6bf5 100644 --- a/external/opus-1.0.3/silk/decode_pitch.c +++ b/external/opus-1.3.1/silk/decode_pitch.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -51,7 +51,7 @@ void silk_decode_pitch( Lag_CB_ptr = &silk_CB_lags_stage2[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE2_EXT; } else { - silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); + celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); Lag_CB_ptr = &silk_CB_lags_stage2_10_ms[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE2_10MS; } @@ -60,7 +60,7 @@ void silk_decode_pitch( Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); + celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE3_10MS; } diff --git a/external/opus-1.0.3/silk/decode_pulses.c b/external/opus-1.3.1/silk/decode_pulses.c similarity index 93% rename from external/opus-1.0.3/silk/decode_pulses.c rename to external/opus-1.3.1/silk/decode_pulses.c index 1c781a0b..a56d2d30 100644 --- a/external/opus-1.0.3/silk/decode_pulses.c +++ b/external/opus-1.3.1/silk/decode_pulses.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -36,7 +36,7 @@ POSSIBILITY OF SUCH DAMAGE. /*********************************************/ void silk_decode_pulses( ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int pulses[], /* O Excitation signal */ + opus_int16 pulses[], /* O Excitation signal */ const opus_int signalType, /* I Sigtype */ const opus_int quantOffsetType, /* I quantOffsetType */ const opus_int frame_length /* I Frame length */ @@ -44,7 +44,7 @@ void silk_decode_pulses( { opus_int i, j, k, iter, abs_q, nLS, RateLevelIndex; opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ], nLshifts[ MAX_NB_SHELL_BLOCKS ]; - opus_int *pulses_ptr; + opus_int16 *pulses_ptr; const opus_uint8 *cdf_ptr; /*********************/ @@ -56,7 +56,7 @@ void silk_decode_pulses( silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH ); iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH ); if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) { - silk_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ + celt_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ iter++; } @@ -69,9 +69,9 @@ void silk_decode_pulses( sum_pulses[ i ] = ec_dec_icdf( psRangeDec, cdf_ptr, 8 ); /* LSB indication */ - while( sum_pulses[ i ] == MAX_PULSES + 1 ) { + while( sum_pulses[ i ] == SILK_MAX_PULSES + 1 ) { nLshifts[ i ]++; - /* When we've already got 10 LSBs, we shift the table to not allow (MAX_PULSES + 1) */ + /* When we've already got 10 LSBs, we shift the table to not allow (SILK_MAX_PULSES + 1) */ sum_pulses[ i ] = ec_dec_icdf( psRangeDec, silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1] + ( nLshifts[ i ] == 10 ), 8 ); } @@ -84,7 +84,7 @@ void silk_decode_pulses( if( sum_pulses[ i ] > 0 ) { silk_shell_decoder( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], psRangeDec, sum_pulses[ i ] ); } else { - silk_memset( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( opus_int ) ); + silk_memset( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( pulses[0] ) ); } } diff --git a/external/opus-1.0.3/silk/decoder_set_fs.c b/external/opus-1.3.1/silk/decoder_set_fs.c similarity index 95% rename from external/opus-1.0.3/silk/decoder_set_fs.c rename to external/opus-1.3.1/silk/decoder_set_fs.c index 38ac249c..d9a13d0f 100644 --- a/external/opus-1.0.3/silk/decoder_set_fs.c +++ b/external/opus-1.3.1/silk/decoder_set_fs.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -40,8 +40,8 @@ opus_int silk_decoder_set_fs( { opus_int frame_length, ret = 0; - silk_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); - silk_assert( psDec->nb_subfr == MAX_NB_SUBFR || psDec->nb_subfr == MAX_NB_SUBFR/2 ); + celt_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); + celt_assert( psDec->nb_subfr == MAX_NB_SUBFR || psDec->nb_subfr == MAX_NB_SUBFR/2 ); /* New (sub)frame length */ psDec->subfr_length = silk_SMULBB( SUB_FRAME_LENGTH_MS, fs_kHz ); @@ -86,7 +86,7 @@ opus_int silk_decoder_set_fs( psDec->pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; } else { /* unsupported sampling rate */ - silk_assert( 0 ); + celt_assert( 0 ); } psDec->first_frame_after_reset = 1; psDec->lagPrev = 100; @@ -101,7 +101,7 @@ opus_int silk_decoder_set_fs( } /* Check that settings are valid */ - silk_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH ); + celt_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH ); return ret; } diff --git a/external/opus-1.0.3/silk/define.h b/external/opus-1.3.1/silk/define.h similarity index 95% rename from external/opus-1.0.3/silk/define.h rename to external/opus-1.3.1/silk/define.h index f74f4869..247cb0bf 100644 --- a/external/opus-1.0.3/silk/define.h +++ b/external/opus-1.3.1/silk/define.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -46,7 +46,6 @@ extern "C" /* Limits on bitrate */ #define MIN_TARGET_RATE_BPS 5000 #define MAX_TARGET_RATE_BPS 80000 -#define TARGET_RATE_TAB_SZ 8 /* LBRR thresholds */ #define LBRR_NB_MIN_RATE_BPS 12000 @@ -56,6 +55,12 @@ extern "C" /* DTX settings */ #define NB_SPEECH_FRAMES_BEFORE_DTX 10 /* eq 200 ms */ #define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */ +#define DTX_ACTIVITY_THRESHOLD 0.1f + +/* VAD decision */ +#define VAD_NO_DECISION -1 +#define VAD_NO_ACTIVITY 0 +#define VAD_ACTIVITY 1 /* Maximum sampling frequency */ #define MAX_FS_KHZ 16 @@ -147,7 +152,7 @@ extern "C" #define USE_HARM_SHAPING 1 /* Max LPC order of noise shaping filters */ -#define MAX_SHAPE_LPC_ORDER 16 +#define MAX_SHAPE_LPC_ORDER 24 #define HARM_SHAPE_FIR_TAPS 3 @@ -157,8 +162,7 @@ extern "C" #define LTP_BUF_LENGTH 512 #define LTP_MASK ( LTP_BUF_LENGTH - 1 ) -#define DECISION_DELAY 32 -#define DECISION_DELAY_MASK ( DECISION_DELAY - 1 ) +#define DECISION_DELAY 40 /* Number of subframes for excitation entropy coding */ #define SHELL_CODEC_FRAME_LENGTH 16 @@ -169,15 +173,11 @@ extern "C" #define N_RATE_LEVELS 10 /* Maximum sum of pulses per shell coding frame */ -#define MAX_PULSES 16 +#define SILK_MAX_PULSES 16 #define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */ -#if( MAX_LPC_ORDER > DECISION_DELAY ) # define NSQ_LPC_BUF_LENGTH MAX_LPC_ORDER -#else -# define NSQ_LPC_BUF_LENGTH DECISION_DELAY -#endif /***************************/ /* Voice activity detector */ @@ -205,7 +205,6 @@ extern "C" /******************/ #define NLSF_W_Q 2 #define NLSF_VQ_MAX_VECTORS 32 -#define NLSF_VQ_MAX_SURVIVORS 32 #define NLSF_QUANT_MAX_AMPLITUDE 4 #define NLSF_QUANT_MAX_AMPLITUDE_EXT 10 #define NLSF_QUANT_LEVEL_ADJ 0.1 diff --git a/external/opus-1.0.3/silk/enc_API.c b/external/opus-1.3.1/silk/enc_API.c similarity index 90% rename from external/opus-1.0.3/silk/enc_API.c rename to external/opus-1.3.1/silk/enc_API.c index 78ad8a22..55a33f37 100644 --- a/external/opus-1.0.3/silk/enc_API.c +++ b/external/opus-1.3.1/silk/enc_API.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -32,6 +32,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "API.h" #include "control.h" #include "typedef.h" +#include "stack_alloc.h" #include "structs.h" #include "tuning_parameters.h" #ifdef FIXED_POINT @@ -68,6 +69,7 @@ opus_int silk_Get_Encoder_Size( /* O Returns error co /*************************/ opus_int silk_InitEncoder( /* O Returns error code */ void *encState, /* I/O State */ + int arch, /* I Run-time architecture */ silk_EncControlStruct *encStatus /* O Encoder Status */ ) { @@ -79,8 +81,8 @@ opus_int silk_InitEncoder( /* O Returns error co /* Reset encoder */ silk_memset( psEnc, 0, sizeof( silk_encoder ) ); for( n = 0; n < ENCODER_NUM_CHANNELS; n++ ) { - if( ret += silk_init_encoder( &psEnc->state_Fxx[ n ] ) ) { - silk_assert( 0 ); + if( ret += silk_init_encoder( &psEnc->state_Fxx[ n ], arch ) ) { + celt_assert( 0 ); } } @@ -89,7 +91,7 @@ opus_int silk_InitEncoder( /* O Returns error co /* Read control structure */ if( ret += silk_QueryEncoder( encState, encStatus ) ) { - silk_assert( 0 ); + celt_assert( 0 ); } return ret; @@ -142,22 +144,31 @@ opus_int silk_Encode( /* O Returns error co opus_int nSamplesIn, /* I Number of samples in input vector */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */ - const opus_int prefillFlag /* I Flag to indicate prefilling buffers no coding */ + const opus_int prefillFlag, /* I Flag to indicate prefilling buffers no coding */ + opus_int activity /* I Decision of Opus voice activity detector */ ) { opus_int n, i, nBits, flags, tmp_payloadSize_ms = 0, tmp_complexity = 0, ret = 0; - opus_int nSamplesToBuffer, nBlocksOf10ms, nSamplesFromInput = 0; + opus_int nSamplesToBuffer, nSamplesToBufferMax, nBlocksOf10ms; + opus_int nSamplesFromInput = 0, nSamplesFromInputMax; opus_int speech_act_thr_for_switch_Q8; opus_int32 TargetRate_bps, MStargetRates_bps[ 2 ], channelRate_bps, LBRR_symbol, sum; silk_encoder *psEnc = ( silk_encoder * )encState; - opus_int16 buf[ MAX_FRAME_LENGTH_MS * MAX_API_FS_KHZ ]; + VARDECL( opus_int16, buf ); opus_int transition, curr_block, tot_blocks; + SAVE_STACK; + if (encControl->reducedDependency) + { + psEnc->state_Fxx[0].sCmn.first_frame_after_reset = 1; + psEnc->state_Fxx[1].sCmn.first_frame_after_reset = 1; + } psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded = psEnc->state_Fxx[ 1 ].sCmn.nFramesEncoded = 0; /* Check values in encoder control structure */ - if( ( ret = check_control_input( encControl ) != 0 ) ) { - silk_assert( 0 ); + if( ( ret = check_control_input( encControl ) ) != 0 ) { + celt_assert( 0 ); + RESTORE_STACK; return ret; } @@ -165,7 +176,7 @@ opus_int silk_Encode( /* O Returns error co if( encControl->nChannelsInternal > psEnc->nChannelsInternal ) { /* Mono -> Stereo transition: init state of second channel and stereo state */ - ret += silk_init_encoder( &psEnc->state_Fxx[ 1 ] ); + ret += silk_init_encoder( &psEnc->state_Fxx[ 1 ], psEnc->state_Fxx[ 0 ].sCmn.arch ); silk_memset( psEnc->sStereo.pred_prev_Q13, 0, sizeof( psEnc->sStereo.pred_prev_Q13 ) ); silk_memset( psEnc->sStereo.sSide, 0, sizeof( psEnc->sStereo.sSide ) ); psEnc->sStereo.mid_side_amp_Q0[ 0 ] = 0; @@ -189,17 +200,26 @@ opus_int silk_Encode( /* O Returns error co tot_blocks = ( nBlocksOf10ms > 1 ) ? nBlocksOf10ms >> 1 : 1; curr_block = 0; if( prefillFlag ) { + silk_LP_state save_LP; /* Only accept input length of 10 ms */ if( nBlocksOf10ms != 1 ) { - ret = SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; - silk_assert( 0 ); - return ret; + celt_assert( 0 ); + RESTORE_STACK; + return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; + } + if ( prefillFlag == 2 ) { + save_LP = psEnc->state_Fxx[ 0 ].sCmn.sLP; + /* Save the sampling rate so the bandwidth switching code can keep handling transitions. */ + save_LP.saved_fs_kHz = psEnc->state_Fxx[ 0 ].sCmn.fs_kHz; } /* Reset Encoder */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { - if( (ret = silk_init_encoder( &psEnc->state_Fxx[ n ] ) ) != 0 ) { - silk_assert( 0 ); + ret = silk_init_encoder( &psEnc->state_Fxx[ n ], psEnc->state_Fxx[ n ].sCmn.arch ); + /* Restore the variable LP state. */ + if ( prefillFlag == 2 ) { + psEnc->state_Fxx[ n ].sCmn.sLP = save_LP; } + celt_assert( !ret ); } tmp_payloadSize_ms = encControl->payloadSize_ms; encControl->payloadSize_ms = 10; @@ -212,24 +232,24 @@ opus_int silk_Encode( /* O Returns error co } else { /* Only accept input lengths that are a multiple of 10 ms */ if( nBlocksOf10ms * encControl->API_sampleRate != 100 * nSamplesIn || nSamplesIn < 0 ) { - ret = SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; - silk_assert( 0 ); - return ret; + celt_assert( 0 ); + RESTORE_STACK; + return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; } /* Make sure no more than one packet can be produced */ if( 1000 * (opus_int32)nSamplesIn > encControl->payloadSize_ms * encControl->API_sampleRate ) { - ret = SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; - silk_assert( 0 ); - return ret; + celt_assert( 0 ); + RESTORE_STACK; + return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; } } - TargetRate_bps = silk_RSHIFT32( encControl->bitRate, encControl->nChannelsInternal - 1 ); for( n = 0; n < encControl->nChannelsInternal; n++ ) { /* Force the side channel to the same rate as the mid */ opus_int force_fs_kHz = (n==1) ? psEnc->state_Fxx[0].sCmn.fs_kHz : 0; - if( ( ret = silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, TargetRate_bps, psEnc->allowBandwidthSwitch, n, force_fs_kHz ) ) != 0 ) { + if( ( ret = silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, psEnc->allowBandwidthSwitch, n, force_fs_kHz ) ) != 0 ) { silk_assert( 0 ); + RESTORE_STACK; return ret; } if( psEnc->state_Fxx[n].sCmn.first_frame_after_reset || transition ) { @@ -239,12 +259,19 @@ opus_int silk_Encode( /* O Returns error co } psEnc->state_Fxx[ n ].sCmn.inDTX = psEnc->state_Fxx[ n ].sCmn.useDTX; } - silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); + celt_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); /* Input buffering/resampling and encoding */ + nSamplesToBufferMax = + 10 * nBlocksOf10ms * psEnc->state_Fxx[ 0 ].sCmn.fs_kHz; + nSamplesFromInputMax = + silk_DIV32_16( nSamplesToBufferMax * + psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz, + psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 ); + ALLOC( buf, nSamplesFromInputMax, opus_int16 ); while( 1 ) { nSamplesToBuffer = psEnc->state_Fxx[ 0 ].sCmn.frame_length - psEnc->state_Fxx[ 0 ].sCmn.inputBufIx; - nSamplesToBuffer = silk_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->state_Fxx[ 0 ].sCmn.fs_kHz ); + nSamplesToBuffer = silk_min( nSamplesToBuffer, nSamplesToBufferMax ); nSamplesFromInput = silk_DIV32_16( nSamplesToBuffer * psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 ); /* Resample and write to buffer */ if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 2 ) { @@ -290,7 +317,7 @@ opus_int silk_Encode( /* O Returns error co } psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; } else { - silk_assert( encControl->nChannelsAPI == 1 && encControl->nChannelsInternal == 1 ); + celt_assert( encControl->nChannelsAPI == 1 && encControl->nChannelsInternal == 1 ); silk_memcpy(buf, samplesIn, nSamplesFromInput*sizeof(opus_int16)); ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); @@ -306,8 +333,8 @@ opus_int silk_Encode( /* O Returns error co /* Silk encoder */ if( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx >= psEnc->state_Fxx[ 0 ].sCmn.frame_length ) { /* Enough data in input buffer, so encode */ - silk_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_Fxx[ 0 ].sCmn.frame_length ); - silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length ); + celt_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_Fxx[ 0 ].sCmn.frame_length ); + celt_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length ); /* Deal with LBRR data */ if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 && !prefillFlag ) { @@ -399,7 +426,6 @@ opus_int silk_Encode( /* O Returns error co /* Reset side channel encoder memory for first frame with side coding */ if( psEnc->prev_decode_only_middle == 1 ) { silk_memset( &psEnc->state_Fxx[ 1 ].sShape, 0, sizeof( psEnc->state_Fxx[ 1 ].sShape ) ); - silk_memset( &psEnc->state_Fxx[ 1 ].sPrefilt, 0, sizeof( psEnc->state_Fxx[ 1 ].sPrefilt ) ); silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sNSQ, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sNSQ ) ); silk_memset( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15 ) ); silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State ) ); @@ -410,7 +436,7 @@ opus_int silk_Encode( /* O Returns error co psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_gain_Q16 = 65536; psEnc->state_Fxx[ 1 ].sCmn.first_frame_after_reset = 1; } - silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ] ); + silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ], activity ); } else { psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] = 0; } @@ -425,7 +451,7 @@ opus_int silk_Encode( /* O Returns error co silk_memcpy( psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->sStereo.sMid, 2 * sizeof( opus_int16 ) ); silk_memcpy( psEnc->sStereo.sMid, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.frame_length ], 2 * sizeof( opus_int16 ) ); } - silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ] ); + silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ], activity ); /* Encode */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { @@ -540,6 +566,11 @@ opus_int silk_Encode( /* O Returns error co } } + encControl->signalType = psEnc->state_Fxx[0].sCmn.indices.signalType; + encControl->offset = silk_Quantization_Offsets_Q10 + [ psEnc->state_Fxx[0].sCmn.indices.signalType >> 1 ] + [ psEnc->state_Fxx[0].sCmn.indices.quantOffsetType ]; + RESTORE_STACK; return ret; } diff --git a/external/opus-1.0.3/silk/encode_indices.c b/external/opus-1.3.1/silk/encode_indices.c similarity index 97% rename from external/opus-1.0.3/silk/encode_indices.c rename to external/opus-1.3.1/silk/encode_indices.c index 91e28aa9..4bcbc334 100644 --- a/external/opus-1.0.3/silk/encode_indices.c +++ b/external/opus-1.3.1/silk/encode_indices.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -56,8 +56,8 @@ void silk_encode_indices( /* Encode signal type and quantizer offset */ /*******************************************/ typeOffset = 2 * psIndices->signalType + psIndices->quantOffsetType; - silk_assert( typeOffset >= 0 && typeOffset < 6 ); - silk_assert( encode_LBRR == 0 || typeOffset >= 2 ); + celt_assert( typeOffset >= 0 && typeOffset < 6 ); + celt_assert( encode_LBRR == 0 || typeOffset >= 2 ); if( encode_LBRR || typeOffset >= 2 ) { ec_enc_icdf( psRangeEnc, typeOffset - 2, silk_type_offset_VAD_iCDF, 8 ); } else { @@ -90,7 +90,7 @@ void silk_encode_indices( /****************/ ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ 0 ], &psEncC->psNLSF_CB->CB1_iCDF[ ( psIndices->signalType >> 1 ) * psEncC->psNLSF_CB->nVectors ], 8 ); silk_NLSF_unpack( ec_ix, pred_Q8, psEncC->psNLSF_CB, psIndices->NLSFIndices[ 0 ] ); - silk_assert( psEncC->psNLSF_CB->order == psEncC->predictLPCOrder ); + celt_assert( psEncC->psNLSF_CB->order == psEncC->predictLPCOrder ); for( i = 0; i < psEncC->psNLSF_CB->order; i++ ) { if( psIndices->NLSFIndices[ i+1 ] >= NLSF_QUANT_MAX_AMPLITUDE ) { ec_enc_icdf( psRangeEnc, 2 * NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); diff --git a/external/opus-1.0.3/silk/encode_pulses.c b/external/opus-1.3.1/silk/encode_pulses.c similarity index 91% rename from external/opus-1.0.3/silk/encode_pulses.c rename to external/opus-1.3.1/silk/encode_pulses.c index b01b5853..8a199913 100644 --- a/external/opus-1.0.3/silk/encode_pulses.c +++ b/external/opus-1.3.1/silk/encode_pulses.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,12 +30,13 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main.h" +#include "stack_alloc.h" /*********************************************/ /* Encode quantization indices of excitation */ /*********************************************/ -static inline opus_int combine_and_check( /* return ok */ +static OPUS_INLINE opus_int combine_and_check( /* return ok */ opus_int *pulses_comb, /* O */ const opus_int *pulses_in, /* I */ opus_int max_pulses, /* I max value for sum of pulses */ @@ -66,14 +67,15 @@ void silk_encode_pulses( { opus_int i, k, j, iter, bit, nLS, scale_down, RateLevelIndex = 0; opus_int32 abs_q, minSumBits_Q5, sumBits_Q5; - opus_int abs_pulses[ MAX_FRAME_LENGTH ]; - opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ]; - opus_int nRshifts[ MAX_NB_SHELL_BLOCKS ]; + VARDECL( opus_int, abs_pulses ); + VARDECL( opus_int, sum_pulses ); + VARDECL( opus_int, nRshifts ); opus_int pulses_comb[ 8 ]; opus_int *abs_pulses_ptr; const opus_int8 *pulses_ptr; const opus_uint8 *cdf_ptr; const opus_uint8 *nBits_ptr; + SAVE_STACK; silk_memset( pulses_comb, 0, 8 * sizeof( opus_int ) ); /* Fixing Valgrind reported problem*/ @@ -84,12 +86,14 @@ void silk_encode_pulses( silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH ); iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH ); if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) { - silk_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ + celt_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ iter++; silk_memset( &pulses[ frame_length ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof(opus_int8)); } /* Take the absolute value of the pulses */ + ALLOC( abs_pulses, iter * SHELL_CODEC_FRAME_LENGTH, opus_int ); + silk_assert( !( SHELL_CODEC_FRAME_LENGTH & 3 ) ); for( i = 0; i < iter * SHELL_CODEC_FRAME_LENGTH; i+=4 ) { abs_pulses[i+0] = ( opus_int )silk_abs( pulses[ i + 0 ] ); abs_pulses[i+1] = ( opus_int )silk_abs( pulses[ i + 1 ] ); @@ -98,6 +102,8 @@ void silk_encode_pulses( } /* Calc sum pulses per shell code frame */ + ALLOC( sum_pulses, iter, opus_int ); + ALLOC( nRshifts, iter, opus_int ); abs_pulses_ptr = abs_pulses; for( i = 0; i < iter; i++ ) { nRshifts[ i ] = 0; @@ -136,7 +142,7 @@ void silk_encode_pulses( sumBits_Q5 = silk_rate_levels_BITS_Q5[ signalType >> 1 ][ k ]; for( i = 0; i < iter; i++ ) { if( nRshifts[ i ] > 0 ) { - sumBits_Q5 += nBits_ptr[ MAX_PULSES + 1 ]; + sumBits_Q5 += nBits_ptr[ SILK_MAX_PULSES + 1 ]; } else { sumBits_Q5 += nBits_ptr[ sum_pulses[ i ] ]; } @@ -156,9 +162,9 @@ void silk_encode_pulses( if( nRshifts[ i ] == 0 ) { ec_enc_icdf( psRangeEnc, sum_pulses[ i ], cdf_ptr, 8 ); } else { - ec_enc_icdf( psRangeEnc, MAX_PULSES + 1, cdf_ptr, 8 ); + ec_enc_icdf( psRangeEnc, SILK_MAX_PULSES + 1, cdf_ptr, 8 ); for( k = 0; k < nRshifts[ i ] - 1; k++ ) { - ec_enc_icdf( psRangeEnc, MAX_PULSES + 1, silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 ); + ec_enc_icdf( psRangeEnc, SILK_MAX_PULSES + 1, silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 ); } ec_enc_icdf( psRangeEnc, sum_pulses[ i ], silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 ); } @@ -196,4 +202,5 @@ void silk_encode_pulses( /* Encode signs */ /****************/ silk_encode_signs( psRangeEnc, pulses, frame_length, signalType, quantOffsetType, sum_pulses ); + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/errors.h b/external/opus-1.3.1/silk/errors.h similarity index 99% rename from external/opus-1.0.3/silk/errors.h rename to external/opus-1.3.1/silk/errors.h index 0591e009..45070800 100644 --- a/external/opus-1.0.3/silk/errors.h +++ b/external/opus-1.3.1/silk/errors.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/fixed/LTP_analysis_filter_FIX.c b/external/opus-1.3.1/silk/fixed/LTP_analysis_filter_FIX.c similarity index 86% rename from external/opus-1.0.3/silk/fixed/LTP_analysis_filter_FIX.c rename to external/opus-1.3.1/silk/fixed/LTP_analysis_filter_FIX.c index a8fee555..5574e706 100644 --- a/external/opus-1.0.3/silk/fixed/LTP_analysis_filter_FIX.c +++ b/external/opus-1.3.1/silk/fixed/LTP_analysis_filter_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -45,7 +45,7 @@ void silk_LTP_analysis_filter_FIX( const opus_int16 *x_ptr, *x_lag_ptr; opus_int16 Btmp_Q14[ LTP_ORDER ]; opus_int16 *LTP_res_ptr; - opus_int k, i, j; + opus_int k, i; opus_int32 LTP_est; x_ptr = x; @@ -53,9 +53,12 @@ void silk_LTP_analysis_filter_FIX( for( k = 0; k < nb_subfr; k++ ) { x_lag_ptr = x_ptr - pitchL[ k ]; - for( i = 0; i < LTP_ORDER; i++ ) { - Btmp_Q14[ i ] = LTPCoef_Q14[ k * LTP_ORDER + i ]; - } + + Btmp_Q14[ 0 ] = LTPCoef_Q14[ k * LTP_ORDER ]; + Btmp_Q14[ 1 ] = LTPCoef_Q14[ k * LTP_ORDER + 1 ]; + Btmp_Q14[ 2 ] = LTPCoef_Q14[ k * LTP_ORDER + 2 ]; + Btmp_Q14[ 3 ] = LTPCoef_Q14[ k * LTP_ORDER + 3 ]; + Btmp_Q14[ 4 ] = LTPCoef_Q14[ k * LTP_ORDER + 4 ]; /* LTP analysis FIR filter */ for( i = 0; i < subfr_length + pre_length; i++ ) { @@ -63,9 +66,11 @@ void silk_LTP_analysis_filter_FIX( /* Long-term prediction */ LTP_est = silk_SMULBB( x_lag_ptr[ LTP_ORDER / 2 ], Btmp_Q14[ 0 ] ); - for( j = 1; j < LTP_ORDER; j++ ) { - LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ LTP_ORDER / 2 - j ], Btmp_Q14[ j ] ); - } + LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ 1 ], Btmp_Q14[ 1 ] ); + LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ 0 ], Btmp_Q14[ 2 ] ); + LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ -1 ], Btmp_Q14[ 3 ] ); + LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ -2 ], Btmp_Q14[ 4 ] ); + LTP_est = silk_RSHIFT_ROUND( LTP_est, 14 ); /* round and -> Q0*/ /* Subtract long-term prediction */ diff --git a/external/opus-1.0.3/silk/fixed/LTP_scale_ctrl_FIX.c b/external/opus-1.3.1/silk/fixed/LTP_scale_ctrl_FIX.c similarity index 99% rename from external/opus-1.0.3/silk/fixed/LTP_scale_ctrl_FIX.c rename to external/opus-1.3.1/silk/fixed/LTP_scale_ctrl_FIX.c index ac2fba17..3dcedef8 100644 --- a/external/opus-1.0.3/silk/fixed/LTP_scale_ctrl_FIX.c +++ b/external/opus-1.3.1/silk/fixed/LTP_scale_ctrl_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/fixed/apply_sine_window_FIX.c b/external/opus-1.3.1/silk/fixed/apply_sine_window_FIX.c similarity index 95% rename from external/opus-1.0.3/silk/fixed/apply_sine_window_FIX.c rename to external/opus-1.3.1/silk/fixed/apply_sine_window_FIX.c index 897fdc30..03e088a6 100644 --- a/external/opus-1.0.3/silk/fixed/apply_sine_window_FIX.c +++ b/external/opus-1.3.1/silk/fixed/apply_sine_window_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -57,15 +57,15 @@ void silk_apply_sine_window( opus_int k, f_Q16, c_Q16; opus_int32 S0_Q16, S1_Q16; - silk_assert( win_type == 1 || win_type == 2 ); + celt_assert( win_type == 1 || win_type == 2 ); /* Length must be in a range from 16 to 120 and a multiple of 4 */ - silk_assert( length >= 16 && length <= 120 ); - silk_assert( ( length & 3 ) == 0 ); + celt_assert( length >= 16 && length <= 120 ); + celt_assert( ( length & 3 ) == 0 ); /* Frequency */ k = ( length >> 2 ) - 4; - silk_assert( k >= 0 && k <= 26 ); + celt_assert( k >= 0 && k <= 26 ); f_Q16 = (opus_int)freq_table_Q16[ k ]; /* Factor used for cosine approximation */ diff --git a/external/opus-1.3.1/silk/fixed/arm/warped_autocorrelation_FIX_arm.h b/external/opus-1.3.1/silk/fixed/arm/warped_autocorrelation_FIX_arm.h new file mode 100644 index 00000000..1992e432 --- /dev/null +++ b/external/opus-1.3.1/silk/fixed/arm/warped_autocorrelation_FIX_arm.h @@ -0,0 +1,68 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_WARPED_AUTOCORRELATION_FIX_ARM_H +# define SILK_WARPED_AUTOCORRELATION_FIX_ARM_H + +# include "celt/arm/armcpu.h" + +# if defined(FIXED_POINT) + +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +void silk_warped_autocorrelation_FIX_neon( + opus_int32 *corr, /* O Result [order + 1] */ + opus_int *scale, /* O Scaling of the correlation vector */ + const opus_int16 *input, /* I Input data to correlate */ + const opus_int warping_Q16, /* I Warping coefficient */ + const opus_int length, /* I Length of input */ + const opus_int order /* I Correlation order (even) */ +); + +# if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) +# define OVERRIDE_silk_warped_autocorrelation_FIX (1) +# define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ + ((void)(arch), PRESUME_NEON(silk_warped_autocorrelation_FIX)(corr, scale, input, warping_Q16, length, order)) +# endif +# endif + +# if !defined(OVERRIDE_silk_warped_autocorrelation_FIX) +/*Is run-time CPU detection enabled on this platform?*/ +# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) +extern void (*const SILK_WARPED_AUTOCORRELATION_FIX_IMPL[OPUS_ARCHMASK+1])(opus_int32*, opus_int*, const opus_int16*, const opus_int, const opus_int, const opus_int); +# define OVERRIDE_silk_warped_autocorrelation_FIX (1) +# define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ + ((*SILK_WARPED_AUTOCORRELATION_FIX_IMPL[(arch)&OPUS_ARCHMASK])(corr, scale, input, warping_Q16, length, order)) +# elif defined(OPUS_ARM_PRESUME_NEON_INTR) +# define OVERRIDE_silk_warped_autocorrelation_FIX (1) +# define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ + ((void)(arch), silk_warped_autocorrelation_FIX_neon(corr, scale, input, warping_Q16, length, order)) +# endif +# endif + +# endif /* end FIXED_POINT */ + +#endif /* end SILK_WARPED_AUTOCORRELATION_FIX_ARM_H */ diff --git a/external/opus-1.3.1/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c b/external/opus-1.3.1/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c new file mode 100644 index 00000000..6f3be025 --- /dev/null +++ b/external/opus-1.3.1/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c @@ -0,0 +1,265 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc., Jean-Marc Valin +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef OPUS_CHECK_ASM +# include +#endif +#include "stack_alloc.h" +#include "main_FIX.h" + +static OPUS_INLINE void calc_corr( const opus_int32 *const input_QS, opus_int64 *const corr_QC, const opus_int offset, const int32x4_t state_QS_s32x4 ) +{ + int64x2_t corr_QC_s64x2[ 2 ], t_s64x2[ 2 ]; + const int32x4_t input_QS_s32x4 = vld1q_s32( input_QS + offset ); + corr_QC_s64x2[ 0 ] = vld1q_s64( corr_QC + offset + 0 ); + corr_QC_s64x2[ 1 ] = vld1q_s64( corr_QC + offset + 2 ); + t_s64x2[ 0 ] = vmull_s32( vget_low_s32( state_QS_s32x4 ), vget_low_s32( input_QS_s32x4 ) ); + t_s64x2[ 1 ] = vmull_s32( vget_high_s32( state_QS_s32x4 ), vget_high_s32( input_QS_s32x4 ) ); + corr_QC_s64x2[ 0 ] = vsraq_n_s64( corr_QC_s64x2[ 0 ], t_s64x2[ 0 ], 2 * QS - QC ); + corr_QC_s64x2[ 1 ] = vsraq_n_s64( corr_QC_s64x2[ 1 ], t_s64x2[ 1 ], 2 * QS - QC ); + vst1q_s64( corr_QC + offset + 0, corr_QC_s64x2[ 0 ] ); + vst1q_s64( corr_QC + offset + 2, corr_QC_s64x2[ 1 ] ); +} + +static OPUS_INLINE int32x4_t calc_state( const int32x4_t state_QS0_s32x4, const int32x4_t state_QS0_1_s32x4, const int32x4_t state_QS1_1_s32x4, const int32x4_t warping_Q16_s32x4 ) +{ + int32x4_t t_s32x4 = vsubq_s32( state_QS0_s32x4, state_QS0_1_s32x4 ); + t_s32x4 = vqdmulhq_s32( t_s32x4, warping_Q16_s32x4 ); + return vaddq_s32( state_QS1_1_s32x4, t_s32x4 ); +} + +void silk_warped_autocorrelation_FIX_neon( + opus_int32 *corr, /* O Result [order + 1] */ + opus_int *scale, /* O Scaling of the correlation vector */ + const opus_int16 *input, /* I Input data to correlate */ + const opus_int warping_Q16, /* I Warping coefficient */ + const opus_int length, /* I Length of input */ + const opus_int order /* I Correlation order (even) */ +) +{ + if( ( MAX_SHAPE_LPC_ORDER > 24 ) || ( order < 6 ) ) { + silk_warped_autocorrelation_FIX_c( corr, scale, input, warping_Q16, length, order ); + } else { + opus_int n, i, lsh; + opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; /* In reverse order */ + opus_int64 corr_QC_orderT; + int64x2_t lsh_s64x2; + const opus_int orderT = ( order + 3 ) & ~3; + opus_int64 *corr_QCT; + opus_int32 *input_QS; + VARDECL( opus_int32, input_QST ); + VARDECL( opus_int32, state ); + SAVE_STACK; + + /* Order must be even */ + silk_assert( ( order & 1 ) == 0 ); + silk_assert( 2 * QS - QC >= 0 ); + + /* The additional +4 is to ensure a later vld1q_s32 call does not overflow. */ + /* Strictly, only +3 is needed but +4 simplifies initialization using the 4x32 neon load. */ + ALLOC( input_QST, length + 2 * MAX_SHAPE_LPC_ORDER + 4, opus_int32 ); + + input_QS = input_QST; + /* input_QS has zero paddings in the beginning and end. */ + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + + /* Loop over samples */ + for( n = 0; n < length - 7; n += 8, input_QS += 8 ) { + const int16x8_t t0_s16x4 = vld1q_s16( input + n ); + vst1q_s32( input_QS + 0, vshll_n_s16( vget_low_s16( t0_s16x4 ), QS ) ); + vst1q_s32( input_QS + 4, vshll_n_s16( vget_high_s16( t0_s16x4 ), QS ) ); + } + for( ; n < length; n++, input_QS++ ) { + input_QS[ 0 ] = silk_LSHIFT32( (opus_int32)input[ n ], QS ); + } + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS += 4; + vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); + input_QS = input_QST + MAX_SHAPE_LPC_ORDER - orderT; + + /* The following loop runs ( length + order ) times, with ( order ) extra epilogues. */ + /* The zero paddings in input_QS guarantee corr_QC's correctness even with the extra epilogues. */ + /* The values of state_QS will be polluted by the extra epilogues, however they are temporary values. */ + + /* Keep the C code here to help understand the intrinsics optimization. */ + /* + { + opus_int32 state_QS[ 2 ][ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + opus_int32 *state_QST[ 3 ]; + state_QST[ 0 ] = state_QS[ 0 ]; + state_QST[ 1 ] = state_QS[ 1 ]; + for( n = 0; n < length + order; n++, input_QS++ ) { + state_QST[ 0 ][ orderT ] = input_QS[ orderT ]; + for( i = 0; i < orderT; i++ ) { + corr_QC[ i ] += silk_RSHIFT64( silk_SMULL( state_QST[ 0 ][ i ], input_QS[ i ] ), 2 * QS - QC ); + state_QST[ 1 ][ i ] = silk_SMLAWB( state_QST[ 1 ][ i + 1 ], state_QST[ 0 ][ i ] - state_QST[ 0 ][ i + 1 ], warping_Q16 ); + } + state_QST[ 2 ] = state_QST[ 0 ]; + state_QST[ 0 ] = state_QST[ 1 ]; + state_QST[ 1 ] = state_QST[ 2 ]; + } + } + */ + + { + const int32x4_t warping_Q16_s32x4 = vdupq_n_s32( warping_Q16 << 15 ); + const opus_int32 *in = input_QS + orderT; + opus_int o = orderT; + int32x4_t state_QS_s32x4[ 3 ][ 2 ]; + + /* The additional +4 is to ensure a later vld1q_s32 call does not overflow. */ + ALLOC( state, length + order + 4, opus_int32 ); + state_QS_s32x4[ 2 ][ 1 ] = vdupq_n_s32( 0 ); + + /* Calculate 8 taps of all inputs in each loop. */ + do { + state_QS_s32x4[ 0 ][ 0 ] = state_QS_s32x4[ 0 ][ 1 ] = + state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 1 ][ 1 ] = vdupq_n_s32( 0 ); + n = 0; + do { + calc_corr( input_QS + n, corr_QC, o - 8, state_QS_s32x4[ 0 ][ 0 ] ); + calc_corr( input_QS + n, corr_QC, o - 4, state_QS_s32x4[ 0 ][ 1 ] ); + state_QS_s32x4[ 2 ][ 1 ] = vld1q_s32( in + n ); + vst1q_lane_s32( state + n, state_QS_s32x4[ 0 ][ 0 ], 0 ); + state_QS_s32x4[ 2 ][ 0 ] = vextq_s32( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 0 ][ 1 ], 1 ); + state_QS_s32x4[ 2 ][ 1 ] = vextq_s32( state_QS_s32x4[ 0 ][ 1 ], state_QS_s32x4[ 2 ][ 1 ], 1 ); + state_QS_s32x4[ 0 ][ 0 ] = calc_state( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], state_QS_s32x4[ 1 ][ 0 ], warping_Q16_s32x4 ); + state_QS_s32x4[ 0 ][ 1 ] = calc_state( state_QS_s32x4[ 0 ][ 1 ], state_QS_s32x4[ 2 ][ 1 ], state_QS_s32x4[ 1 ][ 1 ], warping_Q16_s32x4 ); + state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 2 ][ 0 ]; + state_QS_s32x4[ 1 ][ 1 ] = state_QS_s32x4[ 2 ][ 1 ]; + } while( ++n < ( length + order ) ); + in = state; + o -= 8; + } while( o > 4 ); + + if( o ) { + /* Calculate the last 4 taps of all inputs. */ + opus_int32 *stateT = state; + silk_assert( o == 4 ); + state_QS_s32x4[ 0 ][ 0 ] = state_QS_s32x4[ 1 ][ 0 ] = vdupq_n_s32( 0 ); + n = length + order; + do { + calc_corr( input_QS, corr_QC, 0, state_QS_s32x4[ 0 ][ 0 ] ); + state_QS_s32x4[ 2 ][ 0 ] = vld1q_s32( stateT ); + vst1q_lane_s32( stateT, state_QS_s32x4[ 0 ][ 0 ], 0 ); + state_QS_s32x4[ 2 ][ 0 ] = vextq_s32( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], 1 ); + state_QS_s32x4[ 0 ][ 0 ] = calc_state( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], state_QS_s32x4[ 1 ][ 0 ], warping_Q16_s32x4 ); + state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 2 ][ 0 ]; + input_QS++; + stateT++; + } while( --n ); + } + } + + { + const opus_int16 *inputT = input; + int32x4_t t_s32x4; + int64x1_t t_s64x1; + int64x2_t t_s64x2 = vdupq_n_s64( 0 ); + for( n = 0; n <= length - 8; n += 8 ) { + int16x8_t input_s16x8 = vld1q_s16( inputT ); + t_s32x4 = vmull_s16( vget_low_s16( input_s16x8 ), vget_low_s16( input_s16x8 ) ); + t_s32x4 = vmlal_s16( t_s32x4, vget_high_s16( input_s16x8 ), vget_high_s16( input_s16x8 ) ); + t_s64x2 = vaddw_s32( t_s64x2, vget_low_s32( t_s32x4 ) ); + t_s64x2 = vaddw_s32( t_s64x2, vget_high_s32( t_s32x4 ) ); + inputT += 8; + } + t_s64x1 = vadd_s64( vget_low_s64( t_s64x2 ), vget_high_s64( t_s64x2 ) ); + corr_QC_orderT = vget_lane_s64( t_s64x1, 0 ); + for( ; n < length; n++ ) { + corr_QC_orderT += silk_SMULL( input[ n ], input[ n ] ); + } + corr_QC_orderT = silk_LSHIFT64( corr_QC_orderT, QC ); + corr_QC[ orderT ] = corr_QC_orderT; + } + + corr_QCT = corr_QC + orderT - order; + lsh = silk_CLZ64( corr_QC_orderT ) - 35; + lsh = silk_LIMIT( lsh, -12 - QC, 30 - QC ); + *scale = -( QC + lsh ); + silk_assert( *scale >= -30 && *scale <= 12 ); + lsh_s64x2 = vdupq_n_s64( lsh ); + for( i = 0; i <= order - 3; i += 4 ) { + int32x4_t corr_s32x4; + int64x2_t corr_QC0_s64x2, corr_QC1_s64x2; + corr_QC0_s64x2 = vld1q_s64( corr_QCT + i ); + corr_QC1_s64x2 = vld1q_s64( corr_QCT + i + 2 ); + corr_QC0_s64x2 = vshlq_s64( corr_QC0_s64x2, lsh_s64x2 ); + corr_QC1_s64x2 = vshlq_s64( corr_QC1_s64x2, lsh_s64x2 ); + corr_s32x4 = vcombine_s32( vmovn_s64( corr_QC1_s64x2 ), vmovn_s64( corr_QC0_s64x2 ) ); + corr_s32x4 = vrev64q_s32( corr_s32x4 ); + vst1q_s32( corr + order - i - 3, corr_s32x4 ); + } + if( lsh >= 0 ) { + for( ; i < order + 1; i++ ) { + corr[ order - i ] = (opus_int32)silk_CHECK_FIT32( silk_LSHIFT64( corr_QCT[ i ], lsh ) ); + } + } else { + for( ; i < order + 1; i++ ) { + corr[ order - i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( corr_QCT[ i ], -lsh ) ); + } + } + silk_assert( corr_QCT[ order ] >= 0 ); /* If breaking, decrease QC*/ + RESTORE_STACK; + } + +#ifdef OPUS_CHECK_ASM + { + opus_int32 corr_c[ MAX_SHAPE_LPC_ORDER + 1 ]; + opus_int scale_c; + silk_warped_autocorrelation_FIX_c( corr_c, &scale_c, input, warping_Q16, length, order ); + silk_assert( !memcmp( corr_c, corr, sizeof( corr_c[ 0 ] ) * ( order + 1 ) ) ); + silk_assert( scale_c == *scale ); + } +#endif +} diff --git a/external/opus-1.0.3/silk/fixed/autocorr_FIX.c b/external/opus-1.3.1/silk/fixed/autocorr_FIX.c similarity index 64% rename from external/opus-1.0.3/silk/fixed/autocorr_FIX.c rename to external/opus-1.3.1/silk/fixed/autocorr_FIX.c index c2ebb6a9..de95c986 100644 --- a/external/opus-1.0.3/silk/fixed/autocorr_FIX.c +++ b/external/opus-1.3.1/silk/fixed/autocorr_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "SigProc_FIX.h" +#include "celt_lpc.h" /* Compute autocorrelation */ void silk_autocorr( @@ -37,40 +38,11 @@ void silk_autocorr( opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *inputData, /* I Input data to correlate */ const opus_int inputDataSize, /* I Length of input */ - const opus_int correlationCount /* I Number of correlation taps to compute */ + const opus_int correlationCount, /* I Number of correlation taps to compute */ + int arch /* I Run-time architecture */ ) { - opus_int i, lz, nRightShifts, corrCount; - opus_int64 corr64; - + opus_int corrCount; corrCount = silk_min_int( inputDataSize, correlationCount ); - - /* compute energy (zero-lag correlation) */ - corr64 = silk_inner_prod16_aligned_64( inputData, inputData, inputDataSize ); - - /* deal with all-zero input data */ - corr64 += 1; - - /* number of leading zeros */ - lz = silk_CLZ64( corr64 ); - - /* scaling: number of right shifts applied to correlations */ - nRightShifts = 35 - lz; - *scale = nRightShifts; - - if( nRightShifts <= 0 ) { - results[ 0 ] = silk_LSHIFT( (opus_int32)silk_CHECK_FIT32( corr64 ), -nRightShifts ); - - /* compute remaining correlations based on int32 inner product */ - for( i = 1; i < corrCount; i++ ) { - results[ i ] = silk_LSHIFT( silk_inner_prod_aligned( inputData, inputData + i, inputDataSize - i ), -nRightShifts ); - } - } else { - results[ 0 ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( corr64, nRightShifts ) ); - - /* compute remaining correlations based on int64 inner product */ - for( i = 1; i < corrCount; i++ ) { - results[ i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( silk_inner_prod16_aligned_64( inputData, inputData + i, inputDataSize - i ), nRightShifts ) ); - } - } + *scale = _celt_autocorr(inputData, results, NULL, 0, corrCount-1, inputDataSize, arch); } diff --git a/external/opus-1.0.3/silk/fixed/burg_modified_FIX.c b/external/opus-1.3.1/silk/fixed/burg_modified_FIX.c similarity index 85% rename from external/opus-1.0.3/silk/fixed/burg_modified_FIX.c rename to external/opus-1.3.1/silk/fixed/burg_modified_FIX.c index c729ef82..274d4b28 100644 --- a/external/opus-1.0.3/silk/fixed/burg_modified_FIX.c +++ b/external/opus-1.3.1/silk/fixed/burg_modified_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -32,16 +32,17 @@ POSSIBILITY OF SUCH DAMAGE. #include "SigProc_FIX.h" #include "define.h" #include "tuning_parameters.h" +#include "pitch.h" #define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384 */ #define QA 25 -#define N_BITS_HEAD_ROOM 2 +#define N_BITS_HEAD_ROOM 3 #define MIN_RSHIFTS -16 #define MAX_RSHIFTS (32 - QA) /* Compute reflection coefficients from input signal */ -void silk_burg_modified( +void silk_burg_modified_c( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ @@ -49,10 +50,11 @@ void silk_burg_modified( const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I Number of subframes stacked in x */ - const opus_int D /* I Order */ + const opus_int D, /* I Order */ + int arch /* I Run-time architecture */ ) { - opus_int k, n, s, lz, rshifts, rshifts_extra, reached_max_gain; + opus_int k, n, s, lz, rshifts, reached_max_gain; opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2; const opus_int16 *x_ptr; opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ]; @@ -60,27 +62,24 @@ void silk_burg_modified( opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ]; opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ]; opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ]; + opus_int32 xcorr[ SILK_MAX_ORDER_LPC ]; + opus_int64 C0_64; - silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); + celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); /* Compute autocorrelations, added over subframes */ - silk_sum_sqr_shift( &C0, &rshifts, x, nb_subfr * subfr_length ); - if( rshifts > MAX_RSHIFTS ) { - C0 = silk_LSHIFT32( C0, rshifts - MAX_RSHIFTS ); - silk_assert( C0 > 0 ); - rshifts = MAX_RSHIFTS; + C0_64 = silk_inner_prod16_aligned_64( x, x, subfr_length*nb_subfr, arch ); + lz = silk_CLZ64(C0_64); + rshifts = 32 + 1 + N_BITS_HEAD_ROOM - lz; + if (rshifts > MAX_RSHIFTS) rshifts = MAX_RSHIFTS; + if (rshifts < MIN_RSHIFTS) rshifts = MIN_RSHIFTS; + + if (rshifts > 0) { + C0 = (opus_int32)silk_RSHIFT64(C0_64, rshifts ); } else { - lz = silk_CLZ32( C0 ) - 1; - rshifts_extra = N_BITS_HEAD_ROOM - lz; - if( rshifts_extra > 0 ) { - rshifts_extra = silk_min( rshifts_extra, MAX_RSHIFTS - rshifts ); - C0 = silk_RSHIFT32( C0, rshifts_extra ); - } else { - rshifts_extra = silk_max( rshifts_extra, MIN_RSHIFTS - rshifts ); - C0 = silk_LSHIFT32( C0, -rshifts_extra ); - } - rshifts += rshifts_extra; + C0 = silk_LSHIFT32((opus_int32)C0_64, -rshifts ); } + CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ silk_memset( C_first_row, 0, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); if( rshifts > 0 ) { @@ -88,15 +87,22 @@ void silk_burg_modified( x_ptr = x + s * subfr_length; for( n = 1; n < D + 1; n++ ) { C_first_row[ n - 1 ] += (opus_int32)silk_RSHIFT64( - silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n ), rshifts ); + silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n, arch ), rshifts ); } } } else { for( s = 0; s < nb_subfr; s++ ) { + int i; + opus_int32 d; x_ptr = x + s * subfr_length; + celt_pitch_xcorr(x_ptr, x_ptr + 1, xcorr, subfr_length - D, D, arch ); for( n = 1; n < D + 1; n++ ) { - C_first_row[ n - 1 ] += silk_LSHIFT32( - silk_inner_prod_aligned( x_ptr, x_ptr + n, subfr_length - n ), -rshifts ); + for ( i = n + subfr_length - D, d = 0; i < subfr_length; i++ ) + d = MAC16_16( d, x_ptr[ i ], x_ptr[ i - n ] ); + xcorr[ n - 1 ] += d; + } + for( n = 1; n < D + 1; n++ ) { + C_first_row[ n - 1 ] += silk_LSHIFT32( xcorr[ n - 1 ], -rshifts ); } } } @@ -144,8 +150,11 @@ void silk_burg_modified( C_first_row[ k ] = silk_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ C_last_row[ k ] = silk_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); /* Q17 */ - tmp1 = silk_MLA( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); /* Q17 */ - tmp2 = silk_MLA( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); /* Q17 */ + /* We sometimes have get overflows in the multiplications (even beyond +/- 2^32), + but they cancel each other and the real result seems to always fit in a 32-bit + signed integer. This was determined experimentally, not theoretically (unfortunately). */ + tmp1 = silk_MLA_ovflw( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); /* Q17 */ + tmp2 = silk_MLA_ovflw( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); /* Q17 */ } tmp1 = -tmp1; /* Q17 */ tmp2 = -tmp2; /* Q17 */ @@ -194,12 +203,14 @@ void silk_burg_modified( /* Max prediction gain exceeded; set reflection coefficient such that max prediction gain is exactly hit */ tmp2 = ( (opus_int32)1 << 30 ) - silk_DIV32_varQ( minInvGain_Q30, invGain_Q30, 30 ); /* Q30 */ rc_Q31 = silk_SQRT_APPROX( tmp2 ); /* Q15 */ - /* Newton-Raphson iteration */ - rc_Q31 = silk_RSHIFT32( rc_Q31 + silk_DIV32( tmp2, rc_Q31 ), 1 ); /* Q15 */ - rc_Q31 = silk_LSHIFT32( rc_Q31, 16 ); /* Q31 */ - if( num < 0 ) { - /* Ensure adjusted reflection coefficients has the original sign */ - rc_Q31 = -rc_Q31; + if( rc_Q31 > 0 ) { + /* Newton-Raphson iteration */ + rc_Q31 = silk_RSHIFT32( rc_Q31 + silk_DIV32( tmp2, rc_Q31 ), 1 ); /* Q15 */ + rc_Q31 = silk_LSHIFT32( rc_Q31, 16 ); /* Q31 */ + if( num < 0 ) { + /* Ensure adjusted reflection coefficients has the original sign */ + rc_Q31 = -rc_Q31; + } } invGain_Q30 = minInvGain_Q30; reached_max_gain = 1; @@ -242,12 +253,12 @@ void silk_burg_modified( if( rshifts > 0 ) { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; - C0 -= (opus_int32)silk_RSHIFT64( silk_inner_prod16_aligned_64( x_ptr, x_ptr, D ), rshifts ); + C0 -= (opus_int32)silk_RSHIFT64( silk_inner_prod16_aligned_64( x_ptr, x_ptr, D, arch ), rshifts ); } } else { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; - C0 -= silk_LSHIFT32( silk_inner_prod_aligned( x_ptr, x_ptr, D ), -rshifts ); + C0 -= silk_LSHIFT32( silk_inner_prod_aligned( x_ptr, x_ptr, D, arch), -rshifts); } } /* Approximate residual energy */ @@ -265,5 +276,5 @@ void silk_burg_modified( } *res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */ *res_nrg_Q = -rshifts; - } + } } diff --git a/external/opus-1.0.3/silk/fixed/corrMatrix_FIX.c b/external/opus-1.3.1/silk/fixed/corrMatrix_FIX.c similarity index 83% rename from external/opus-1.0.3/silk/fixed/corrMatrix_FIX.c rename to external/opus-1.3.1/silk/fixed/corrMatrix_FIX.c index 21502499..1b4a29c2 100644 --- a/external/opus-1.0.3/silk/fixed/corrMatrix_FIX.c +++ b/external/opus-1.3.1/silk/fixed/corrMatrix_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -42,7 +42,8 @@ void silk_corrVector_FIX( const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ opus_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */ - const opus_int rshifts /* I Right shifts of correlations */ + const opus_int rshifts, /* I Right shifts of correlations */ + int arch /* I Run-time architecture */ ) { opus_int lag, i; @@ -57,7 +58,7 @@ void silk_corrVector_FIX( for( lag = 0; lag < order; lag++ ) { inner_prod = 0; for( i = 0; i < L; i++ ) { - inner_prod += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts ); + inner_prod = silk_ADD_RSHIFT32( inner_prod, silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts ); } Xt[ lag ] = inner_prod; /* X[:,lag]'*t */ ptr1--; /* Go to next column of X */ @@ -65,7 +66,7 @@ void silk_corrVector_FIX( } else { silk_assert( rshifts == 0 ); for( lag = 0; lag < order; lag++ ) { - Xt[ lag ] = silk_inner_prod_aligned( ptr1, ptr2, L ); /* X[:,lag]'*t */ + Xt[ lag ] = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); /* X[:,lag]'*t */ ptr1--; /* Go to next column of X */ } } @@ -76,60 +77,54 @@ void silk_corrMatrix_FIX( const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ - const opus_int head_room, /* I Desired headroom */ opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ - opus_int *rshifts /* I/O Right shifts of correlations */ + opus_int32 *nrg, /* O Energy of x vector */ + opus_int *rshifts, /* O Right shifts of correlations and energy */ + int arch /* I Run-time architecture */ ) { - opus_int i, j, lag, rshifts_local, head_room_rshifts; + opus_int i, j, lag; opus_int32 energy; const opus_int16 *ptr1, *ptr2; /* Calculate energy to find shift used to fit in 32 bits */ - silk_sum_sqr_shift( &energy, &rshifts_local, x, L + order - 1 ); - /* Add shifts to get the desired head room */ - head_room_rshifts = silk_max( head_room - silk_CLZ32( energy ), 0 ); - - energy = silk_RSHIFT32( energy, head_room_rshifts ); - rshifts_local += head_room_rshifts; + silk_sum_sqr_shift( nrg, rshifts, x, L + order - 1 ); + energy = *nrg; /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */ /* Remove contribution of first order - 1 samples */ for( i = 0; i < order - 1; i++ ) { - energy -= silk_RSHIFT32( silk_SMULBB( x[ i ], x[ i ] ), rshifts_local ); - } - if( rshifts_local < *rshifts ) { - /* Adjust energy */ - energy = silk_RSHIFT32( energy, *rshifts - rshifts_local ); - rshifts_local = *rshifts; + energy -= silk_RSHIFT32( silk_SMULBB( x[ i ], x[ i ] ), *rshifts ); } /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */ /* Fill out the diagonal of the correlation matrix */ matrix_ptr( XX, 0, 0, order ) = energy; + silk_assert( energy >= 0 ); ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */ for( j = 1; j < order; j++ ) { - energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), rshifts_local ) ); - energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr1[ -j ] ), rshifts_local ) ); + energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), *rshifts ) ); + energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr1[ -j ] ), *rshifts ) ); matrix_ptr( XX, j, j, order ) = energy; + silk_assert( energy >= 0 ); } ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */ /* Calculate the remaining elements of the correlation matrix */ - if( rshifts_local > 0 ) { + if( *rshifts > 0 ) { /* Right shifting used */ for( lag = 1; lag < order; lag++ ) { /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ energy = 0; for( i = 0; i < L; i++ ) { - energy += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts_local ); + energy += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), *rshifts ); } /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ matrix_ptr( XX, lag, 0, order ) = energy; matrix_ptr( XX, 0, lag, order ) = energy; for( j = 1; j < ( order - lag ); j++ ) { - energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), rshifts_local ) ); - energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr2[ -j ] ), rshifts_local ) ); + energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), *rshifts ) ); + energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr2[ -j ] ), *rshifts ) ); matrix_ptr( XX, lag + j, j, order ) = energy; matrix_ptr( XX, j, lag + j, order ) = energy; } @@ -138,7 +133,7 @@ void silk_corrMatrix_FIX( } else { for( lag = 1; lag < order; lag++ ) { /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ - energy = silk_inner_prod_aligned( ptr1, ptr2, L ); + energy = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); matrix_ptr( XX, lag, 0, order ) = energy; matrix_ptr( XX, 0, lag, order ) = energy; /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ @@ -151,6 +146,5 @@ void silk_corrMatrix_FIX( ptr2--;/* Update pointer to first sample of next column (lag) in X */ } } - *rshifts = rshifts_local; } diff --git a/external/opus-1.0.3/silk/fixed/encode_frame_FIX.c b/external/opus-1.3.1/silk/fixed/encode_frame_FIX.c similarity index 75% rename from external/opus-1.0.3/silk/fixed/encode_frame_FIX.c rename to external/opus-1.3.1/silk/fixed/encode_frame_FIX.c index a37a9f21..a02bf87d 100644 --- a/external/opus-1.0.3/silk/fixed/encode_frame_FIX.c +++ b/external/opus-1.3.1/silk/fixed/encode_frame_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -29,33 +29,42 @@ POSSIBILITY OF SUCH DAMAGE. #include "config.h" #endif +#include #include "main_FIX.h" +#include "stack_alloc.h" #include "tuning_parameters.h" /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */ -static inline void silk_LBRR_encode_FIX( +static OPUS_INLINE void silk_LBRR_encode_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ - const opus_int32 xfw_Q3[], /* I Input signal */ + const opus_int16 x16[], /* I Input signal */ opus_int condCoding /* I The type of conditional coding used so far for this frame */ ); void silk_encode_do_VAD_FIX( - silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ + silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ + opus_int activity /* I Decision of Opus voice activity detector */ ) { + const opus_int activity_threshold = SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ); + /****************************/ /* Voice Activity Detection */ /****************************/ - silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1 ); + silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.arch ); + /* If Opus VAD is inactive and Silk VAD is active: lower Silk VAD to just under the threshold */ + if( activity == VAD_NO_ACTIVITY && psEnc->sCmn.speech_activity_Q8 >= activity_threshold ) { + psEnc->sCmn.speech_activity_Q8 = activity_threshold - 1; + } /**************************************************/ /* Convert speech activity into VAD and DTX flags */ /**************************************************/ - if( psEnc->sCmn.speech_activity_Q8 < SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { + if( psEnc->sCmn.speech_activity_Q8 < activity_threshold ) { psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.noSpeechCounter++; - if( psEnc->sCmn.noSpeechCounter < NB_SPEECH_FRAMES_BEFORE_DTX ) { + if( psEnc->sCmn.noSpeechCounter <= NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.inDTX = 0; } else if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX + NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.noSpeechCounter = NB_SPEECH_FRAMES_BEFORE_DTX; @@ -84,9 +93,7 @@ opus_int silk_encode_frame_FIX( { silk_encoder_control_FIX sEncCtrl; opus_int i, iter, maxIter, found_upper, found_lower, ret = 0; - opus_int16 *x_frame, *res_pitch_frame; - opus_int32 xfw_Q3[ MAX_FRAME_LENGTH ]; - opus_int16 res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ]; + opus_int16 *x_frame; ec_enc sRangeEnc_copy, sRangeEnc_copy2; silk_nsq_state sNSQ_copy, sNSQ_copy2; opus_int32 seed_copy, nBits, nBits_lower, nBits_upper, gainMult_lower, gainMult_upper; @@ -95,7 +102,10 @@ opus_int silk_encode_frame_FIX( opus_int16 ec_prevLagIndex_copy; opus_int ec_prevSignalType_copy; opus_int8 LastGainIndex_copy2; - opus_uint8 ec_buf_copy[ 1275 ]; + opus_int gain_lock[ MAX_NB_SUBFR ] = {0}; + opus_int16 best_gain_mult[ MAX_NB_SUBFR ]; + opus_int best_sum[ MAX_NB_SUBFR ]; + SAVE_STACK; /* This is totally unnecessary but many compilers (including gcc) are too dumb to realise it */ LastGainIndex_copy2 = nBits_lower = nBits_upper = gainMult_lower = gainMult_upper = 0; @@ -105,9 +115,8 @@ opus_int silk_encode_frame_FIX( /**************************************************************/ /* Set up Input Pointers, and insert frame in input buffer */ /*************************************************************/ - /* pointers aligned with start of frame to encode */ - x_frame = psEnc->x_buf + psEnc->sCmn.ltp_mem_length; /* start of frame to encode */ - res_pitch_frame = res_pitch + psEnc->sCmn.ltp_mem_length; /* start of pitch LPC residual frame */ + /* start of frame to encode */ + x_frame = psEnc->x_buf + psEnc->sCmn.ltp_mem_length; /***************************************/ /* Ensure smooth bandwidth transitions */ @@ -120,35 +129,40 @@ opus_int silk_encode_frame_FIX( silk_memcpy( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length * sizeof( opus_int16 ) ); if( !psEnc->sCmn.prefillFlag ) { + VARDECL( opus_int16, res_pitch ); + VARDECL( opus_uint8, ec_buf_copy ); + opus_int16 *res_pitch_frame; + + ALLOC( res_pitch, + psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + + psEnc->sCmn.ltp_mem_length, opus_int16 ); + /* start of pitch LPC residual frame */ + res_pitch_frame = res_pitch + psEnc->sCmn.ltp_mem_length; + /*****************************************/ /* Find pitch lags, initial LPC analysis */ /*****************************************/ - silk_find_pitch_lags_FIX( psEnc, &sEncCtrl, res_pitch, x_frame ); + silk_find_pitch_lags_FIX( psEnc, &sEncCtrl, res_pitch, x_frame - psEnc->sCmn.ltp_mem_length, psEnc->sCmn.arch ); /************************/ /* Noise shape analysis */ /************************/ - silk_noise_shape_analysis_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame ); + silk_noise_shape_analysis_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame, psEnc->sCmn.arch ); /***************************************************/ /* Find linear prediction coefficients (LPC + LTP) */ /***************************************************/ - silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch, x_frame, condCoding ); + silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame, condCoding ); /****************************************/ /* Process gains */ /****************************************/ silk_process_gains_FIX( psEnc, &sEncCtrl, condCoding ); - /*****************************************/ - /* Prefiltering for noise shaper */ - /*****************************************/ - silk_prefilter_FIX( psEnc, &sEncCtrl, xfw_Q3, x_frame ); - /****************************************/ /* Low Bitrate Redundant Encoding */ /****************************************/ - silk_LBRR_encode_FIX( psEnc, &sEncCtrl, xfw_Q3, condCoding ); + silk_LBRR_encode_FIX( psEnc, &sEncCtrl, x_frame, condCoding ); /* Loop over quantizer and entropy coding to control bitrate */ maxIter = 6; @@ -164,6 +178,7 @@ opus_int silk_encode_frame_FIX( seed_copy = psEnc->sCmn.indices.Seed; ec_prevLagIndex_copy = psEnc->sCmn.ec_prevLagIndex; ec_prevSignalType_copy = psEnc->sCmn.ec_prevSignalType; + ALLOC( ec_buf_copy, 1275, opus_uint8 ); for( iter = 0; ; iter++ ) { if( gainsID == gainsID_lower ) { nBits = nBits_lower; @@ -183,13 +198,19 @@ opus_int silk_encode_frame_FIX( /* Noise shaping quantization */ /*****************************************/ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { - silk_NSQ_del_dec( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, xfw_Q3, psEnc->sCmn.pulses, - sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14, - sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14 ); + silk_NSQ_del_dec( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, x_frame, psEnc->sCmn.pulses, + sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR_Q13, sEncCtrl.HarmShapeGain_Q14, + sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14, + psEnc->sCmn.arch ); } else { - silk_NSQ( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, xfw_Q3, psEnc->sCmn.pulses, - sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14, - sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14 ); + silk_NSQ( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, x_frame, psEnc->sCmn.pulses, + sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR_Q13, sEncCtrl.HarmShapeGain_Q14, + sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14, + psEnc->sCmn.arch); + } + + if ( iter == maxIter && !found_lower ) { + silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); } /****************************************/ @@ -205,6 +226,33 @@ opus_int silk_encode_frame_FIX( nBits = ec_tell( psRangeEnc ); + /* If we still bust after the last iteration, do some damage control. */ + if ( iter == maxIter && !found_lower && nBits > maxBits ) { + silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); + + /* Keep gains the same as the last frame. */ + psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; + for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { + psEnc->sCmn.indices.GainsIndices[ i ] = 4; + } + if (condCoding != CODE_CONDITIONALLY) { + psEnc->sCmn.indices.GainsIndices[ 0 ] = sEncCtrl.lastGainIndexPrev; + } + psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; + psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; + /* Clear all pulses. */ + for ( i = 0; i < psEnc->sCmn.frame_length; i++ ) { + psEnc->sCmn.pulses[ i ] = 0; + } + + silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); + + silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, + psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); + + nBits = ec_tell( psRangeEnc ); + } + if( useCBR == 0 && iter == 0 && nBits <= maxBits ) { break; } @@ -214,7 +262,7 @@ opus_int silk_encode_frame_FIX( if( found_lower && ( gainsID == gainsID_lower || nBits > maxBits ) ) { /* Restore output state from earlier iteration that did meet the bitrate budget */ silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); - silk_assert( sRangeEnc_copy2.offs <= 1275 ); + celt_assert( sRangeEnc_copy2.offs <= 1275 ); silk_memcpy( psRangeEnc->buf, ec_buf_copy, sRangeEnc_copy2.offs ); silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy2, sizeof( silk_nsq_state ) ); psEnc->sShape.LastGainIndex = LastGainIndex_copy2; @@ -242,7 +290,7 @@ opus_int silk_encode_frame_FIX( gainsID_lower = gainsID; /* Copy part of the output state */ silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); - silk_assert( psRangeEnc->offs <= 1275 ); + celt_assert( psRangeEnc->offs <= 1275 ); silk_memcpy( ec_buf_copy, psRangeEnc->buf, psRangeEnc->offs ); silk_memcpy( &sNSQ_copy2, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); LastGainIndex_copy2 = psEnc->sShape.LastGainIndex; @@ -252,15 +300,35 @@ opus_int silk_encode_frame_FIX( break; } + if ( !found_lower && nBits > maxBits ) { + int j; + for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { + int sum=0; + for ( j = i*psEnc->sCmn.subfr_length; j < (i+1)*psEnc->sCmn.subfr_length; j++ ) { + sum += abs( psEnc->sCmn.pulses[j] ); + } + if ( iter == 0 || (sum < best_sum[i] && !gain_lock[i]) ) { + best_sum[i] = sum; + best_gain_mult[i] = gainMult_Q8; + } else { + gain_lock[i] = 1; + } + } + } if( ( found_lower & found_upper ) == 0 ) { /* Adjust gain according to high-rate rate/distortion curve */ - opus_int32 gain_factor_Q16; - gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); - gain_factor_Q16 = silk_min_32( gain_factor_Q16, SILK_FIX_CONST( 2, 16 ) ); if( nBits > maxBits ) { - gain_factor_Q16 = silk_max_32( gain_factor_Q16, SILK_FIX_CONST( 1.3, 16 ) ); + if (gainMult_Q8 < 16384) { + gainMult_Q8 *= 2; + } else { + gainMult_Q8 = 32767; + } + } else { + opus_int32 gain_factor_Q16; + gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); + gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); } - gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); + } else { /* Adjust gain by interpolating */ gainMult_Q8 = gainMult_lower + silk_DIV32_16( silk_MUL( gainMult_upper - gainMult_lower, maxBits - nBits_lower ), nBits_upper - nBits_lower ); @@ -274,9 +342,15 @@ opus_int silk_encode_frame_FIX( } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - sEncCtrl.Gains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], gainMult_Q8 ), 8 ); + opus_int16 tmp; + if ( gain_lock[i] ) { + tmp = best_gain_mult[i]; + } else { + tmp = gainMult_Q8; + } + sEncCtrl.Gains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], tmp ), 8 ); } - + /* Quantize gains */ psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; silk_gains_quant( psEnc->sCmn.indices.GainsIndices, sEncCtrl.Gains_Q16, @@ -291,17 +365,18 @@ opus_int silk_encode_frame_FIX( silk_memmove( psEnc->x_buf, &psEnc->x_buf[ psEnc->sCmn.frame_length ], ( psEnc->sCmn.ltp_mem_length + LA_SHAPE_MS * psEnc->sCmn.fs_kHz ) * sizeof( opus_int16 ) ); - /* Parameters needed for next frame */ - psEnc->sCmn.prevLag = sEncCtrl.pitchL[ psEnc->sCmn.nb_subfr - 1 ]; - psEnc->sCmn.prevSignalType = psEnc->sCmn.indices.signalType; - /* Exit without entropy coding */ if( psEnc->sCmn.prefillFlag ) { /* No payload */ *pnBytesOut = 0; + RESTORE_STACK; return ret; } + /* Parameters needed for next frame */ + psEnc->sCmn.prevLag = sEncCtrl.pitchL[ psEnc->sCmn.nb_subfr - 1 ]; + psEnc->sCmn.prevSignalType = psEnc->sCmn.indices.signalType; + /****************************************/ /* Finalize payload */ /****************************************/ @@ -309,14 +384,15 @@ opus_int silk_encode_frame_FIX( /* Payload size */ *pnBytesOut = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 ); + RESTORE_STACK; return ret; } /* Low-Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode excitation at lower bitrate */ -static inline void silk_LBRR_encode_FIX( +static OPUS_INLINE void silk_LBRR_encode_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ - const opus_int32 xfw_Q3[], /* I Input signal */ + const opus_int16 x16[], /* I Input signal */ opus_int condCoding /* I The type of conditional coding used so far for this frame */ ) { @@ -355,15 +431,15 @@ static inline void silk_LBRR_encode_FIX( /* Noise shaping quantization */ /*****************************************/ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { - silk_NSQ_del_dec( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, xfw_Q3, + silk_NSQ_del_dec( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, x16, psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesEncoded ], psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, - psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, - psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 ); + psEncCtrl->AR_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, + psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14, psEnc->sCmn.arch ); } else { - silk_NSQ( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, xfw_Q3, + silk_NSQ( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, x16, psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesEncoded ], psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, - psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, - psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 ); + psEncCtrl->AR_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, + psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14, psEnc->sCmn.arch ); } /* Restore original gains */ diff --git a/external/opus-1.0.3/silk/fixed/find_LPC_FIX.c b/external/opus-1.3.1/silk/fixed/find_LPC_FIX.c similarity index 94% rename from external/opus-1.0.3/silk/fixed/find_LPC_FIX.c rename to external/opus-1.3.1/silk/fixed/find_LPC_FIX.c index 0ed7e846..c762a0f2 100644 --- a/external/opus-1.0.3/silk/fixed/find_LPC_FIX.c +++ b/external/opus-1.3.1/silk/fixed/find_LPC_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main_FIX.h" +#include "stack_alloc.h" #include "tuning_parameters.h" /* Finds LPC vector from correlations, and converts to NLSF */ @@ -51,7 +52,7 @@ void silk_find_LPC_FIX( opus_int res_nrg_interp_Q, res_nrg_Q, res_tmp_nrg_Q; opus_int16 a_tmp_Q12[ MAX_LPC_ORDER ]; opus_int16 NLSF0_Q15[ MAX_LPC_ORDER ]; - opus_int16 LPC_res[ MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ]; + SAVE_STACK; subfr_length = psEncC->subfr_length + psEncC->predictLPCOrder; @@ -59,11 +60,13 @@ void silk_find_LPC_FIX( psEncC->indices.NLSFInterpCoef_Q2 = 4; /* Burg AR analysis for the full frame */ - silk_burg_modified( &res_nrg, &res_nrg_Q, a_Q16, x, minInvGain_Q30, subfr_length, psEncC->nb_subfr, psEncC->predictLPCOrder ); + silk_burg_modified( &res_nrg, &res_nrg_Q, a_Q16, x, minInvGain_Q30, subfr_length, psEncC->nb_subfr, psEncC->predictLPCOrder, psEncC->arch ); if( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) { + VARDECL( opus_int16, LPC_res ); + /* Optimal solution for last 10 ms */ - silk_burg_modified( &res_tmp_nrg, &res_tmp_nrg_Q, a_tmp_Q16, x + 2 * subfr_length, minInvGain_Q30, subfr_length, 2, psEncC->predictLPCOrder ); + silk_burg_modified( &res_tmp_nrg, &res_tmp_nrg_Q, a_tmp_Q16, x + 2 * subfr_length, minInvGain_Q30, subfr_length, 2, psEncC->predictLPCOrder, psEncC->arch ); /* subtract residual energy here, as that's easier than adding it to the */ /* residual energy of the first 10 ms in each iteration of the search below */ @@ -81,16 +84,18 @@ void silk_find_LPC_FIX( /* Convert to NLSFs */ silk_A2NLSF( NLSF_Q15, a_tmp_Q16, psEncC->predictLPCOrder ); + ALLOC( LPC_res, 2 * subfr_length, opus_int16 ); + /* Search over interpolation indices to find the one with lowest residual energy */ for( k = 3; k >= 0; k-- ) { /* Interpolate NLSFs for first half */ silk_interpolate( NLSF0_Q15, psEncC->prev_NLSFq_Q15, NLSF_Q15, k, psEncC->predictLPCOrder ); /* Convert to LPC for residual energy evaluation */ - silk_NLSF2A( a_tmp_Q12, NLSF0_Q15, psEncC->predictLPCOrder ); + silk_NLSF2A( a_tmp_Q12, NLSF0_Q15, psEncC->predictLPCOrder, psEncC->arch ); /* Calculate residual energy with NLSF interpolation */ - silk_LPC_analysis_filter( LPC_res, x, a_tmp_Q12, 2 * subfr_length, psEncC->predictLPCOrder ); + silk_LPC_analysis_filter( LPC_res, x, a_tmp_Q12, 2 * subfr_length, psEncC->predictLPCOrder, psEncC->arch ); silk_sum_sqr_shift( &res_nrg0, &rshift0, LPC_res + psEncC->predictLPCOrder, subfr_length - psEncC->predictLPCOrder ); silk_sum_sqr_shift( &res_nrg1, &rshift1, LPC_res + psEncC->predictLPCOrder + subfr_length, subfr_length - psEncC->predictLPCOrder ); @@ -141,5 +146,6 @@ void silk_find_LPC_FIX( silk_A2NLSF( NLSF_Q15, a_Q16, psEncC->predictLPCOrder ); } - silk_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); + celt_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); + RESTORE_STACK; } diff --git a/external/opus-1.3.1/silk/fixed/find_LTP_FIX.c b/external/opus-1.3.1/silk/fixed/find_LTP_FIX.c new file mode 100644 index 00000000..62d4afb2 --- /dev/null +++ b/external/opus-1.3.1/silk/fixed/find_LTP_FIX.c @@ -0,0 +1,99 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FIX.h" +#include "tuning_parameters.h" + +void silk_find_LTP_FIX( + opus_int32 XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Correlation matrix */ + opus_int32 xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ], /* O Correlation vector */ + const opus_int16 r_ptr[], /* I Residual signal after LPC */ + const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ + const opus_int subfr_length, /* I Subframe length */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ +) +{ + opus_int i, k, extra_shifts; + opus_int xx_shifts, xX_shifts, XX_shifts; + const opus_int16 *lag_ptr; + opus_int32 *XXLTP_Q17_ptr, *xXLTP_Q17_ptr; + opus_int32 xx, nrg, temp; + + xXLTP_Q17_ptr = xXLTP_Q17; + XXLTP_Q17_ptr = XXLTP_Q17; + for( k = 0; k < nb_subfr; k++ ) { + lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); + + silk_sum_sqr_shift( &xx, &xx_shifts, r_ptr, subfr_length + LTP_ORDER ); /* xx in Q( -xx_shifts ) */ + silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, XXLTP_Q17_ptr, &nrg, &XX_shifts, arch ); /* XXLTP_Q17_ptr and nrg in Q( -XX_shifts ) */ + extra_shifts = xx_shifts - XX_shifts; + if( extra_shifts > 0 ) { + /* Shift XX */ + xX_shifts = xx_shifts; + for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { + XXLTP_Q17_ptr[ i ] = silk_RSHIFT32( XXLTP_Q17_ptr[ i ], extra_shifts ); /* Q( -xX_shifts ) */ + } + nrg = silk_RSHIFT32( nrg, extra_shifts ); /* Q( -xX_shifts ) */ + } else if( extra_shifts < 0 ) { + /* Shift xx */ + xX_shifts = XX_shifts; + xx = silk_RSHIFT32( xx, -extra_shifts ); /* Q( -xX_shifts ) */ + } else { + xX_shifts = xx_shifts; + } + silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, xXLTP_Q17_ptr, xX_shifts, arch ); /* xXLTP_Q17_ptr in Q( -xX_shifts ) */ + + /* At this point all correlations are in Q(-xX_shifts) */ + temp = silk_SMLAWB( 1, nrg, SILK_FIX_CONST( LTP_CORR_INV_MAX, 16 ) ); + temp = silk_max( temp, xx ); +TIC(div) +#if 0 + for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { + XXLTP_Q17_ptr[ i ] = silk_DIV32_varQ( XXLTP_Q17_ptr[ i ], temp, 17 ); + } + for( i = 0; i < LTP_ORDER; i++ ) { + xXLTP_Q17_ptr[ i ] = silk_DIV32_varQ( xXLTP_Q17_ptr[ i ], temp, 17 ); + } +#else + for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { + XXLTP_Q17_ptr[ i ] = (opus_int32)( silk_LSHIFT64( (opus_int64)XXLTP_Q17_ptr[ i ], 17 ) / temp ); + } + for( i = 0; i < LTP_ORDER; i++ ) { + xXLTP_Q17_ptr[ i ] = (opus_int32)( silk_LSHIFT64( (opus_int64)xXLTP_Q17_ptr[ i ], 17 ) / temp ); + } +#endif +TOC(div) + r_ptr += subfr_length; + XXLTP_Q17_ptr += LTP_ORDER * LTP_ORDER; + xXLTP_Q17_ptr += LTP_ORDER; + } +} diff --git a/external/opus-1.0.3/silk/fixed/find_pitch_lags_FIX.c b/external/opus-1.3.1/silk/fixed/find_pitch_lags_FIX.c similarity index 73% rename from external/opus-1.0.3/silk/fixed/find_pitch_lags_FIX.c rename to external/opus-1.3.1/silk/fixed/find_pitch_lags_FIX.c index 39c30487..6c3379f2 100644 --- a/external/opus-1.0.3/silk/fixed/find_pitch_lags_FIX.c +++ b/external/opus-1.3.1/silk/fixed/find_pitch_lags_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main_FIX.h" +#include "stack_alloc.h" #include "tuning_parameters.h" /* Find pitch lags */ @@ -37,17 +38,20 @@ void silk_find_pitch_lags_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ opus_int16 res[], /* O residual */ - const opus_int16 x[] /* I Speech signal */ + const opus_int16 x[], /* I Speech signal */ + int arch /* I Run-time architecture */ ) { opus_int buf_len, i, scale; - opus_int32 thrhld_Q15, res_nrg; - const opus_int16 *x_buf, *x_buf_ptr; - opus_int16 Wsig[ FIND_PITCH_LPC_WIN_MAX ], *Wsig_ptr; + opus_int32 thrhld_Q13, res_nrg; + const opus_int16 *x_ptr; + VARDECL( opus_int16, Wsig ); + opus_int16 *Wsig_ptr; opus_int32 auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ]; opus_int16 rc_Q15[ MAX_FIND_PITCH_LPC_ORDER ]; opus_int32 A_Q24[ MAX_FIND_PITCH_LPC_ORDER ]; opus_int16 A_Q12[ MAX_FIND_PITCH_LPC_ORDER ]; + SAVE_STACK; /******************************************/ /* Set up buffer lengths etc based on Fs */ @@ -55,9 +59,7 @@ void silk_find_pitch_lags_FIX( buf_len = psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length; /* Safety check */ - silk_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); - - x_buf = x - psEnc->sCmn.ltp_mem_length; + celt_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); /*************************************/ /* Estimate LPC AR coefficients */ @@ -65,23 +67,25 @@ void silk_find_pitch_lags_FIX( /* Calculate windowed signal */ + ALLOC( Wsig, psEnc->sCmn.pitch_LPC_win_length, opus_int16 ); + /* First LA_LTP samples */ - x_buf_ptr = x_buf + buf_len - psEnc->sCmn.pitch_LPC_win_length; + x_ptr = x + buf_len - psEnc->sCmn.pitch_LPC_win_length; Wsig_ptr = Wsig; - silk_apply_sine_window( Wsig_ptr, x_buf_ptr, 1, psEnc->sCmn.la_pitch ); + silk_apply_sine_window( Wsig_ptr, x_ptr, 1, psEnc->sCmn.la_pitch ); /* Middle un - windowed samples */ Wsig_ptr += psEnc->sCmn.la_pitch; - x_buf_ptr += psEnc->sCmn.la_pitch; - silk_memcpy( Wsig_ptr, x_buf_ptr, ( psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ) ) * sizeof( opus_int16 ) ); + x_ptr += psEnc->sCmn.la_pitch; + silk_memcpy( Wsig_ptr, x_ptr, ( psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ) ) * sizeof( opus_int16 ) ); /* Last LA_LTP samples */ Wsig_ptr += psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ); - x_buf_ptr += psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ); - silk_apply_sine_window( Wsig_ptr, x_buf_ptr, 2, psEnc->sCmn.la_pitch ); + x_ptr += psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ); + silk_apply_sine_window( Wsig_ptr, x_ptr, 2, psEnc->sCmn.la_pitch ); /* Calculate autocorrelation sequence */ - silk_autocorr( auto_corr, &scale, Wsig, psEnc->sCmn.pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1 ); + silk_autocorr( auto_corr, &scale, Wsig, psEnc->sCmn.pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1, arch ); /* Add white noise, as fraction of energy */ auto_corr[ 0 ] = silk_SMLAWB( auto_corr[ 0 ], auto_corr[ 0 ], SILK_FIX_CONST( FIND_PITCH_WHITE_NOISE_FRACTION, 16 ) ) + 1; @@ -106,23 +110,24 @@ void silk_find_pitch_lags_FIX( /*****************************************/ /* LPC analysis filtering */ /*****************************************/ - silk_LPC_analysis_filter( res, x_buf, A_Q12, buf_len, psEnc->sCmn.pitchEstimationLPCOrder ); + silk_LPC_analysis_filter( res, x, A_Q12, buf_len, psEnc->sCmn.pitchEstimationLPCOrder, psEnc->sCmn.arch ); if( psEnc->sCmn.indices.signalType != TYPE_NO_VOICE_ACTIVITY && psEnc->sCmn.first_frame_after_reset == 0 ) { /* Threshold for pitch estimator */ - thrhld_Q15 = SILK_FIX_CONST( 0.6, 15 ); - thrhld_Q15 = silk_SMLABB( thrhld_Q15, SILK_FIX_CONST( -0.004, 15 ), psEnc->sCmn.pitchEstimationLPCOrder ); - thrhld_Q15 = silk_SMLABB( thrhld_Q15, SILK_FIX_CONST( -0.1, 7 ), psEnc->sCmn.speech_activity_Q8 ); - thrhld_Q15 = silk_SMLABB( thrhld_Q15, SILK_FIX_CONST( -0.15, 15 ), silk_RSHIFT( psEnc->sCmn.prevSignalType, 1 ) ); - thrhld_Q15 = silk_SMLAWB( thrhld_Q15, SILK_FIX_CONST( -0.1, 16 ), psEnc->sCmn.input_tilt_Q15 ); - thrhld_Q15 = silk_SAT16( thrhld_Q15 ); + thrhld_Q13 = SILK_FIX_CONST( 0.6, 13 ); + thrhld_Q13 = silk_SMLABB( thrhld_Q13, SILK_FIX_CONST( -0.004, 13 ), psEnc->sCmn.pitchEstimationLPCOrder ); + thrhld_Q13 = silk_SMLAWB( thrhld_Q13, SILK_FIX_CONST( -0.1, 21 ), psEnc->sCmn.speech_activity_Q8 ); + thrhld_Q13 = silk_SMLABB( thrhld_Q13, SILK_FIX_CONST( -0.15, 13 ), silk_RSHIFT( psEnc->sCmn.prevSignalType, 1 ) ); + thrhld_Q13 = silk_SMLAWB( thrhld_Q13, SILK_FIX_CONST( -0.1, 14 ), psEnc->sCmn.input_tilt_Q15 ); + thrhld_Q13 = silk_SAT16( thrhld_Q13 ); /*****************************************/ /* Call pitch estimator */ /*****************************************/ if( silk_pitch_analysis_core( res, psEncCtrl->pitchL, &psEnc->sCmn.indices.lagIndex, &psEnc->sCmn.indices.contourIndex, &psEnc->LTPCorr_Q15, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16, - (opus_int16)thrhld_Q15, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr ) == 0 ) + (opus_int)thrhld_Q13, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr, + psEnc->sCmn.arch) == 0 ) { psEnc->sCmn.indices.signalType = TYPE_VOICED; } else { @@ -134,4 +139,5 @@ void silk_find_pitch_lags_FIX( psEnc->sCmn.indices.contourIndex = 0; psEnc->LTPCorr_Q15 = 0; } + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/fixed/find_pred_coefs_FIX.c b/external/opus-1.3.1/silk/fixed/find_pred_coefs_FIX.c similarity index 83% rename from external/opus-1.0.3/silk/fixed/find_pred_coefs_FIX.c rename to external/opus-1.3.1/silk/fixed/find_pred_coefs_FIX.c index 997989b5..606d8633 100644 --- a/external/opus-1.0.3/silk/fixed/find_pred_coefs_FIX.c +++ b/external/opus-1.3.1/silk/fixed/find_pred_coefs_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main_FIX.h" +#include "stack_alloc.h" void silk_find_pred_coefs_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ @@ -40,13 +41,13 @@ void silk_find_pred_coefs_FIX( ) { opus_int i; - opus_int32 WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; - opus_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ], Wght_Q15[ MAX_NB_SUBFR ]; + opus_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ]; opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]; const opus_int16 *x_ptr; - opus_int16 *x_pre_ptr, LPC_in_pre[ MAX_NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ]; - opus_int32 tmp, min_gain_Q16, minInvGain_Q30; - opus_int LTP_corrs_rshift[ MAX_NB_SUBFR ]; + opus_int16 *x_pre_ptr; + VARDECL( opus_int16, LPC_in_pre ); + opus_int32 min_gain_Q16, minInvGain_Q30; + SAVE_STACK; /* weighting for weighted least squares */ min_gain_Q16 = silk_int32_MAX >> 6; @@ -59,32 +60,38 @@ void silk_find_pred_coefs_FIX( /* Invert and normalize gains, and ensure that maximum invGains_Q16 is within range of a 16 bit int */ invGains_Q16[ i ] = silk_DIV32_varQ( min_gain_Q16, psEncCtrl->Gains_Q16[ i ], 16 - 2 ); - /* Ensure Wght_Q15 a minimum value 1 */ - invGains_Q16[ i ] = silk_max( invGains_Q16[ i ], 363 ); + /* Limit inverse */ + invGains_Q16[ i ] = silk_max( invGains_Q16[ i ], 100 ); /* Square the inverted gains */ silk_assert( invGains_Q16[ i ] == silk_SAT16( invGains_Q16[ i ] ) ); - tmp = silk_SMULWB( invGains_Q16[ i ], invGains_Q16[ i ] ); - Wght_Q15[ i ] = silk_RSHIFT( tmp, 1 ); /* Invert the inverted and normalized gains */ local_gains[ i ] = silk_DIV32( ( (opus_int32)1 << 16 ), invGains_Q16[ i ] ); } + ALLOC( LPC_in_pre, + psEnc->sCmn.nb_subfr * psEnc->sCmn.predictLPCOrder + + psEnc->sCmn.frame_length, opus_int16 ); if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + VARDECL( opus_int32, xXLTP_Q17 ); + VARDECL( opus_int32, XXLTP_Q17 ); + /**********/ /* VOICED */ /**********/ - silk_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); + celt_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); + + ALLOC( xXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER, opus_int32 ); + ALLOC( XXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER * LTP_ORDER, opus_int32 ); /* LTP analysis */ - silk_find_LTP_FIX( psEncCtrl->LTPCoef_Q14, WLTP, &psEncCtrl->LTPredCodGain_Q7, - res_pitch, psEncCtrl->pitchL, Wght_Q15, psEnc->sCmn.subfr_length, - psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length, LTP_corrs_rshift ); + silk_find_LTP_FIX( XXLTP_Q17, xXLTP_Q17, res_pitch, + psEncCtrl->pitchL, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); /* Quantize LTP gain parameters */ silk_quant_LTP_gains( psEncCtrl->LTPCoef_Q14, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, - WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr); + &psEnc->sCmn.sum_log_gain_Q7, &psEncCtrl->LTPredCodGain_Q7, XXLTP_Q17, xXLTP_Q17, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); /* Control LTP scaling */ silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl, condCoding ); @@ -109,15 +116,16 @@ void silk_find_pred_coefs_FIX( silk_memset( psEncCtrl->LTPCoef_Q14, 0, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( opus_int16 ) ); psEncCtrl->LTPredCodGain_Q7 = 0; + psEnc->sCmn.sum_log_gain_Q7 = 0; } /* Limit on total predictive coding gain */ if( psEnc->sCmn.first_frame_after_reset ) { minInvGain_Q30 = SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN_AFTER_RESET, 30 ); - } else { + } else { minInvGain_Q30 = silk_log2lin( silk_SMLAWB( 16 << 7, (opus_int32)psEncCtrl->LTPredCodGain_Q7, SILK_FIX_CONST( 1.0 / 3, 16 ) ) ); /* Q16 */ - minInvGain_Q30 = silk_DIV32_varQ( minInvGain_Q30, - silk_SMULWW( SILK_FIX_CONST( MAX_PREDICTION_POWER_GAIN, 0 ), + minInvGain_Q30 = silk_DIV32_varQ( minInvGain_Q30, + silk_SMULWW( SILK_FIX_CONST( MAX_PREDICTION_POWER_GAIN, 0 ), silk_SMLAWB( SILK_FIX_CONST( 0.25, 18 ), SILK_FIX_CONST( 0.75, 18 ), psEncCtrl->coding_quality_Q14 ) ), 14 ); } @@ -129,8 +137,9 @@ void silk_find_pred_coefs_FIX( /* Calculate residual energy using quantized LPC coefficients */ silk_residual_energy_FIX( psEncCtrl->ResNrg, psEncCtrl->ResNrgQ, LPC_in_pre, psEncCtrl->PredCoef_Q12, local_gains, - psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); + psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.arch ); /* Copy to prediction struct for use in next frame for interpolation */ silk_memcpy( psEnc->sCmn.prev_NLSFq_Q15, NLSF_Q15, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/fixed/k2a_FIX.c b/external/opus-1.3.1/silk/fixed/k2a_FIX.c similarity index 86% rename from external/opus-1.0.3/silk/fixed/k2a_FIX.c rename to external/opus-1.3.1/silk/fixed/k2a_FIX.c index cadc9274..549f6ead 100644 --- a/external/opus-1.0.3/silk/fixed/k2a_FIX.c +++ b/external/opus-1.3.1/silk/fixed/k2a_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -39,14 +39,15 @@ void silk_k2a( ) { opus_int k, n; - opus_int32 Atmp[ SILK_MAX_ORDER_LPC ]; + opus_int32 rc, tmp1, tmp2; for( k = 0; k < order; k++ ) { - for( n = 0; n < k; n++ ) { - Atmp[ n ] = A_Q24[ n ]; - } - for( n = 0; n < k; n++ ) { - A_Q24[ n ] = silk_SMLAWB( A_Q24[ n ], silk_LSHIFT( Atmp[ k - n - 1 ], 1 ), rc_Q15[ k ] ); + rc = rc_Q15[ k ]; + for( n = 0; n < (k + 1) >> 1; n++ ) { + tmp1 = A_Q24[ n ]; + tmp2 = A_Q24[ k - n - 1 ]; + A_Q24[ n ] = silk_SMLAWB( tmp1, silk_LSHIFT( tmp2, 1 ), rc ); + A_Q24[ k - n - 1 ] = silk_SMLAWB( tmp2, silk_LSHIFT( tmp1, 1 ), rc ); } A_Q24[ k ] = -silk_LSHIFT( (opus_int32)rc_Q15[ k ], 9 ); } diff --git a/external/opus-1.0.3/silk/fixed/k2a_Q16_FIX.c b/external/opus-1.3.1/silk/fixed/k2a_Q16_FIX.c similarity index 86% rename from external/opus-1.0.3/silk/fixed/k2a_Q16_FIX.c rename to external/opus-1.3.1/silk/fixed/k2a_Q16_FIX.c index f96f3064..1595aa62 100644 --- a/external/opus-1.0.3/silk/fixed/k2a_Q16_FIX.c +++ b/external/opus-1.3.1/silk/fixed/k2a_Q16_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -39,15 +39,16 @@ void silk_k2a_Q16( ) { opus_int k, n; - opus_int32 Atmp[ SILK_MAX_ORDER_LPC ]; + opus_int32 rc, tmp1, tmp2; for( k = 0; k < order; k++ ) { - for( n = 0; n < k; n++ ) { - Atmp[ n ] = A_Q24[ n ]; + rc = rc_Q16[ k ]; + for( n = 0; n < (k + 1) >> 1; n++ ) { + tmp1 = A_Q24[ n ]; + tmp2 = A_Q24[ k - n - 1 ]; + A_Q24[ n ] = silk_SMLAWW( tmp1, tmp2, rc ); + A_Q24[ k - n - 1 ] = silk_SMLAWW( tmp2, tmp1, rc ); } - for( n = 0; n < k; n++ ) { - A_Q24[ n ] = silk_SMLAWW( A_Q24[ n ], Atmp[ k - n - 1 ], rc_Q16[ k ] ); - } - A_Q24[ k ] = -silk_LSHIFT( rc_Q16[ k ], 8 ); + A_Q24[ k ] = -silk_LSHIFT( rc, 8 ); } } diff --git a/external/opus-1.0.3/silk/fixed/main_FIX.h b/external/opus-1.3.1/silk/fixed/main_FIX.h similarity index 81% rename from external/opus-1.0.3/silk/fixed/main_FIX.h rename to external/opus-1.3.1/silk/fixed/main_FIX.h index 369b31ee..6d2112e5 100644 --- a/external/opus-1.0.3/silk/fixed/main_FIX.h +++ b/external/opus-1.3.1/silk/fixed/main_FIX.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -36,6 +36,11 @@ POSSIBILITY OF SUCH DAMAGE. #include "debug.h" #include "entenc.h" +#if ((defined(OPUS_ARM_ASM) && defined(FIXED_POINT)) \ + || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#include "fixed/arm/warped_autocorrelation_FIX_arm.h" +#endif + #ifndef FORCE_CPP_BUILD #ifdef __cplusplus extern "C" @@ -47,6 +52,9 @@ extern "C" #define silk_encode_do_VAD_Fxx silk_encode_do_VAD_FIX #define silk_encode_frame_Fxx silk_encode_frame_FIX +#define QC 10 +#define QS 13 + /*********************/ /* Encoder Functions */ /*********************/ @@ -58,7 +66,8 @@ void silk_HP_variable_cutoff( /* Encoder main function */ void silk_encode_do_VAD_FIX( - silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ + silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ + opus_int activity /* I Decision of Opus voice activity detector */ ); /* Encoder main function */ @@ -73,29 +82,19 @@ opus_int silk_encode_frame_FIX( /* Initializes the Silk encoder state */ opus_int silk_init_encoder( - silk_encoder_state_Fxx *psEnc /* I/O Pointer to Silk FIX encoder state */ + silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk FIX encoder state */ + int arch /* I Run-time architecture */ ); /* Control the Silk encoder */ opus_int silk_control_encoder( silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ silk_EncControlStruct *encControl, /* I Control structure */ - const opus_int32 TargetRate_bps, /* I Target max bitrate (bps) */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz ); -/****************/ -/* Prefiltering */ -/****************/ -void silk_prefilter_FIX( - silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ - const silk_encoder_control_FIX *psEncCtrl, /* I Encoder control */ - opus_int32 xw_Q10[], /* O Weighted signal */ - const opus_int16 x[] /* I Speech signal */ -); - /**************************/ /* Noise shaping analysis */ /**************************/ @@ -104,11 +103,12 @@ void silk_noise_shape_analysis_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ const opus_int16 *pitch_res, /* I LPC residual from pitch analysis */ - const opus_int16 *x /* I Input signal [ frame_length + la_shape ] */ + const opus_int16 *x, /* I Input signal [ frame_length + la_shape ] */ + int arch /* I Run-time architecture */ ); /* Autocorrelations for a warped frequency axis */ -void silk_warped_autocorrelation_FIX( +void silk_warped_autocorrelation_FIX_c( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ @@ -117,6 +117,11 @@ void silk_warped_autocorrelation_FIX( const opus_int order /* I Correlation order (even) */ ); +#if !defined(OVERRIDE_silk_warped_autocorrelation_FIX) +#define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ + ((void)(arch), silk_warped_autocorrelation_FIX_c(corr, scale, input, warping_Q16, length, order)) +#endif + /* Calculation of LTP state scaling */ void silk_LTP_scale_ctrl_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ @@ -132,7 +137,8 @@ void silk_find_pitch_lags_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ opus_int16 res[], /* O residual */ - const opus_int16 x[] /* I Speech signal */ + const opus_int16 x[], /* I Speech signal */ + int arch /* I Run-time architecture */ ); /* Find LPC and LTP coefficients */ @@ -154,16 +160,13 @@ void silk_find_LPC_FIX( /* LTP analysis */ void silk_find_LTP_FIX( - opus_int16 b_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ - opus_int32 WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ - opus_int *LTPredCodGain_Q7, /* O LTP coding gain */ - const opus_int16 r_lpc[], /* I residual signal after LPC signal + state for first 10 ms */ + opus_int32 XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Correlation matrix */ + opus_int32 xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ], /* O Correlation vector */ + const opus_int16 r_lpc[], /* I Residual signal after LPC */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ - const opus_int32 Wght_Q15[ MAX_NB_SUBFR ], /* I weights */ - const opus_int subfr_length, /* I subframe length */ - const opus_int nb_subfr, /* I number of subframes */ - const opus_int mem_offset, /* I number of samples in LTP memory */ - opus_int corr_rshifts[ MAX_NB_SUBFR ] /* O right shifts applied to correlations */ + const opus_int subfr_length, /* I Subframe length */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ ); void silk_LTP_analysis_filter_FIX( @@ -187,7 +190,8 @@ void silk_residual_energy_FIX( const opus_int32 gains[ MAX_NB_SUBFR ], /* I Quantization gains */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr, /* I Number of subframes */ - const opus_int LPC_order /* I LPC order */ + const opus_int LPC_order, /* I LPC order */ + int arch /* I Run-time architecture */ ); /* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ @@ -215,9 +219,10 @@ void silk_corrMatrix_FIX( const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ - const opus_int head_room, /* I Desired headroom */ opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ - opus_int *rshifts /* I/O Right shifts of correlations */ + opus_int32 *nrg, /* O Energy of x vector */ + opus_int *rshifts, /* O Right shifts of correlations */ + int arch /* I Run-time architecture */ ); /* Calculates correlation vector X'*t */ @@ -227,23 +232,8 @@ void silk_corrVector_FIX( const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ opus_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */ - const opus_int rshifts /* I Right shifts of correlations */ -); - -/* Add noise to matrix diagonal */ -void silk_regularize_correlations_FIX( - opus_int32 *XX, /* I/O Correlation matrices */ - opus_int32 *xx, /* I/O Correlation values */ - opus_int32 noise, /* I Noise to add */ - opus_int D /* I Dimension of XX */ -); - -/* Solves Ax = b, assuming A is symmetric */ -void silk_solve_LDL_FIX( - opus_int32 *A, /* I Pointer to symetric square matrix A */ - opus_int M, /* I Size of matrix */ - const opus_int32 *b, /* I Pointer to b vector */ - opus_int32 *x_Q16 /* O Pointer to x solution vector */ + const opus_int rshifts, /* I Right shifts of correlations */ + int arch /* I Run-time architecture */ ); #ifndef FORCE_CPP_BUILD diff --git a/external/opus-1.0.3/silk/fixed/noise_shape_analysis_FIX.c b/external/opus-1.3.1/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h similarity index 76% rename from external/opus-1.0.3/silk/fixed/noise_shape_analysis_FIX.c rename to external/opus-1.3.1/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h index d230e48d..3999b5bd 100644 --- a/external/opus-1.0.3/silk/fixed/noise_shape_analysis_FIX.c +++ b/external/opus-1.3.1/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -25,126 +25,18 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "main_FIX.h" -#include "tuning_parameters.h" - -/* Compute gain to make warped filter coefficients have a zero mean log frequency response on a */ -/* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */ -/* Note: A monic filter is one with the first coefficient equal to 1.0. In Silk we omit the first */ -/* coefficient in an array of coefficients, for monic filters. */ -static inline opus_int32 warped_gain( /* gain in Q16*/ - const opus_int32 *coefs_Q24, - opus_int lambda_Q16, - opus_int order -) { - opus_int i; - opus_int32 gain_Q24; - - lambda_Q16 = -lambda_Q16; - gain_Q24 = coefs_Q24[ order - 1 ]; - for( i = order - 2; i >= 0; i-- ) { - gain_Q24 = silk_SMLAWB( coefs_Q24[ i ], gain_Q24, lambda_Q16 ); - } - gain_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), gain_Q24, -lambda_Q16 ); - return silk_INVERSE32_varQ( gain_Q24, 40 ); -} - -/* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ -/* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ -static inline void limit_warped_coefs( - opus_int32 *coefs_syn_Q24, - opus_int32 *coefs_ana_Q24, - opus_int lambda_Q16, - opus_int32 limit_Q24, - opus_int order -) { - opus_int i, iter, ind = 0; - opus_int32 tmp, maxabs_Q24, chirp_Q16, gain_syn_Q16, gain_ana_Q16; - opus_int32 nom_Q16, den_Q24; - - /* Convert to monic coefficients */ - lambda_Q16 = -lambda_Q16; - for( i = order - 1; i > 0; i-- ) { - coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); - coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); - } - lambda_Q16 = -lambda_Q16; - nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); - den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_syn_Q24[ 0 ], lambda_Q16 ); - gain_syn_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); - den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_ana_Q24[ 0 ], lambda_Q16 ); - gain_ana_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); - for( i = 0; i < order; i++ ) { - coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); - coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); - } - - for( iter = 0; iter < 10; iter++ ) { - /* Find maximum absolute value */ - maxabs_Q24 = -1; - for( i = 0; i < order; i++ ) { - tmp = silk_max( silk_abs_int32( coefs_syn_Q24[ i ] ), silk_abs_int32( coefs_ana_Q24[ i ] ) ); - if( tmp > maxabs_Q24 ) { - maxabs_Q24 = tmp; - ind = i; - } - } - if( maxabs_Q24 <= limit_Q24 ) { - /* Coefficients are within range - done */ - return; - } - - /* Convert back to true warped coefficients */ - for( i = 1; i < order; i++ ) { - coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); - coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); - } - gain_syn_Q16 = silk_INVERSE32_varQ( gain_syn_Q16, 32 ); - gain_ana_Q16 = silk_INVERSE32_varQ( gain_ana_Q16, 32 ); - for( i = 0; i < order; i++ ) { - coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); - coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); - } - - /* Apply bandwidth expansion */ - chirp_Q16 = SILK_FIX_CONST( 0.99, 16 ) - silk_DIV32_varQ( - silk_SMULWB( maxabs_Q24 - limit_Q24, silk_SMLABB( SILK_FIX_CONST( 0.8, 10 ), SILK_FIX_CONST( 0.1, 10 ), iter ) ), - silk_MUL( maxabs_Q24, ind + 1 ), 22 ); - silk_bwexpander_32( coefs_syn_Q24, order, chirp_Q16 ); - silk_bwexpander_32( coefs_ana_Q24, order, chirp_Q16 ); - - /* Convert to monic warped coefficients */ - lambda_Q16 = -lambda_Q16; - for( i = order - 1; i > 0; i-- ) { - coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); - coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); - } - lambda_Q16 = -lambda_Q16; - nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); - den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_syn_Q24[ 0 ], lambda_Q16 ); - gain_syn_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); - den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_ana_Q24[ 0 ], lambda_Q16 ); - gain_ana_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); - for( i = 0; i < order; i++ ) { - coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); - coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); - } - } - silk_assert( 0 ); -} /**************************************************************/ /* Compute noise shaping coefficients and initial gain values */ /**************************************************************/ +#define OVERRIDE_silk_noise_shape_analysis_FIX + void silk_noise_shape_analysis_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ const opus_int16 *pitch_res, /* I LPC residual from pitch analysis */ - const opus_int16 *x /* I Input signal [ frame_length + la_shape ] */ + const opus_int16 *x, /* I Input signal [ frame_length + la_shape ] */ + int arch /* I Run-time architecture */ ) { silk_shape_state_FIX *psShapeSt = &psEnc->sShape; @@ -156,8 +48,9 @@ void silk_noise_shape_analysis_FIX( opus_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ]; opus_int32 AR1_Q24[ MAX_SHAPE_LPC_ORDER ]; opus_int32 AR2_Q24[ MAX_SHAPE_LPC_ORDER ]; - opus_int16 x_windowed[ SHAPE_LPC_WIN_MAX ]; + VARDECL( opus_int16, x_windowed ); const opus_int16 *x_ptr, *pitch_res_ptr; + SAVE_STACK; /* Point to start of first LPC analysis block */ x_ptr = x - psEnc->sCmn.la_shape; @@ -258,6 +151,7 @@ void silk_noise_shape_analysis_FIX( /********************************************/ /* Compute noise shaping AR coefs and gains */ /********************************************/ + ALLOC( x_windowed, psEnc->sCmn.shapeWinLength, opus_int16 ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { /* Apply window: sine slope followed by flat part followed by cosine slope */ opus_int shift, slope_part, flat_part; @@ -275,10 +169,10 @@ void silk_noise_shape_analysis_FIX( if( psEnc->sCmn.warping_Q16 > 0 ) { /* Calculate warped auto correlation */ - silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder ); + silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder, arch ); } else { /* Calculate regular auto correlation */ - silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1 ); + silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1, arch ); } /* Add white noise, as a fraction of energy */ @@ -305,7 +199,8 @@ void silk_noise_shape_analysis_FIX( tmp32 = silk_SQRT_APPROX( nrg ); Qnrg >>= 1; /* range: -6...15*/ - psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( tmp32, 16 - Qnrg ); + psEncCtrl->Gains_Q16[ k ] = (silk_LSHIFT32( silk_LIMIT( (tmp32), silk_RSHIFT32( silk_int32_MIN, (16 - Qnrg) ), \ + silk_RSHIFT32( silk_int32_MAX, (16 - Qnrg) ) ), (16 - Qnrg) )); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Adjust gain for warping */ @@ -329,8 +224,8 @@ void silk_noise_shape_analysis_FIX( silk_bwexpander_32( AR1_Q24, psEnc->sCmn.shapingLPCOrder, BWExp1_Q16 ); /* Ratio of prediction gains, in energy domain */ - pre_nrg_Q30 = silk_LPC_inverse_pred_gain_Q24( AR2_Q24, psEnc->sCmn.shapingLPCOrder ); - nrg = silk_LPC_inverse_pred_gain_Q24( AR1_Q24, psEnc->sCmn.shapingLPCOrder ); + pre_nrg_Q30 = silk_LPC_inverse_pred_gain_Q24( AR2_Q24, psEnc->sCmn.shapingLPCOrder, arch ); + nrg = silk_LPC_inverse_pred_gain_Q24( AR1_Q24, psEnc->sCmn.shapingLPCOrder, arch ); /*psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg ) = 0.3f + 0.7f * pre_nrg / nrg;*/ pre_nrg_Q30 = silk_LSHIFT32( silk_SMULWB( pre_nrg_Q30, SILK_FIX_CONST( 0.7, 15 ) ), 1 ); @@ -437,4 +332,5 @@ void silk_noise_shape_analysis_FIX( psEncCtrl->HarmShapeGain_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->HarmShapeGain_smth_Q16, 2 ); psEncCtrl->Tilt_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->Tilt_smth_Q16, 2 ); } + RESTORE_STACK; } diff --git a/external/opus-1.3.1/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h b/external/opus-1.3.1/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h new file mode 100644 index 00000000..66eb2ed2 --- /dev/null +++ b/external/opus-1.3.1/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h @@ -0,0 +1,165 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef __WARPED_AUTOCORRELATION_FIX_MIPSR1_H__ +#define __WARPED_AUTOCORRELATION_FIX_MIPSR1_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FIX.h" + +#undef QC +#define QC 10 + +#undef QS +#define QS 14 + +/* Autocorrelations for a warped frequency axis */ +#define OVERRIDE_silk_warped_autocorrelation_FIX_c +void silk_warped_autocorrelation_FIX_c( + opus_int32 *corr, /* O Result [order + 1] */ + opus_int *scale, /* O Scaling of the correlation vector */ + const opus_int16 *input, /* I Input data to correlate */ + const opus_int warping_Q16, /* I Warping coefficient */ + const opus_int length, /* I Length of input */ + const opus_int order /* I Correlation order (even) */ +) +{ + opus_int n, i, lsh; + opus_int32 tmp1_QS=0, tmp2_QS=0, tmp3_QS=0, tmp4_QS=0, tmp5_QS=0, tmp6_QS=0, tmp7_QS=0, tmp8_QS=0, start_1=0, start_2=0, start_3=0; + opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + opus_int64 temp64; + + opus_int32 val; + val = 2 * QS - QC; + + /* Order must be even */ + silk_assert( ( order & 1 ) == 0 ); + silk_assert( 2 * QS - QC >= 0 ); + + /* Loop over samples */ + for( n = 0; n < length; n=n+4 ) { + + tmp1_QS = silk_LSHIFT32( (opus_int32)input[ n ], QS ); + start_1 = tmp1_QS; + tmp3_QS = silk_LSHIFT32( (opus_int32)input[ n+1], QS ); + start_2 = tmp3_QS; + tmp5_QS = silk_LSHIFT32( (opus_int32)input[ n+2], QS ); + start_3 = tmp5_QS; + tmp7_QS = silk_LSHIFT32( (opus_int32)input[ n+3], QS ); + + /* Loop over allpass sections */ + for( i = 0; i < order; i += 2 ) { + /* Output of allpass section */ + tmp2_QS = silk_SMLAWB( state_QS[ i ], state_QS[ i + 1 ] - tmp1_QS, warping_Q16 ); + corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp1_QS, start_1); + + tmp4_QS = silk_SMLAWB( tmp1_QS, tmp2_QS - tmp3_QS, warping_Q16 ); + corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp3_QS, start_2); + + tmp6_QS = silk_SMLAWB( tmp3_QS, tmp4_QS - tmp5_QS, warping_Q16 ); + corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp5_QS, start_3); + + tmp8_QS = silk_SMLAWB( tmp5_QS, tmp6_QS - tmp7_QS, warping_Q16 ); + state_QS[ i ] = tmp7_QS; + corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp7_QS, state_QS[0]); + + /* Output of allpass section */ + tmp1_QS = silk_SMLAWB( state_QS[ i + 1 ], state_QS[ i + 2 ] - tmp2_QS, warping_Q16 ); + corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp2_QS, start_1); + + tmp3_QS = silk_SMLAWB( tmp2_QS, tmp1_QS - tmp4_QS, warping_Q16 ); + corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp4_QS, start_2); + + tmp5_QS = silk_SMLAWB( tmp4_QS, tmp3_QS - tmp6_QS, warping_Q16 ); + corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp6_QS, start_3); + + tmp7_QS = silk_SMLAWB( tmp6_QS, tmp5_QS - tmp8_QS, warping_Q16 ); + state_QS[ i + 1 ] = tmp8_QS; + corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp8_QS, state_QS[ 0 ]); + + } + state_QS[ order ] = tmp7_QS; + + corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp1_QS, start_1); + corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp3_QS, start_2); + corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp5_QS, start_3); + corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp7_QS, state_QS[ 0 ]); + } + + for(;n< length; n++ ) { + + tmp1_QS = silk_LSHIFT32( (opus_int32)input[ n ], QS ); + + /* Loop over allpass sections */ + for( i = 0; i < order; i += 2 ) { + + /* Output of allpass section */ + tmp2_QS = silk_SMLAWB( state_QS[ i ], state_QS[ i + 1 ] - tmp1_QS, warping_Q16 ); + state_QS[ i ] = tmp1_QS; + corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp1_QS, state_QS[ 0 ]); + + /* Output of allpass section */ + tmp1_QS = silk_SMLAWB( state_QS[ i + 1 ], state_QS[ i + 2 ] - tmp2_QS, warping_Q16 ); + state_QS[ i + 1 ] = tmp2_QS; + corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp2_QS, state_QS[ 0 ]); + } + state_QS[ order ] = tmp1_QS; + corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp1_QS, state_QS[ 0 ]); + } + + temp64 = corr_QC[ 0 ]; + temp64 = __builtin_mips_shilo(temp64, val); + + lsh = silk_CLZ64( temp64 ) - 35; + lsh = silk_LIMIT( lsh, -12 - QC, 30 - QC ); + *scale = -( QC + lsh ); + silk_assert( *scale >= -30 && *scale <= 12 ); + if( lsh >= 0 ) { + for( i = 0; i < order + 1; i++ ) { + temp64 = corr_QC[ i ]; + //temp64 = __builtin_mips_shilo(temp64, val); + temp64 = (val >= 0) ? (temp64 >> val) : (temp64 << -val); + corr[ i ] = (opus_int32)silk_CHECK_FIT32( __builtin_mips_shilo( temp64, -lsh ) ); + } + } else { + for( i = 0; i < order + 1; i++ ) { + temp64 = corr_QC[ i ]; + //temp64 = __builtin_mips_shilo(temp64, val); + temp64 = (val >= 0) ? (temp64 >> val) : (temp64 << -val); + corr[ i ] = (opus_int32)silk_CHECK_FIT32( __builtin_mips_shilo( temp64, -lsh ) ); + } + } + + corr_QC[ 0 ] = __builtin_mips_shilo(corr_QC[ 0 ], val); + + silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ +} +#endif /* __WARPED_AUTOCORRELATION_FIX_MIPSR1_H__ */ diff --git a/external/opus-1.3.1/silk/fixed/noise_shape_analysis_FIX.c b/external/opus-1.3.1/silk/fixed/noise_shape_analysis_FIX.c new file mode 100644 index 00000000..85fea0bf --- /dev/null +++ b/external/opus-1.3.1/silk/fixed/noise_shape_analysis_FIX.c @@ -0,0 +1,407 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FIX.h" +#include "stack_alloc.h" +#include "tuning_parameters.h" + +/* Compute gain to make warped filter coefficients have a zero mean log frequency response on a */ +/* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */ +/* Note: A monic filter is one with the first coefficient equal to 1.0. In Silk we omit the first */ +/* coefficient in an array of coefficients, for monic filters. */ +static OPUS_INLINE opus_int32 warped_gain( /* gain in Q16*/ + const opus_int32 *coefs_Q24, + opus_int lambda_Q16, + opus_int order +) { + opus_int i; + opus_int32 gain_Q24; + + lambda_Q16 = -lambda_Q16; + gain_Q24 = coefs_Q24[ order - 1 ]; + for( i = order - 2; i >= 0; i-- ) { + gain_Q24 = silk_SMLAWB( coefs_Q24[ i ], gain_Q24, lambda_Q16 ); + } + gain_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), gain_Q24, -lambda_Q16 ); + return silk_INVERSE32_varQ( gain_Q24, 40 ); +} + +/* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ +/* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ +static OPUS_INLINE void limit_warped_coefs( + opus_int32 *coefs_Q24, + opus_int lambda_Q16, + opus_int32 limit_Q24, + opus_int order +) { + opus_int i, iter, ind = 0; + opus_int32 tmp, maxabs_Q24, chirp_Q16, gain_Q16; + opus_int32 nom_Q16, den_Q24; + opus_int32 limit_Q20, maxabs_Q20; + + /* Convert to monic coefficients */ + lambda_Q16 = -lambda_Q16; + for( i = order - 1; i > 0; i-- ) { + coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); + } + lambda_Q16 = -lambda_Q16; + nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); + den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_Q24[ 0 ], lambda_Q16 ); + gain_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); + for( i = 0; i < order; i++ ) { + coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); + } + limit_Q20 = silk_RSHIFT(limit_Q24, 4); + for( iter = 0; iter < 10; iter++ ) { + /* Find maximum absolute value */ + maxabs_Q24 = -1; + for( i = 0; i < order; i++ ) { + tmp = silk_abs_int32( coefs_Q24[ i ] ); + if( tmp > maxabs_Q24 ) { + maxabs_Q24 = tmp; + ind = i; + } + } + /* Use Q20 to avoid any overflow when multiplying by (ind + 1) later. */ + maxabs_Q20 = silk_RSHIFT(maxabs_Q24, 4); + if( maxabs_Q20 <= limit_Q20 ) { + /* Coefficients are within range - done */ + return; + } + + /* Convert back to true warped coefficients */ + for( i = 1; i < order; i++ ) { + coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); + } + gain_Q16 = silk_INVERSE32_varQ( gain_Q16, 32 ); + for( i = 0; i < order; i++ ) { + coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); + } + + /* Apply bandwidth expansion */ + chirp_Q16 = SILK_FIX_CONST( 0.99, 16 ) - silk_DIV32_varQ( + silk_SMULWB( maxabs_Q20 - limit_Q20, silk_SMLABB( SILK_FIX_CONST( 0.8, 10 ), SILK_FIX_CONST( 0.1, 10 ), iter ) ), + silk_MUL( maxabs_Q20, ind + 1 ), 22 ); + silk_bwexpander_32( coefs_Q24, order, chirp_Q16 ); + + /* Convert to monic warped coefficients */ + lambda_Q16 = -lambda_Q16; + for( i = order - 1; i > 0; i-- ) { + coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); + } + lambda_Q16 = -lambda_Q16; + nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); + den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_Q24[ 0 ], lambda_Q16 ); + gain_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); + for( i = 0; i < order; i++ ) { + coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); + } + } + silk_assert( 0 ); +} + +/* Disable MIPS version until it's updated. */ +#if 0 && defined(MIPSr1_ASM) +#include "mips/noise_shape_analysis_FIX_mipsr1.h" +#endif + +/**************************************************************/ +/* Compute noise shaping coefficients and initial gain values */ +/**************************************************************/ +#ifndef OVERRIDE_silk_noise_shape_analysis_FIX +void silk_noise_shape_analysis_FIX( + silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ + silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ + const opus_int16 *pitch_res, /* I LPC residual from pitch analysis */ + const opus_int16 *x, /* I Input signal [ frame_length + la_shape ] */ + int arch /* I Run-time architecture */ +) +{ + silk_shape_state_FIX *psShapeSt = &psEnc->sShape; + opus_int k, i, nSamples, nSegs, Qnrg, b_Q14, warping_Q16, scale = 0; + opus_int32 SNR_adj_dB_Q7, HarmShapeGain_Q16, Tilt_Q16, tmp32; + opus_int32 nrg, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7; + opus_int32 BWExp_Q16, gain_mult_Q16, gain_add_Q16, strength_Q16, b_Q8; + opus_int32 auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; + opus_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ]; + opus_int32 AR_Q24[ MAX_SHAPE_LPC_ORDER ]; + VARDECL( opus_int16, x_windowed ); + const opus_int16 *x_ptr, *pitch_res_ptr; + SAVE_STACK; + + /* Point to start of first LPC analysis block */ + x_ptr = x - psEnc->sCmn.la_shape; + + /****************/ + /* GAIN CONTROL */ + /****************/ + SNR_adj_dB_Q7 = psEnc->sCmn.SNR_dB_Q7; + + /* Input quality is the average of the quality in the lowest two VAD bands */ + psEncCtrl->input_quality_Q14 = ( opus_int )silk_RSHIFT( (opus_int32)psEnc->sCmn.input_quality_bands_Q15[ 0 ] + + psEnc->sCmn.input_quality_bands_Q15[ 1 ], 2 ); + + /* Coding quality level, between 0.0_Q0 and 1.0_Q0, but in Q14 */ + psEncCtrl->coding_quality_Q14 = silk_RSHIFT( silk_sigm_Q15( silk_RSHIFT_ROUND( SNR_adj_dB_Q7 - + SILK_FIX_CONST( 20.0, 7 ), 4 ) ), 1 ); + + /* Reduce coding SNR during low speech activity */ + if( psEnc->sCmn.useCBR == 0 ) { + b_Q8 = SILK_FIX_CONST( 1.0, 8 ) - psEnc->sCmn.speech_activity_Q8; + b_Q8 = silk_SMULWB( silk_LSHIFT( b_Q8, 8 ), b_Q8 ); + SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, + silk_SMULBB( SILK_FIX_CONST( -BG_SNR_DECR_dB, 7 ) >> ( 4 + 1 ), b_Q8 ), /* Q11*/ + silk_SMULWB( SILK_FIX_CONST( 1.0, 14 ) + psEncCtrl->input_quality_Q14, psEncCtrl->coding_quality_Q14 ) ); /* Q12*/ + } + + if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + /* Reduce gains for periodic signals */ + SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, SILK_FIX_CONST( HARM_SNR_INCR_dB, 8 ), psEnc->LTPCorr_Q15 ); + } else { + /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */ + SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, + silk_SMLAWB( SILK_FIX_CONST( 6.0, 9 ), -SILK_FIX_CONST( 0.4, 18 ), psEnc->sCmn.SNR_dB_Q7 ), + SILK_FIX_CONST( 1.0, 14 ) - psEncCtrl->input_quality_Q14 ); + } + + /*************************/ + /* SPARSENESS PROCESSING */ + /*************************/ + /* Set quantizer offset */ + if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + /* Initially set to 0; may be overruled in process_gains(..) */ + psEnc->sCmn.indices.quantOffsetType = 0; + } else { + /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */ + nSamples = silk_LSHIFT( psEnc->sCmn.fs_kHz, 1 ); + energy_variation_Q7 = 0; + log_energy_prev_Q7 = 0; + pitch_res_ptr = pitch_res; + nSegs = silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; + for( k = 0; k < nSegs; k++ ) { + silk_sum_sqr_shift( &nrg, &scale, pitch_res_ptr, nSamples ); + nrg += silk_RSHIFT( nSamples, scale ); /* Q(-scale)*/ + + log_energy_Q7 = silk_lin2log( nrg ); + if( k > 0 ) { + energy_variation_Q7 += silk_abs( log_energy_Q7 - log_energy_prev_Q7 ); + } + log_energy_prev_Q7 = log_energy_Q7; + pitch_res_ptr += nSamples; + } + + /* Set quantization offset depending on sparseness measure */ + if( energy_variation_Q7 > SILK_FIX_CONST( ENERGY_VARIATION_THRESHOLD_QNT_OFFSET, 7 ) * (nSegs-1) ) { + psEnc->sCmn.indices.quantOffsetType = 0; + } else { + psEnc->sCmn.indices.quantOffsetType = 1; + } + } + + /*******************************/ + /* Control bandwidth expansion */ + /*******************************/ + /* More BWE for signals with high prediction gain */ + strength_Q16 = silk_SMULWB( psEncCtrl->predGain_Q16, SILK_FIX_CONST( FIND_PITCH_WHITE_NOISE_FRACTION, 16 ) ); + BWExp_Q16 = silk_DIV32_varQ( SILK_FIX_CONST( BANDWIDTH_EXPANSION, 16 ), + silk_SMLAWW( SILK_FIX_CONST( 1.0, 16 ), strength_Q16, strength_Q16 ), 16 ); + + if( psEnc->sCmn.warping_Q16 > 0 ) { + /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ + warping_Q16 = silk_SMLAWB( psEnc->sCmn.warping_Q16, (opus_int32)psEncCtrl->coding_quality_Q14, SILK_FIX_CONST( 0.01, 18 ) ); + } else { + warping_Q16 = 0; + } + + /********************************************/ + /* Compute noise shaping AR coefs and gains */ + /********************************************/ + ALLOC( x_windowed, psEnc->sCmn.shapeWinLength, opus_int16 ); + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + /* Apply window: sine slope followed by flat part followed by cosine slope */ + opus_int shift, slope_part, flat_part; + flat_part = psEnc->sCmn.fs_kHz * 3; + slope_part = silk_RSHIFT( psEnc->sCmn.shapeWinLength - flat_part, 1 ); + + silk_apply_sine_window( x_windowed, x_ptr, 1, slope_part ); + shift = slope_part; + silk_memcpy( x_windowed + shift, x_ptr + shift, flat_part * sizeof(opus_int16) ); + shift += flat_part; + silk_apply_sine_window( x_windowed + shift, x_ptr + shift, 2, slope_part ); + + /* Update pointer: next LPC analysis block */ + x_ptr += psEnc->sCmn.subfr_length; + + if( psEnc->sCmn.warping_Q16 > 0 ) { + /* Calculate warped auto correlation */ + silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder, arch ); + } else { + /* Calculate regular auto correlation */ + silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1, arch ); + } + + /* Add white noise, as a fraction of energy */ + auto_corr[0] = silk_ADD32( auto_corr[0], silk_max_32( silk_SMULWB( silk_RSHIFT( auto_corr[ 0 ], 4 ), + SILK_FIX_CONST( SHAPE_WHITE_NOISE_FRACTION, 20 ) ), 1 ) ); + + /* Calculate the reflection coefficients using schur */ + nrg = silk_schur64( refl_coef_Q16, auto_corr, psEnc->sCmn.shapingLPCOrder ); + silk_assert( nrg >= 0 ); + + /* Convert reflection coefficients to prediction coefficients */ + silk_k2a_Q16( AR_Q24, refl_coef_Q16, psEnc->sCmn.shapingLPCOrder ); + + Qnrg = -scale; /* range: -12...30*/ + silk_assert( Qnrg >= -12 ); + silk_assert( Qnrg <= 30 ); + + /* Make sure that Qnrg is an even number */ + if( Qnrg & 1 ) { + Qnrg -= 1; + nrg >>= 1; + } + + tmp32 = silk_SQRT_APPROX( nrg ); + Qnrg >>= 1; /* range: -6...15*/ + + psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( tmp32, 16 - Qnrg ); + + if( psEnc->sCmn.warping_Q16 > 0 ) { + /* Adjust gain for warping */ + gain_mult_Q16 = warped_gain( AR_Q24, warping_Q16, psEnc->sCmn.shapingLPCOrder ); + silk_assert( psEncCtrl->Gains_Q16[ k ] > 0 ); + if( psEncCtrl->Gains_Q16[ k ] < SILK_FIX_CONST( 0.25, 16 ) ) { + psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); + } else { + psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( silk_RSHIFT_ROUND( psEncCtrl->Gains_Q16[ k ], 1 ), gain_mult_Q16 ); + if ( psEncCtrl->Gains_Q16[ k ] >= ( silk_int32_MAX >> 1 ) ) { + psEncCtrl->Gains_Q16[ k ] = silk_int32_MAX; + } else { + psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT32( psEncCtrl->Gains_Q16[ k ], 1 ); + } + } + silk_assert( psEncCtrl->Gains_Q16[ k ] > 0 ); + } + + /* Bandwidth expansion */ + silk_bwexpander_32( AR_Q24, psEnc->sCmn.shapingLPCOrder, BWExp_Q16 ); + + if( psEnc->sCmn.warping_Q16 > 0 ) { + /* Convert to monic warped prediction coefficients and limit absolute values */ + limit_warped_coefs( AR_Q24, warping_Q16, SILK_FIX_CONST( 3.999, 24 ), psEnc->sCmn.shapingLPCOrder ); + + /* Convert from Q24 to Q13 and store in int16 */ + for( i = 0; i < psEnc->sCmn.shapingLPCOrder; i++ ) { + psEncCtrl->AR_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR_Q24[ i ], 11 ) ); + } + } else { + silk_LPC_fit( &psEncCtrl->AR_Q13[ k * MAX_SHAPE_LPC_ORDER ], AR_Q24, 13, 24, psEnc->sCmn.shapingLPCOrder ); + } + } + + /*****************/ + /* Gain tweaking */ + /*****************/ + /* Increase gains during low speech activity and put lower limit on gains */ + gain_mult_Q16 = silk_log2lin( -silk_SMLAWB( -SILK_FIX_CONST( 16.0, 7 ), SNR_adj_dB_Q7, SILK_FIX_CONST( 0.16, 16 ) ) ); + gain_add_Q16 = silk_log2lin( silk_SMLAWB( SILK_FIX_CONST( 16.0, 7 ), SILK_FIX_CONST( MIN_QGAIN_DB, 7 ), SILK_FIX_CONST( 0.16, 16 ) ) ); + silk_assert( gain_mult_Q16 > 0 ); + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); + silk_assert( psEncCtrl->Gains_Q16[ k ] >= 0 ); + psEncCtrl->Gains_Q16[ k ] = silk_ADD_POS_SAT32( psEncCtrl->Gains_Q16[ k ], gain_add_Q16 ); + } + + + /************************************************/ + /* Control low-frequency shaping and noise tilt */ + /************************************************/ + /* Less low frequency shaping for noisy inputs */ + strength_Q16 = silk_MUL( SILK_FIX_CONST( LOW_FREQ_SHAPING, 4 ), silk_SMLAWB( SILK_FIX_CONST( 1.0, 12 ), + SILK_FIX_CONST( LOW_QUALITY_LOW_FREQ_SHAPING_DECR, 13 ), psEnc->sCmn.input_quality_bands_Q15[ 0 ] - SILK_FIX_CONST( 1.0, 15 ) ) ); + strength_Q16 = silk_RSHIFT( silk_MUL( strength_Q16, psEnc->sCmn.speech_activity_Q8 ), 8 ); + if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */ + /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/ + opus_int fs_kHz_inv = silk_DIV32_16( SILK_FIX_CONST( 0.2, 14 ), psEnc->sCmn.fs_kHz ); + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + b_Q14 = fs_kHz_inv + silk_DIV32_16( SILK_FIX_CONST( 3.0, 14 ), psEncCtrl->pitchL[ k ] ); + /* Pack two coefficients in one int32 */ + psEncCtrl->LF_shp_Q14[ k ] = silk_LSHIFT( SILK_FIX_CONST( 1.0, 14 ) - b_Q14 - silk_SMULWB( strength_Q16, b_Q14 ), 16 ); + psEncCtrl->LF_shp_Q14[ k ] |= (opus_uint16)( b_Q14 - SILK_FIX_CONST( 1.0, 14 ) ); + } + silk_assert( SILK_FIX_CONST( HARM_HP_NOISE_COEF, 24 ) < SILK_FIX_CONST( 0.5, 24 ) ); /* Guarantees that second argument to SMULWB() is within range of an opus_int16*/ + Tilt_Q16 = - SILK_FIX_CONST( HP_NOISE_COEF, 16 ) - + silk_SMULWB( SILK_FIX_CONST( 1.0, 16 ) - SILK_FIX_CONST( HP_NOISE_COEF, 16 ), + silk_SMULWB( SILK_FIX_CONST( HARM_HP_NOISE_COEF, 24 ), psEnc->sCmn.speech_activity_Q8 ) ); + } else { + b_Q14 = silk_DIV32_16( 21299, psEnc->sCmn.fs_kHz ); /* 1.3_Q0 = 21299_Q14*/ + /* Pack two coefficients in one int32 */ + psEncCtrl->LF_shp_Q14[ 0 ] = silk_LSHIFT( SILK_FIX_CONST( 1.0, 14 ) - b_Q14 - + silk_SMULWB( strength_Q16, silk_SMULWB( SILK_FIX_CONST( 0.6, 16 ), b_Q14 ) ), 16 ); + psEncCtrl->LF_shp_Q14[ 0 ] |= (opus_uint16)( b_Q14 - SILK_FIX_CONST( 1.0, 14 ) ); + for( k = 1; k < psEnc->sCmn.nb_subfr; k++ ) { + psEncCtrl->LF_shp_Q14[ k ] = psEncCtrl->LF_shp_Q14[ 0 ]; + } + Tilt_Q16 = -SILK_FIX_CONST( HP_NOISE_COEF, 16 ); + } + + /****************************/ + /* HARMONIC SHAPING CONTROL */ + /****************************/ + if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + /* More harmonic noise shaping for high bitrates or noisy input */ + HarmShapeGain_Q16 = silk_SMLAWB( SILK_FIX_CONST( HARMONIC_SHAPING, 16 ), + SILK_FIX_CONST( 1.0, 16 ) - silk_SMULWB( SILK_FIX_CONST( 1.0, 18 ) - silk_LSHIFT( psEncCtrl->coding_quality_Q14, 4 ), + psEncCtrl->input_quality_Q14 ), SILK_FIX_CONST( HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING, 16 ) ); + + /* Less harmonic noise shaping for less periodic signals */ + HarmShapeGain_Q16 = silk_SMULWB( silk_LSHIFT( HarmShapeGain_Q16, 1 ), + silk_SQRT_APPROX( silk_LSHIFT( psEnc->LTPCorr_Q15, 15 ) ) ); + } else { + HarmShapeGain_Q16 = 0; + } + + /*************************/ + /* Smooth over subframes */ + /*************************/ + for( k = 0; k < MAX_NB_SUBFR; k++ ) { + psShapeSt->HarmShapeGain_smth_Q16 = + silk_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 - psShapeSt->HarmShapeGain_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); + psShapeSt->Tilt_smth_Q16 = + silk_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 - psShapeSt->Tilt_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); + + psEncCtrl->HarmShapeGain_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->HarmShapeGain_smth_Q16, 2 ); + psEncCtrl->Tilt_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->Tilt_smth_Q16, 2 ); + } + RESTORE_STACK; +} +#endif /* OVERRIDE_silk_noise_shape_analysis_FIX */ diff --git a/external/opus-1.0.3/silk/fixed/pitch_analysis_core_FIX.c b/external/opus-1.3.1/silk/fixed/pitch_analysis_core_FIX.c similarity index 55% rename from external/opus-1.0.3/silk/fixed/pitch_analysis_core_FIX.c rename to external/opus-1.3.1/silk/fixed/pitch_analysis_core_FIX.c index d43f444d..14729046 100644 --- a/external/opus-1.0.3/silk/fixed/pitch_analysis_core_FIX.c +++ b/external/opus-1.3.1/silk/fixed/pitch_analysis_core_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -34,118 +34,143 @@ POSSIBILITY OF SUCH DAMAGE. ********************************************************** */ #include "SigProc_FIX.h" #include "pitch_est_defines.h" +#include "stack_alloc.h" #include "debug.h" +#include "pitch.h" #define SCRATCH_SIZE 22 +#define SF_LENGTH_4KHZ ( PE_SUBFR_LENGTH_MS * 4 ) +#define SF_LENGTH_8KHZ ( PE_SUBFR_LENGTH_MS * 8 ) +#define MIN_LAG_4KHZ ( PE_MIN_LAG_MS * 4 ) +#define MIN_LAG_8KHZ ( PE_MIN_LAG_MS * 8 ) +#define MAX_LAG_4KHZ ( PE_MAX_LAG_MS * 4 ) +#define MAX_LAG_8KHZ ( PE_MAX_LAG_MS * 8 - 1 ) +#define CSTRIDE_4KHZ ( MAX_LAG_4KHZ + 1 - MIN_LAG_4KHZ ) +#define CSTRIDE_8KHZ ( MAX_LAG_8KHZ + 3 - ( MIN_LAG_8KHZ - 2 ) ) +#define D_COMP_MIN ( MIN_LAG_8KHZ - 3 ) +#define D_COMP_MAX ( MAX_LAG_8KHZ + 4 ) +#define D_COMP_STRIDE ( D_COMP_MAX - D_COMP_MIN ) + +typedef opus_int32 silk_pe_stage3_vals[ PE_NB_STAGE3_LAGS ]; /************************************************************/ /* Internally used functions */ /************************************************************/ -void silk_P_Ana_calc_corr_st3( - opus_int32 cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ],/* (O) 3 DIM correlation array */ +static void silk_P_Ana_calc_corr_st3( + silk_pe_stage3_vals cross_corr_st3[], /* O 3 DIM correlation array */ const opus_int16 frame[], /* I vector to correlate */ opus_int start_lag, /* I lag offset to search around */ opus_int sf_length, /* I length of a 5 ms subframe */ opus_int nb_subfr, /* I number of subframes */ - opus_int complexity /* I Complexity setting */ + opus_int complexity, /* I Complexity setting */ + int arch /* I Run-time architecture */ ); -void silk_P_Ana_calc_energy_st3( - opus_int32 energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ],/* (O) 3 DIM energy array */ +static void silk_P_Ana_calc_energy_st3( + silk_pe_stage3_vals energies_st3[], /* O 3 DIM energy array */ const opus_int16 frame[], /* I vector to calc energy in */ opus_int start_lag, /* I lag offset to search around */ opus_int sf_length, /* I length of one 5 ms subframe */ opus_int nb_subfr, /* I number of subframes */ - opus_int complexity /* I Complexity setting */ -); - -opus_int32 silk_P_Ana_find_scaling( - const opus_int16 *frame, - const opus_int frame_length, - const opus_int sum_sqr_len + opus_int complexity, /* I Complexity setting */ + int arch /* I Run-time architecture */ ); /*************************************************************/ /* FIXED POINT CORE PITCH ANALYSIS FUNCTION */ /*************************************************************/ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ - const opus_int16 *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ + const opus_int16 *frame_unscaled, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ opus_int *pitch_out, /* O 4 pitch lag values */ opus_int16 *lagIndex, /* O Lag Index */ opus_int8 *contourIndex, /* O Pitch contour Index */ opus_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */ opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ const opus_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */ - const opus_int search_thres2_Q15, /* I Final threshold for lag candidates 0 - 1 */ + const opus_int search_thres2_Q13, /* I Final threshold for lag candidates 0 - 1 */ const opus_int Fs_kHz, /* I Sample frequency (kHz) */ const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ - const opus_int nb_subfr /* I number of 5 ms subframes */ + const opus_int nb_subfr, /* I number of 5 ms subframes */ + int arch /* I Run-time architecture */ ) { - opus_int16 frame_8kHz[ PE_MAX_FRAME_LENGTH_ST_2 ]; - opus_int16 frame_4kHz[ PE_MAX_FRAME_LENGTH_ST_1 ]; + VARDECL( opus_int16, frame_8kHz_buf ); + VARDECL( opus_int16, frame_4kHz ); + VARDECL( opus_int16, frame_scaled ); opus_int32 filt_state[ 6 ]; - opus_int32 scratch_mem[ 3 * PE_MAX_FRAME_LENGTH ]; - opus_int16 *input_frame_ptr; + const opus_int16 *frame, *frame_8kHz; opus_int i, k, d, j; - opus_int16 C[ PE_MAX_NB_SUBFR ][ ( PE_MAX_LAG >> 1 ) + 5 ]; + VARDECL( opus_int16, C ); + VARDECL( opus_int32, xcorr32 ); const opus_int16 *target_ptr, *basis_ptr; - opus_int32 cross_corr, normalizer, energy, shift, energy_basis, energy_target; - opus_int d_srch[ PE_D_SRCH_LENGTH ], Cmax, length_d_srch, length_d_comp; - opus_int16 d_comp[ ( PE_MAX_LAG >> 1 ) + 5 ]; - opus_int32 sum, threshold, temp32, lag_counter; + opus_int32 cross_corr, normalizer, energy, energy_basis, energy_target; + opus_int d_srch[ PE_D_SRCH_LENGTH ], Cmax, length_d_srch, length_d_comp, shift; + VARDECL( opus_int16, d_comp ); + opus_int32 sum, threshold, lag_counter; opus_int CBimax, CBimax_new, CBimax_old, lag, start_lag, end_lag, lag_new; opus_int32 CC[ PE_NB_CBKS_STAGE2_EXT ], CCmax, CCmax_b, CCmax_new_b, CCmax_new; - opus_int32 energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ]; - opus_int32 crosscorr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ]; - opus_int frame_length, frame_length_8kHz, frame_length_4kHz, max_sum_sq_length; - opus_int sf_length, sf_length_8kHz, sf_length_4kHz; - opus_int min_lag, min_lag_8kHz, min_lag_4kHz; - opus_int max_lag, max_lag_8kHz, max_lag_4kHz; - opus_int32 contour_bias_Q20, diff, lz, lshift; + VARDECL( silk_pe_stage3_vals, energies_st3 ); + VARDECL( silk_pe_stage3_vals, cross_corr_st3 ); + opus_int frame_length, frame_length_8kHz, frame_length_4kHz; + opus_int sf_length; + opus_int min_lag; + opus_int max_lag; + opus_int32 contour_bias_Q15, diff; opus_int nb_cbk_search, cbk_size; - opus_int32 delta_lag_log2_sqr_Q7, lag_log2_Q7, prevLag_log2_Q7, prev_lag_bias_Q15, corr_thres_Q15; + opus_int32 delta_lag_log2_sqr_Q7, lag_log2_Q7, prevLag_log2_Q7, prev_lag_bias_Q13; const opus_int8 *Lag_CB_ptr; + SAVE_STACK; + /* Check for valid sampling frequency */ - silk_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); + celt_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); /* Check for valid complexity setting */ - silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); - silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); + celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); + celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); silk_assert( search_thres1_Q16 >= 0 && search_thres1_Q16 <= (1<<16) ); - silk_assert( search_thres2_Q15 >= 0 && search_thres2_Q15 <= (1<<15) ); + silk_assert( search_thres2_Q13 >= 0 && search_thres2_Q13 <= (1<<13) ); /* Set up frame lengths max / min lag for the sampling frequency */ frame_length = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * Fs_kHz; frame_length_4kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 4; frame_length_8kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 8; sf_length = PE_SUBFR_LENGTH_MS * Fs_kHz; - sf_length_4kHz = PE_SUBFR_LENGTH_MS * 4; - sf_length_8kHz = PE_SUBFR_LENGTH_MS * 8; min_lag = PE_MIN_LAG_MS * Fs_kHz; - min_lag_4kHz = PE_MIN_LAG_MS * 4; - min_lag_8kHz = PE_MIN_LAG_MS * 8; max_lag = PE_MAX_LAG_MS * Fs_kHz - 1; - max_lag_4kHz = PE_MAX_LAG_MS * 4; - max_lag_8kHz = PE_MAX_LAG_MS * 8 - 1; - silk_memset( C, 0, sizeof( opus_int16 ) * nb_subfr * ( ( PE_MAX_LAG >> 1 ) + 5) ); + /* Downscale input if necessary */ + silk_sum_sqr_shift( &energy, &shift, frame_unscaled, frame_length ); + shift += 3 - silk_CLZ32( energy ); /* at least two bits headroom */ + ALLOC( frame_scaled, frame_length, opus_int16 ); + if( shift > 0 ) { + shift = silk_RSHIFT( shift + 1, 1 ); + for( i = 0; i < frame_length; i++ ) { + frame_scaled[ i ] = silk_RSHIFT( frame_unscaled[ i ], shift ); + } + frame = frame_scaled; + } else { + frame = frame_unscaled; + } + ALLOC( frame_8kHz_buf, ( Fs_kHz == 8 ) ? 1 : frame_length_8kHz, opus_int16 ); /* Resample from input sampled at Fs_kHz to 8 kHz */ if( Fs_kHz == 16 ) { silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); - silk_resampler_down2( filt_state, frame_8kHz, frame, frame_length ); + silk_resampler_down2( filt_state, frame_8kHz_buf, frame, frame_length ); + frame_8kHz = frame_8kHz_buf; } else if( Fs_kHz == 12 ) { silk_memset( filt_state, 0, 6 * sizeof( opus_int32 ) ); - silk_resampler_down2_3( filt_state, frame_8kHz, frame, frame_length ); + silk_resampler_down2_3( filt_state, frame_8kHz_buf, frame, frame_length ); + frame_8kHz = frame_8kHz_buf; } else { - silk_assert( Fs_kHz == 8 ); - silk_memcpy( frame_8kHz, frame, frame_length_8kHz * sizeof(opus_int16) ); + celt_assert( Fs_kHz == 8 ); + frame_8kHz = frame; } /* Decimate again to 4 kHz */ silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) );/* Set state to zero */ + ALLOC( frame_4kHz, frame_length_4kHz, opus_int16 ); silk_resampler_down2( filt_state, frame_4kHz, frame_8kHz, frame_length_8kHz ); /* Low-pass filter */ @@ -153,146 +178,135 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 frame_4kHz[ i ] = silk_ADD_SAT16( frame_4kHz[ i ], frame_4kHz[ i - 1 ] ); } - /******************************************************************************* - ** Scale 4 kHz signal down to prevent correlations measures from overflowing - ** find scaling as max scaling for each 8kHz(?) subframe - *******************************************************************************/ - - /* Inner product is calculated with different lengths, so scale for the worst case */ - max_sum_sq_length = silk_max_32( sf_length_8kHz, silk_LSHIFT( sf_length_4kHz, 2 ) ); - shift = silk_P_Ana_find_scaling( frame_4kHz, frame_length_4kHz, max_sum_sq_length ); - if( shift > 0 ) { - for( i = 0; i < frame_length_4kHz; i++ ) { - frame_4kHz[ i ] = silk_RSHIFT( frame_4kHz[ i ], shift ); - } - } /****************************************************************************** * FIRST STAGE, operating in 4 khz ******************************************************************************/ - target_ptr = &frame_4kHz[ silk_LSHIFT( sf_length_4kHz, 2 ) ]; + ALLOC( C, nb_subfr * CSTRIDE_8KHZ, opus_int16 ); + ALLOC( xcorr32, MAX_LAG_4KHZ-MIN_LAG_4KHZ+1, opus_int32 ); + silk_memset( C, 0, (nb_subfr >> 1) * CSTRIDE_4KHZ * sizeof( opus_int16 ) ); + target_ptr = &frame_4kHz[ silk_LSHIFT( SF_LENGTH_4KHZ, 2 ) ]; for( k = 0; k < nb_subfr >> 1; k++ ) { /* Check that we are within range of the array */ - silk_assert( target_ptr >= frame_4kHz ); - silk_assert( target_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); + celt_assert( target_ptr >= frame_4kHz ); + celt_assert( target_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); - basis_ptr = target_ptr - min_lag_4kHz; + basis_ptr = target_ptr - MIN_LAG_4KHZ; /* Check that we are within range of the array */ - silk_assert( basis_ptr >= frame_4kHz ); - silk_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); + celt_assert( basis_ptr >= frame_4kHz ); + celt_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); + + celt_pitch_xcorr( target_ptr, target_ptr - MAX_LAG_4KHZ, xcorr32, SF_LENGTH_8KHZ, MAX_LAG_4KHZ - MIN_LAG_4KHZ + 1, arch ); /* Calculate first vector products before loop */ - cross_corr = silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz ); - normalizer = silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length_8kHz ); - normalizer = silk_ADD_SAT32( normalizer, silk_SMULBB( sf_length_8kHz, 4000 ) ); + cross_corr = xcorr32[ MAX_LAG_4KHZ - MIN_LAG_4KHZ ]; + normalizer = silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_8KHZ, arch ); + normalizer = silk_ADD32( normalizer, silk_inner_prod_aligned( basis_ptr, basis_ptr, SF_LENGTH_8KHZ, arch ) ); + normalizer = silk_ADD32( normalizer, silk_SMULBB( SF_LENGTH_8KHZ, 4000 ) ); - temp32 = silk_DIV32( cross_corr, silk_SQRT_APPROX( normalizer ) + 1 ); - C[ k ][ min_lag_4kHz ] = (opus_int16)silk_SAT16( temp32 ); /* Q0 */ + matrix_ptr( C, k, 0, CSTRIDE_4KHZ ) = + (opus_int16)silk_DIV32_varQ( cross_corr, normalizer, 13 + 1 ); /* Q13 */ /* From now on normalizer is computed recursively */ - for( d = min_lag_4kHz + 1; d <= max_lag_4kHz; d++ ) { + for( d = MIN_LAG_4KHZ + 1; d <= MAX_LAG_4KHZ; d++ ) { basis_ptr--; /* Check that we are within range of the array */ silk_assert( basis_ptr >= frame_4kHz ); - silk_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); + silk_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); - cross_corr = silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz ); + cross_corr = xcorr32[ MAX_LAG_4KHZ - d ]; /* Add contribution of new sample and remove contribution from oldest sample */ - normalizer += + normalizer = silk_ADD32( normalizer, silk_SMULBB( basis_ptr[ 0 ], basis_ptr[ 0 ] ) - - silk_SMULBB( basis_ptr[ sf_length_8kHz ], basis_ptr[ sf_length_8kHz ] ); + silk_SMULBB( basis_ptr[ SF_LENGTH_8KHZ ], basis_ptr[ SF_LENGTH_8KHZ ] ) ); - temp32 = silk_DIV32( cross_corr, silk_SQRT_APPROX( normalizer ) + 1 ); - C[ k ][ d ] = (opus_int16)silk_SAT16( temp32 ); /* Q0 */ + matrix_ptr( C, k, d - MIN_LAG_4KHZ, CSTRIDE_4KHZ) = + (opus_int16)silk_DIV32_varQ( cross_corr, normalizer, 13 + 1 ); /* Q13 */ } /* Update target pointer */ - target_ptr += sf_length_8kHz; + target_ptr += SF_LENGTH_8KHZ; } /* Combine two subframes into single correlation measure and apply short-lag bias */ if( nb_subfr == PE_MAX_NB_SUBFR ) { - for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) { - sum = (opus_int32)C[ 0 ][ i ] + (opus_int32)C[ 1 ][ i ]; /* Q0 */ - silk_assert( silk_RSHIFT( sum, 1 ) == silk_SAT16( silk_RSHIFT( sum, 1 ) ) ); - sum = silk_RSHIFT( sum, 1 ); /* Q-1 */ - silk_assert( silk_LSHIFT( (opus_int32)-i, 4 ) == silk_SAT16( silk_LSHIFT( (opus_int32)-i, 4 ) ) ); - sum = silk_SMLAWB( sum, sum, silk_LSHIFT( -i, 4 ) ); /* Q-1 */ - silk_assert( sum == silk_SAT16( sum ) ); - C[ 0 ][ i ] = (opus_int16)sum; /* Q-1 */ + for( i = MAX_LAG_4KHZ; i >= MIN_LAG_4KHZ; i-- ) { + sum = (opus_int32)matrix_ptr( C, 0, i - MIN_LAG_4KHZ, CSTRIDE_4KHZ ) + + (opus_int32)matrix_ptr( C, 1, i - MIN_LAG_4KHZ, CSTRIDE_4KHZ ); /* Q14 */ + sum = silk_SMLAWB( sum, sum, silk_LSHIFT( -i, 4 ) ); /* Q14 */ + C[ i - MIN_LAG_4KHZ ] = (opus_int16)sum; /* Q14 */ } } else { /* Only short-lag bias */ - for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) { - sum = (opus_int32)C[ 0 ][ i ]; - sum = silk_SMLAWB( sum, sum, silk_LSHIFT( -i, 4 ) ); /* Q-1 */ - C[ 0 ][ i ] = (opus_int16)sum; /* Q-1 */ + for( i = MAX_LAG_4KHZ; i >= MIN_LAG_4KHZ; i-- ) { + sum = silk_LSHIFT( (opus_int32)C[ i - MIN_LAG_4KHZ ], 1 ); /* Q14 */ + sum = silk_SMLAWB( sum, sum, silk_LSHIFT( -i, 4 ) ); /* Q14 */ + C[ i - MIN_LAG_4KHZ ] = (opus_int16)sum; /* Q14 */ } } /* Sort */ length_d_srch = silk_ADD_LSHIFT32( 4, complexity, 1 ); - silk_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); - silk_insertion_sort_decreasing_int16( &C[ 0 ][ min_lag_4kHz ], d_srch, max_lag_4kHz - min_lag_4kHz + 1, length_d_srch ); + celt_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); + silk_insertion_sort_decreasing_int16( C, d_srch, CSTRIDE_4KHZ, + length_d_srch ); /* Escape if correlation is very low already here */ - target_ptr = &frame_4kHz[ silk_SMULBB( sf_length_4kHz, nb_subfr ) ]; - energy = silk_inner_prod_aligned( target_ptr, target_ptr, silk_LSHIFT( sf_length_4kHz, 2 ) ); - energy = silk_ADD_SAT32( energy, 1000 ); /* Q0 */ - Cmax = (opus_int)C[ 0 ][ min_lag_4kHz ]; /* Q-1 */ - threshold = silk_SMULBB( Cmax, Cmax ); /* Q-2 */ - - /* Compare in Q-2 domain */ - if( silk_RSHIFT( energy, 4 + 2 ) > threshold ) { + Cmax = (opus_int)C[ 0 ]; /* Q14 */ + if( Cmax < SILK_FIX_CONST( 0.2, 14 ) ) { silk_memset( pitch_out, 0, nb_subfr * sizeof( opus_int ) ); *LTPCorr_Q15 = 0; *lagIndex = 0; *contourIndex = 0; + RESTORE_STACK; return 1; } threshold = silk_SMULWB( search_thres1_Q16, Cmax ); for( i = 0; i < length_d_srch; i++ ) { /* Convert to 8 kHz indices for the sorted correlation that exceeds the threshold */ - if( C[ 0 ][ min_lag_4kHz + i ] > threshold ) { - d_srch[ i ] = silk_LSHIFT( d_srch[ i ] + min_lag_4kHz, 1 ); + if( C[ i ] > threshold ) { + d_srch[ i ] = silk_LSHIFT( d_srch[ i ] + MIN_LAG_4KHZ, 1 ); } else { length_d_srch = i; break; } } - silk_assert( length_d_srch > 0 ); + celt_assert( length_d_srch > 0 ); - for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) { - d_comp[ i ] = 0; + ALLOC( d_comp, D_COMP_STRIDE, opus_int16 ); + for( i = D_COMP_MIN; i < D_COMP_MAX; i++ ) { + d_comp[ i - D_COMP_MIN ] = 0; } for( i = 0; i < length_d_srch; i++ ) { - d_comp[ d_srch[ i ] ] = 1; + d_comp[ d_srch[ i ] - D_COMP_MIN ] = 1; } /* Convolution */ - for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) { - d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ]; + for( i = D_COMP_MAX - 1; i >= MIN_LAG_8KHZ; i-- ) { + d_comp[ i - D_COMP_MIN ] += + d_comp[ i - 1 - D_COMP_MIN ] + d_comp[ i - 2 - D_COMP_MIN ]; } length_d_srch = 0; - for( i = min_lag_8kHz; i < max_lag_8kHz + 1; i++ ) { - if( d_comp[ i + 1 ] > 0 ) { + for( i = MIN_LAG_8KHZ; i < MAX_LAG_8KHZ + 1; i++ ) { + if( d_comp[ i + 1 - D_COMP_MIN ] > 0 ) { d_srch[ length_d_srch ] = i; length_d_srch++; } } /* Convolution */ - for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) { - d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ] + d_comp[ i - 3 ]; + for( i = D_COMP_MAX - 1; i >= MIN_LAG_8KHZ; i-- ) { + d_comp[ i - D_COMP_MIN ] += d_comp[ i - 1 - D_COMP_MIN ] + + d_comp[ i - 2 - D_COMP_MIN ] + d_comp[ i - 3 - D_COMP_MIN ]; } length_d_comp = 0; - for( i = min_lag_8kHz; i < max_lag_8kHz + 4; i++ ) { - if( d_comp[ i ] > 0 ) { + for( i = MIN_LAG_8KHZ; i < D_COMP_MAX; i++ ) { + if( d_comp[ i - D_COMP_MIN ] > 0 ) { d_comp[ length_d_comp ] = i - 2; length_d_comp++; } @@ -302,57 +316,40 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation *************************************************************************************/ - /****************************************************************************** - ** Scale signal down to avoid correlations measures from overflowing - *******************************************************************************/ - /* find scaling as max scaling for each subframe */ - shift = silk_P_Ana_find_scaling( frame_8kHz, frame_length_8kHz, sf_length_8kHz ); - if( shift > 0 ) { - for( i = 0; i < frame_length_8kHz; i++ ) { - frame_8kHz[ i ] = silk_RSHIFT( frame_8kHz[ i ], shift ); - } - } - /********************************************************************************* * Find energy of each subframe projected onto its history, for a range of delays *********************************************************************************/ - silk_memset( C, 0, PE_MAX_NB_SUBFR * ( ( PE_MAX_LAG >> 1 ) + 5 ) * sizeof( opus_int16 ) ); + silk_memset( C, 0, nb_subfr * CSTRIDE_8KHZ * sizeof( opus_int16 ) ); target_ptr = &frame_8kHz[ PE_LTP_MEM_LENGTH_MS * 8 ]; for( k = 0; k < nb_subfr; k++ ) { /* Check that we are within range of the array */ - silk_assert( target_ptr >= frame_8kHz ); - silk_assert( target_ptr + sf_length_8kHz <= frame_8kHz + frame_length_8kHz ); + celt_assert( target_ptr >= frame_8kHz ); + celt_assert( target_ptr + SF_LENGTH_8KHZ <= frame_8kHz + frame_length_8kHz ); - energy_target = silk_inner_prod_aligned( target_ptr, target_ptr, sf_length_8kHz ); + energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_8KHZ, arch ), 1 ); for( j = 0; j < length_d_comp; j++ ) { d = d_comp[ j ]; basis_ptr = target_ptr - d; /* Check that we are within range of the array */ silk_assert( basis_ptr >= frame_8kHz ); - silk_assert( basis_ptr + sf_length_8kHz <= frame_8kHz + frame_length_8kHz ); + silk_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_8kHz + frame_length_8kHz ); - cross_corr = silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz ); - energy_basis = silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length_8kHz ); + cross_corr = silk_inner_prod_aligned( target_ptr, basis_ptr, SF_LENGTH_8KHZ, arch ); if( cross_corr > 0 ) { - energy = silk_max( energy_target, energy_basis ); /* Find max to make sure first division < 1.0 */ - lz = silk_CLZ32( cross_corr ); - lshift = silk_LIMIT_32( lz - 1, 0, 15 ); - temp32 = silk_DIV32( silk_LSHIFT( cross_corr, lshift ), silk_RSHIFT( energy, 15 - lshift ) + 1 ); /* Q15 */ - silk_assert( temp32 == silk_SAT16( temp32 ) ); - temp32 = silk_SMULWB( cross_corr, temp32 ); /* Q(-1), cc * ( cc / max(b, t) ) */ - temp32 = silk_ADD_SAT32( temp32, temp32 ); /* Q(0) */ - lz = silk_CLZ32( temp32 ); - lshift = silk_LIMIT_32( lz - 1, 0, 15 ); - energy = silk_min( energy_target, energy_basis ); - C[ k ][ d ] = silk_DIV32( silk_LSHIFT( temp32, lshift ), silk_RSHIFT( energy, 15 - lshift ) + 1 ); /* Q15*/ + energy_basis = silk_inner_prod_aligned( basis_ptr, basis_ptr, SF_LENGTH_8KHZ, arch ); + matrix_ptr( C, k, d - ( MIN_LAG_8KHZ - 2 ), CSTRIDE_8KHZ ) = + (opus_int16)silk_DIV32_varQ( cross_corr, + silk_ADD32( energy_target, + energy_basis ), + 13 + 1 ); /* Q13 */ } else { - C[ k ][ d ] = 0; + matrix_ptr( C, k, d - ( MIN_LAG_8KHZ - 2 ), CSTRIDE_8KHZ ) = 0; } } - target_ptr += sf_length_8kHz; + target_ptr += SF_LENGTH_8KHZ; } /* search over lag range and lags codebook */ @@ -374,7 +371,7 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 } else { prevLag_log2_Q7 = 0; } - silk_assert( search_thres2_Q15 == silk_SAT16( search_thres2_Q15 ) ); + silk_assert( search_thres2_Q13 == silk_SAT16( search_thres2_Q13 ) ); /* Set up stage 2 codebook based on number of subframes */ if( nb_subfr == PE_MAX_NB_SUBFR ) { cbk_size = PE_NB_CBKS_STAGE2_EXT; @@ -385,12 +382,10 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 } else { nb_cbk_search = PE_NB_CBKS_STAGE2; } - corr_thres_Q15 = silk_RSHIFT( silk_SMULBB( search_thres2_Q15, search_thres2_Q15 ), 13 ); } else { cbk_size = PE_NB_CBKS_STAGE2_10MS; Lag_CB_ptr = &silk_CB_lags_stage2_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE2_10MS; - corr_thres_Q15 = silk_RSHIFT( silk_SMULBB( search_thres2_Q15, search_thres2_Q15 ), 14 ); } for( k = 0; k < length_d_srch; k++ ) { @@ -398,8 +393,13 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 for( j = 0; j < nb_cbk_search; j++ ) { CC[ j ] = 0; for( i = 0; i < nb_subfr; i++ ) { + opus_int d_subfr; /* Try all codebooks */ - CC[ j ] = CC[ j ] + (opus_int32)C[ i ][ d + matrix_ptr( Lag_CB_ptr, i, j, cbk_size )]; + d_subfr = d + matrix_ptr( Lag_CB_ptr, i, j, cbk_size ); + CC[ j ] = CC[ j ] + + (opus_int32)matrix_ptr( C, i, + d_subfr - ( MIN_LAG_8KHZ - 2 ), + CSTRIDE_8KHZ ); } } /* Find best codebook */ @@ -413,25 +413,25 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 } /* Bias towards shorter lags */ - lag_log2_Q7 = silk_lin2log( (opus_int32)d ); /* Q7 */ + lag_log2_Q7 = silk_lin2log( d ); /* Q7 */ silk_assert( lag_log2_Q7 == silk_SAT16( lag_log2_Q7 ) ); - silk_assert( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 15 ) == silk_SAT16( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 15 ) ) ); - CCmax_new_b = CCmax_new - silk_RSHIFT( silk_SMULBB( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 15 ), lag_log2_Q7 ), 7 ); /* Q15 */ + silk_assert( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 13 ) == silk_SAT16( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 13 ) ) ); + CCmax_new_b = CCmax_new - silk_RSHIFT( silk_SMULBB( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 13 ), lag_log2_Q7 ), 7 ); /* Q13 */ /* Bias towards previous lag */ - silk_assert( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 15 ) == silk_SAT16( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 15 ) ) ); + silk_assert( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 13 ) == silk_SAT16( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 13 ) ) ); if( prevLag > 0 ) { delta_lag_log2_sqr_Q7 = lag_log2_Q7 - prevLag_log2_Q7; silk_assert( delta_lag_log2_sqr_Q7 == silk_SAT16( delta_lag_log2_sqr_Q7 ) ); delta_lag_log2_sqr_Q7 = silk_RSHIFT( silk_SMULBB( delta_lag_log2_sqr_Q7, delta_lag_log2_sqr_Q7 ), 7 ); - prev_lag_bias_Q15 = silk_RSHIFT( silk_SMULBB( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 15 ), *LTPCorr_Q15 ), 15 ); /* Q15 */ - prev_lag_bias_Q15 = silk_DIV32( silk_MUL( prev_lag_bias_Q15, delta_lag_log2_sqr_Q7 ), delta_lag_log2_sqr_Q7 + ( 1 << 6 ) ); - CCmax_new_b -= prev_lag_bias_Q15; /* Q15 */ + prev_lag_bias_Q13 = silk_RSHIFT( silk_SMULBB( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 13 ), *LTPCorr_Q15 ), 15 ); /* Q13 */ + prev_lag_bias_Q13 = silk_DIV32( silk_MUL( prev_lag_bias_Q13, delta_lag_log2_sqr_Q7 ), delta_lag_log2_sqr_Q7 + SILK_FIX_CONST( 0.5, 7 ) ); + CCmax_new_b -= prev_lag_bias_Q13; /* Q13 */ } if( CCmax_new_b > CCmax_b && /* Find maximum biased correlation */ - CCmax_new > corr_thres_Q15 && /* Correlation needs to be high enough to be voiced */ - silk_CB_lags_stage2[ 0 ][ CBimax_new ] <= min_lag_8kHz /* Lag must be in range */ + CCmax_new > silk_SMULBB( nb_subfr, search_thres2_Q13 ) && /* Correlation needs to be high enough to be voiced */ + silk_CB_lags_stage2[ 0 ][ CBimax_new ] <= MIN_LAG_8KHZ /* Lag must be in range */ ) { CCmax_b = CCmax_new_b; CCmax = CCmax_new; @@ -446,26 +446,15 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 *LTPCorr_Q15 = 0; *lagIndex = 0; *contourIndex = 0; + RESTORE_STACK; return 1; } - if( Fs_kHz > 8 ) { - /***************************************************************************/ - /* Scale input signal down to avoid correlations measures from overflowing */ - /***************************************************************************/ - /* find scaling as max scaling for each subframe */ - shift = silk_P_Ana_find_scaling( frame, frame_length, sf_length ); - if( shift > 0 ) { - /* Move signal to scratch mem because the input signal should be unchanged */ - /* Reuse the 32 bit scratch mem vector, use a 16 bit pointer from now */ - input_frame_ptr = (opus_int16*)scratch_mem; - for( i = 0; i < frame_length; i++ ) { - input_frame_ptr[ i ] = silk_RSHIFT( frame[ i ], shift ); - } - } else { - input_frame_ptr = (opus_int16*)frame; - } + /* Output normalized correlation */ + *LTPCorr_Q15 = (opus_int)silk_LSHIFT( silk_DIV32_16( CCmax, nb_subfr ), 2 ); + silk_assert( *LTPCorr_Q15 >= 0 ); + if( Fs_kHz > 8 ) { /* Search in original signal */ CBimax_old = CBimax; @@ -483,22 +472,13 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 start_lag = silk_max_int( lag - 2, min_lag ); end_lag = silk_min_int( lag + 2, max_lag ); lag_new = lag; /* to avoid undefined lag */ - CBimax = 0; /* to avoid undefined lag */ - silk_assert( silk_LSHIFT( CCmax, 13 ) >= 0 ); - *LTPCorr_Q15 = (opus_int)silk_SQRT_APPROX( silk_LSHIFT( CCmax, 13 ) ); /* Output normalized correlation */ + CBimax = 0; /* to avoid undefined lag */ CCmax = silk_int32_MIN; /* pitch lags according to second stage */ for( k = 0; k < nb_subfr; k++ ) { pitch_out[ k ] = lag + 2 * silk_CB_lags_stage2[ k ][ CBimax_old ]; } - /* Calculate the correlations and energies needed in stage 3 */ - silk_P_Ana_calc_corr_st3( crosscorr_st3, input_frame_ptr, start_lag, sf_length, nb_subfr, complexity ); - silk_P_Ana_calc_energy_st3( energies_st3, input_frame_ptr, start_lag, sf_length, nb_subfr, complexity ); - - lag_counter = 0; - silk_assert( lag == silk_SAT16( lag ) ); - contour_bias_Q20 = silk_DIV32_16( SILK_FIX_CONST( PE_FLATCONTOUR_BIAS, 20 ), lag ); /* Set up codebook parameters according to complexity setting and frame length */ if( nb_subfr == PE_MAX_NB_SUBFR ) { @@ -510,41 +490,43 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 cbk_size = PE_NB_CBKS_STAGE3_10MS; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; } + + /* Calculate the correlations and energies needed in stage 3 */ + ALLOC( energies_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); + ALLOC( cross_corr_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); + silk_P_Ana_calc_corr_st3( cross_corr_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); + silk_P_Ana_calc_energy_st3( energies_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); + + lag_counter = 0; + silk_assert( lag == silk_SAT16( lag ) ); + contour_bias_Q15 = silk_DIV32_16( SILK_FIX_CONST( PE_FLATCONTOUR_BIAS, 15 ), lag ); + + target_ptr = &frame[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; + energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, nb_subfr * sf_length, arch ), 1 ); for( d = start_lag; d <= end_lag; d++ ) { for( j = 0; j < nb_cbk_search; j++ ) { cross_corr = 0; - energy = 0; + energy = energy_target; for( k = 0; k < nb_subfr; k++ ) { - silk_assert( PE_MAX_NB_SUBFR == 4 ); - energy += silk_RSHIFT( energies_st3[ k ][ j ][ lag_counter ], 2 ); /* use mean, to avoid overflow */ + cross_corr = silk_ADD32( cross_corr, + matrix_ptr( cross_corr_st3, k, j, + nb_cbk_search )[ lag_counter ] ); + energy = silk_ADD32( energy, + matrix_ptr( energies_st3, k, j, + nb_cbk_search )[ lag_counter ] ); silk_assert( energy >= 0 ); - cross_corr += silk_RSHIFT( crosscorr_st3[ k ][ j ][ lag_counter ], 2 ); /* use mean, to avoid overflow */ } if( cross_corr > 0 ) { - /* Divide cross_corr / energy and get result in Q15 */ - lz = silk_CLZ32( cross_corr ); - /* Divide with result in Q13, cross_corr could be larger than energy */ - lshift = silk_LIMIT_32( lz - 1, 0, 13 ); - CCmax_new = silk_DIV32( silk_LSHIFT( cross_corr, lshift ), silk_RSHIFT( energy, 13 - lshift ) + 1 ); - CCmax_new = silk_SAT16( CCmax_new ); - CCmax_new = silk_SMULWB( cross_corr, CCmax_new ); - /* Saturate */ - if( CCmax_new > silk_RSHIFT( silk_int32_MAX, 3 ) ) { - CCmax_new = silk_int32_MAX; - } else { - CCmax_new = silk_LSHIFT( CCmax_new, 3 ); - } + CCmax_new = silk_DIV32_varQ( cross_corr, energy, 13 + 1 ); /* Q13 */ /* Reduce depending on flatness of contour */ - diff = silk_int16_MAX - silk_RSHIFT( silk_MUL( contour_bias_Q20, j ), 5 ); /* Q20 -> Q15 */ + diff = silk_int16_MAX - silk_MUL( contour_bias_Q15, j ); /* Q15 */ silk_assert( diff == silk_SAT16( diff ) ); - CCmax_new = silk_LSHIFT( silk_SMULWB( CCmax_new, diff ), 1 ); + CCmax_new = silk_SMULWB( CCmax_new, diff ); /* Q14 */ } else { CCmax_new = 0; } - if( CCmax_new > CCmax && - ( d + silk_CB_lags_stage3[ 0 ][ j ] ) <= max_lag - ) { + if( CCmax_new > CCmax && ( d + silk_CB_lags_stage3[ 0 ][ j ] ) <= max_lag ) { CCmax = CCmax_new; lag_new = d; CBimax = j; @@ -560,43 +542,53 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 *lagIndex = (opus_int16)( lag_new - min_lag); *contourIndex = (opus_int8)CBimax; } else { /* Fs_kHz == 8 */ - /* Save Lags and correlation */ - CCmax = silk_max( CCmax, 0 ); - *LTPCorr_Q15 = (opus_int)silk_SQRT_APPROX( silk_LSHIFT( CCmax, 13 ) ); /* Output normalized correlation */ + /* Save Lags */ for( k = 0; k < nb_subfr; k++ ) { pitch_out[ k ] = lag + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size ); - pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], min_lag_8kHz, PE_MAX_LAG_MS * Fs_kHz ); + pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], MIN_LAG_8KHZ, PE_MAX_LAG_MS * 8 ); } - *lagIndex = (opus_int16)( lag - min_lag_8kHz ); + *lagIndex = (opus_int16)( lag - MIN_LAG_8KHZ ); *contourIndex = (opus_int8)CBimax; } - silk_assert( *lagIndex >= 0 ); + celt_assert( *lagIndex >= 0 ); /* return as voiced */ + RESTORE_STACK; return 0; } -/*************************************************************************/ -/* Calculates the correlations used in stage 3 search. In order to cover */ -/* the whole lag codebook for all the searched offset lags (lag +- 2), */ -/*************************************************************************/ -void silk_P_Ana_calc_corr_st3( - opus_int32 cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ],/* (O) 3 DIM correlation array */ +/*********************************************************************** + * Calculates the correlations used in stage 3 search. In order to cover + * the whole lag codebook for all the searched offset lags (lag +- 2), + * the following correlations are needed in each sub frame: + * + * sf1: lag range [-8,...,7] total 16 correlations + * sf2: lag range [-4,...,4] total 9 correlations + * sf3: lag range [-3,....4] total 8 correltions + * sf4: lag range [-6,....8] total 15 correlations + * + * In total 48 correlations. The direct implementation computed in worst + * case 4*12*5 = 240 correlations, but more likely around 120. + ***********************************************************************/ +static void silk_P_Ana_calc_corr_st3( + silk_pe_stage3_vals cross_corr_st3[], /* O 3 DIM correlation array */ const opus_int16 frame[], /* I vector to correlate */ opus_int start_lag, /* I lag offset to search around */ opus_int sf_length, /* I length of a 5 ms subframe */ opus_int nb_subfr, /* I number of subframes */ - opus_int complexity /* I Complexity setting */ + opus_int complexity, /* I Complexity setting */ + int arch /* I Run-time architecture */ ) { - const opus_int16 *target_ptr, *basis_ptr; - opus_int32 cross_corr; + const opus_int16 *target_ptr; opus_int i, j, k, lag_counter, lag_low, lag_high; opus_int nb_cbk_search, delta, idx, cbk_size; - opus_int32 scratch_mem[ SCRATCH_SIZE ]; + VARDECL( opus_int32, scratch_mem ); + VARDECL( opus_int32, xcorr32 ); const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; + SAVE_STACK; - silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); - silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); + celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); + celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; @@ -604,12 +596,14 @@ void silk_P_Ana_calc_corr_st3( nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); + celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; cbk_size = PE_NB_CBKS_STAGE3_10MS; } + ALLOC( scratch_mem, SCRATCH_SIZE, opus_int32 ); + ALLOC( xcorr32, SCRATCH_SIZE, opus_int32 ); target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */ for( k = 0; k < nb_subfr; k++ ) { @@ -618,11 +612,11 @@ void silk_P_Ana_calc_corr_st3( /* Calculate the correlations for each subframe */ lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 ); lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 ); + celt_assert(lag_high-lag_low+1 <= SCRATCH_SIZE); + celt_pitch_xcorr( target_ptr, target_ptr - start_lag - lag_high, xcorr32, sf_length, lag_high - lag_low + 1, arch ); for( j = lag_low; j <= lag_high; j++ ) { - basis_ptr = target_ptr - ( start_lag + j ); - cross_corr = silk_inner_prod_aligned( (opus_int16*)target_ptr, (opus_int16*)basis_ptr, sf_length ); silk_assert( lag_counter < SCRATCH_SIZE ); - scratch_mem[ lag_counter ] = cross_corr; + scratch_mem[ lag_counter ] = xcorr32[ lag_high - j ]; lag_counter++; } @@ -634,35 +628,39 @@ void silk_P_Ana_calc_corr_st3( for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) { silk_assert( idx + j < SCRATCH_SIZE ); silk_assert( idx + j < lag_counter ); - cross_corr_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ]; + matrix_ptr( cross_corr_st3, k, i, nb_cbk_search )[ j ] = + scratch_mem[ idx + j ]; } } target_ptr += sf_length; } + RESTORE_STACK; } /********************************************************************/ /* Calculate the energies for first two subframes. The energies are */ /* calculated recursively. */ /********************************************************************/ -void silk_P_Ana_calc_energy_st3( - opus_int32 energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ],/* (O) 3 DIM energy array */ - const opus_int16 frame[], /* I vector to calc energy in */ - opus_int start_lag, /* I lag offset to search around */ - opus_int sf_length, /* I length of one 5 ms subframe */ - opus_int nb_subfr, /* I number of subframes */ - opus_int complexity /* I Complexity setting */ +static void silk_P_Ana_calc_energy_st3( + silk_pe_stage3_vals energies_st3[], /* O 3 DIM energy array */ + const opus_int16 frame[], /* I vector to calc energy in */ + opus_int start_lag, /* I lag offset to search around */ + opus_int sf_length, /* I length of one 5 ms subframe */ + opus_int nb_subfr, /* I number of subframes */ + opus_int complexity, /* I Complexity setting */ + int arch /* I Run-time architecture */ ) { const opus_int16 *target_ptr, *basis_ptr; opus_int32 energy; opus_int k, i, j, lag_counter; opus_int nb_cbk_search, delta, idx, cbk_size, lag_diff; - opus_int32 scratch_mem[ SCRATCH_SIZE ]; + VARDECL( opus_int32, scratch_mem ); const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; + SAVE_STACK; - silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); - silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); + celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); + celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; @@ -670,19 +668,21 @@ void silk_P_Ana_calc_energy_st3( nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); + celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; cbk_size = PE_NB_CBKS_STAGE3_10MS; } + ALLOC( scratch_mem, SCRATCH_SIZE, opus_int32 ); + target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; for( k = 0; k < nb_subfr; k++ ) { lag_counter = 0; /* Calculate the energy for first lag */ basis_ptr = target_ptr - ( start_lag + matrix_ptr( Lag_range_ptr, k, 0, 2 ) ); - energy = silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length ); + energy = silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length, arch ); silk_assert( energy >= 0 ); scratch_mem[ lag_counter ] = energy; lag_counter++; @@ -709,37 +709,13 @@ void silk_P_Ana_calc_energy_st3( for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) { silk_assert( idx + j < SCRATCH_SIZE ); silk_assert( idx + j < lag_counter ); - energies_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ]; - silk_assert( energies_st3[ k ][ i ][ j ] >= 0 ); + matrix_ptr( energies_st3, k, i, nb_cbk_search )[ j ] = + scratch_mem[ idx + j ]; + silk_assert( + matrix_ptr( energies_st3, k, i, nb_cbk_search )[ j ] >= 0 ); } } target_ptr += sf_length; } -} - -opus_int32 silk_P_Ana_find_scaling( - const opus_int16 *frame, - const opus_int frame_length, - const opus_int sum_sqr_len -) -{ - opus_int32 nbits, x_max; - - x_max = silk_int16_array_maxabs( frame, frame_length ); - - if( x_max < silk_int16_MAX ) { - /* Number of bits needed for the sum of the squares */ - nbits = 32 - silk_CLZ32( silk_SMULBB( x_max, x_max ) ); - } else { - /* Here we don't know if x_max should have been silk_int16_MAX + 1, so we expect the worst case */ - nbits = 30; - } - nbits += 17 - silk_CLZ16( sum_sqr_len ); - - /* Without a guarantee of saturation, we need to keep the 31st bit free */ - if( nbits < 31 ) { - return 0; - } else { - return( nbits - 30 ); - } + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/fixed/process_gains_FIX.c b/external/opus-1.3.1/silk/fixed/process_gains_FIX.c similarity index 99% rename from external/opus-1.0.3/silk/fixed/process_gains_FIX.c rename to external/opus-1.3.1/silk/fixed/process_gains_FIX.c index 22d3a71a..05aba317 100644 --- a/external/opus-1.0.3/silk/fixed/process_gains_FIX.c +++ b/external/opus-1.3.1/silk/fixed/process_gains_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/fixed/regularize_correlations_FIX.c b/external/opus-1.3.1/silk/fixed/regularize_correlations_FIX.c similarity index 99% rename from external/opus-1.0.3/silk/fixed/regularize_correlations_FIX.c rename to external/opus-1.3.1/silk/fixed/regularize_correlations_FIX.c index 098c1509..a2836b05 100644 --- a/external/opus-1.0.3/silk/fixed/regularize_correlations_FIX.c +++ b/external/opus-1.3.1/silk/fixed/regularize_correlations_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/fixed/residual_energy16_FIX.c b/external/opus-1.3.1/silk/fixed/residual_energy16_FIX.c similarity index 97% rename from external/opus-1.0.3/silk/fixed/residual_energy16_FIX.c rename to external/opus-1.3.1/silk/fixed/residual_energy16_FIX.c index d61e8493..7f130f3d 100644 --- a/external/opus-1.0.3/silk/fixed/residual_energy16_FIX.c +++ b/external/opus-1.3.1/silk/fixed/residual_energy16_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -47,10 +47,10 @@ opus_int32 silk_residual_energy16_covar_FIX( const opus_int32 *pRow; /* Safety checks */ - silk_assert( D >= 0 ); - silk_assert( D <= 16 ); - silk_assert( cQ > 0 ); - silk_assert( cQ < 16 ); + celt_assert( D >= 0 ); + celt_assert( D <= 16 ); + celt_assert( cQ > 0 ); + celt_assert( cQ < 16 ); lshifts = 16 - cQ; Qxtra = lshifts; diff --git a/external/opus-1.0.3/silk/fixed/residual_energy_FIX.c b/external/opus-1.3.1/silk/fixed/residual_energy_FIX.c similarity index 89% rename from external/opus-1.0.3/silk/fixed/residual_energy_FIX.c rename to external/opus-1.3.1/silk/fixed/residual_energy_FIX.c index f284e51f..6c7cade9 100644 --- a/external/opus-1.0.3/silk/fixed/residual_energy_FIX.c +++ b/external/opus-1.3.1/silk/fixed/residual_energy_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main_FIX.h" +#include "stack_alloc.h" /* Calculates residual energies of input subframes where all subframes have LPC_order */ /* of preceding samples */ @@ -41,21 +42,26 @@ void silk_residual_energy_FIX( const opus_int32 gains[ MAX_NB_SUBFR ], /* I Quantization gains */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr, /* I Number of subframes */ - const opus_int LPC_order /* I LPC order */ + const opus_int LPC_order, /* I LPC order */ + int arch /* I Run-time architecture */ ) { opus_int offset, i, j, rshift, lz1, lz2; - opus_int16 *LPC_res_ptr, LPC_res[ ( MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ) / 2 ]; + opus_int16 *LPC_res_ptr; + VARDECL( opus_int16, LPC_res ); const opus_int16 *x_ptr; opus_int32 tmp32; + SAVE_STACK; x_ptr = x; offset = LPC_order + subfr_length; /* Filter input to create the LPC residual for each frame half, and measure subframe energies */ + ALLOC( LPC_res, ( MAX_NB_SUBFR >> 1 ) * offset, opus_int16 ); + celt_assert( ( nb_subfr >> 1 ) * ( MAX_NB_SUBFR >> 1 ) == nb_subfr ); for( i = 0; i < nb_subfr >> 1; i++ ) { /* Calculate half frame LPC residual signal including preceding samples */ - silk_LPC_analysis_filter( LPC_res, x_ptr, a_Q12[ i ], ( MAX_NB_SUBFR >> 1 ) * offset, LPC_order ); + silk_LPC_analysis_filter( LPC_res, x_ptr, a_Q12[ i ], ( MAX_NB_SUBFR >> 1 ) * offset, LPC_order, arch ); /* Point to first subframe of the just calculated LPC residual signal */ LPC_res_ptr = LPC_res + LPC_order; @@ -88,4 +94,5 @@ void silk_residual_energy_FIX( nrgs[ i ] = silk_SMMUL( tmp32, silk_LSHIFT32( nrgs[ i ], lz1 ) ); /* Q( nrgsQ[ i ] + lz1 + 2 * lz2 - 32 - 32 )*/ nrgsQ[ i ] += lz1 + 2 * lz2 - 32 - 32; } + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/fixed/schur64_FIX.c b/external/opus-1.3.1/silk/fixed/schur64_FIX.c similarity index 96% rename from external/opus-1.0.3/silk/fixed/schur64_FIX.c rename to external/opus-1.3.1/silk/fixed/schur64_FIX.c index 1701d5ba..4b7e19ea 100644 --- a/external/opus-1.0.3/silk/fixed/schur64_FIX.c +++ b/external/opus-1.3.1/silk/fixed/schur64_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -43,7 +43,7 @@ opus_int32 silk_schur64( /* O returns residual ene opus_int32 C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; opus_int32 Ctmp1_Q30, Ctmp2_Q30, rc_tmp_Q31; - silk_assert( order==6||order==8||order==10||order==12||order==14||order==16 ); + celt_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); /* Check for invalid input */ if( c[ 0 ] <= 0 ) { @@ -51,9 +51,10 @@ opus_int32 silk_schur64( /* O returns residual ene return 0; } - for( k = 0; k < order + 1; k++ ) { + k = 0; + do { C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; - } + } while( ++k <= order ); for( k = 0; k < order; k++ ) { /* Check that we won't be getting an unstable rc, otherwise stop here. */ diff --git a/external/opus-1.0.3/silk/fixed/schur_FIX.c b/external/opus-1.3.1/silk/fixed/schur_FIX.c similarity index 94% rename from external/opus-1.0.3/silk/fixed/schur_FIX.c rename to external/opus-1.3.1/silk/fixed/schur_FIX.c index 37dc42c6..2840f6b1 100644 --- a/external/opus-1.0.3/silk/fixed/schur_FIX.c +++ b/external/opus-1.3.1/silk/fixed/schur_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -43,28 +43,29 @@ opus_int32 silk_schur( /* O Returns residual ene opus_int32 C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; opus_int32 Ctmp1, Ctmp2, rc_tmp_Q15; - silk_assert( order==6||order==8||order==10||order==12||order==14||order==16 ); + celt_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); /* Get number of leading zeros */ lz = silk_CLZ32( c[ 0 ] ); /* Copy correlations and adjust level to Q30 */ + k = 0; if( lz < 2 ) { /* lz must be 1, so shift one to the right */ - for( k = 0; k < order + 1; k++ ) { + do { C[ k ][ 0 ] = C[ k ][ 1 ] = silk_RSHIFT( c[ k ], 1 ); - } + } while( ++k <= order ); } else if( lz > 2 ) { /* Shift to the left */ lz -= 2; - for( k = 0; k < order + 1; k++ ) { + do { C[ k ][ 0 ] = C[ k ][ 1 ] = silk_LSHIFT( c[ k ], lz ); - } + } while( ++k <= order ); } else { /* No need to shift */ - for( k = 0; k < order + 1; k++ ) { + do { C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; - } + } while( ++k <= order ); } for( k = 0; k < order; k++ ) { diff --git a/external/opus-1.0.3/silk/fixed/structs_FIX.h b/external/opus-1.3.1/silk/fixed/structs_FIX.h similarity index 82% rename from external/opus-1.0.3/silk/fixed/structs_FIX.h rename to external/opus-1.3.1/silk/fixed/structs_FIX.h index e4d4cdb8..2774a97b 100644 --- a/external/opus-1.0.3/silk/fixed/structs_FIX.h +++ b/external/opus-1.3.1/silk/fixed/structs_FIX.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -47,31 +47,17 @@ typedef struct { opus_int32 Tilt_smth_Q16; } silk_shape_state_FIX; -/********************************/ -/* Prefilter state */ -/********************************/ -typedef struct { - opus_int16 sLTP_shp[ LTP_BUF_LENGTH ]; - opus_int32 sAR_shp[ MAX_SHAPE_LPC_ORDER + 1 ]; - opus_int sLTP_shp_buf_idx; - opus_int32 sLF_AR_shp_Q12; - opus_int32 sLF_MA_shp_Q12; - opus_int32 sHarmHP_Q2; - opus_int32 rand_seed; - opus_int lagPrev; -} silk_prefilter_state_FIX; - /********************************/ /* Encoder state FIX */ /********************************/ typedef struct { silk_encoder_state sCmn; /* Common struct, shared with floating-point code */ silk_shape_state_FIX sShape; /* Shape state */ - silk_prefilter_state_FIX sPrefilt; /* Prefilter State */ /* Buffer for find pitch and noise shape analysis */ silk_DWORD_ALIGN opus_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */ opus_int LTPCorr_Q15; /* Normalized correlation from pitch lag estimator */ + opus_int32 resNrgSmth; } silk_encoder_state_FIX; /************************/ @@ -87,11 +73,8 @@ typedef struct { /* Noise shaping parameters */ /* Testing */ - silk_DWORD_ALIGN opus_int16 AR1_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; - silk_DWORD_ALIGN opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + silk_DWORD_ALIGN opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ - opus_int GainsPre_Q14[ MAX_NB_SUBFR ]; - opus_int HarmBoost_Q14[ MAX_NB_SUBFR ]; opus_int Tilt_Q14[ MAX_NB_SUBFR ]; opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ]; opus_int Lambda_Q10; @@ -99,7 +82,6 @@ typedef struct { opus_int coding_quality_Q14; /* measures */ - opus_int sparseness_Q8; opus_int32 predGain_Q16; opus_int LTPredCodGain_Q7; opus_int32 ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */ diff --git a/external/opus-1.0.3/silk/fixed/vector_ops_FIX.c b/external/opus-1.3.1/silk/fixed/vector_ops_FIX.c similarity index 78% rename from external/opus-1.0.3/silk/fixed/vector_ops_FIX.c rename to external/opus-1.3.1/silk/fixed/vector_ops_FIX.c index d6206024..d9498001 100644 --- a/external/opus-1.0.3/silk/fixed/vector_ops_FIX.c +++ b/external/opus-1.3.1/silk/fixed/vector_ops_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "SigProc_FIX.h" +#include "pitch.h" /* Copy and multiply a vector by a constant */ void silk_scale_copy_vector16( @@ -70,18 +71,23 @@ void silk_scale_vector32_Q26_lshift_18( opus_int32 silk_inner_prod_aligned( const opus_int16 *const inVec1, /* I input vector 1 */ const opus_int16 *const inVec2, /* I input vector 2 */ - const opus_int len /* I vector lengths */ + const opus_int len, /* I vector lengths */ + int arch /* I Run-time architecture */ ) { +#ifdef FIXED_POINT + return celt_inner_prod(inVec1, inVec2, len, arch); +#else opus_int i; opus_int32 sum = 0; for( i = 0; i < len; i++ ) { sum = silk_SMLABB( sum, inVec1[ i ], inVec2[ i ] ); } return sum; +#endif } -opus_int64 silk_inner_prod16_aligned_64( +opus_int64 silk_inner_prod16_aligned_64_c( const opus_int16 *inVec1, /* I input vector 1 */ const opus_int16 *inVec2, /* I input vector 2 */ const opus_int len /* I vector lengths */ @@ -94,34 +100,3 @@ opus_int64 silk_inner_prod16_aligned_64( } return sum; } - -/* Function that returns the maximum absolut value of the input vector */ -opus_int16 silk_int16_array_maxabs( /* O Maximum absolute value, max: 2^15-1 */ - const opus_int16 *vec, /* I Input vector [len] */ - const opus_int32 len /* I Length of input vector */ -) -{ - opus_int32 max = 0, i, lvl = 0, ind; - if( len == 0 ) return 0; - - ind = len - 1; - max = silk_SMULBB( vec[ ind ], vec[ ind ] ); - for( i = len - 2; i >= 0; i-- ) { - lvl = silk_SMULBB( vec[ i ], vec[ i ] ); - if( lvl > max ) { - max = lvl; - ind = i; - } - } - - /* Do not return 32768, as it will not fit in an int16 so may lead to problems later on */ - if( max >= 1073676289 ) { /* (2^15-1)^2 = 1073676289 */ - return( silk_int16_MAX ); - } else { - if( vec[ ind ] < 0 ) { - return( -vec[ ind ] ); - } else { - return( vec[ ind ] ); - } - } -} diff --git a/external/opus-1.0.3/silk/fixed/warped_autocorrelation_FIX.c b/external/opus-1.3.1/silk/fixed/warped_autocorrelation_FIX.c similarity index 93% rename from external/opus-1.0.3/silk/fixed/warped_autocorrelation_FIX.c rename to external/opus-1.3.1/silk/fixed/warped_autocorrelation_FIX.c index d7a3944b..5c79553b 100644 --- a/external/opus-1.0.3/silk/fixed/warped_autocorrelation_FIX.c +++ b/external/opus-1.3.1/silk/fixed/warped_autocorrelation_FIX.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -31,11 +31,14 @@ POSSIBILITY OF SUCH DAMAGE. #include "main_FIX.h" -#define QC 10 -#define QS 14 +#if defined(MIPSr1_ASM) +#include "mips/warped_autocorrelation_FIX_mipsr1.h" +#endif + /* Autocorrelations for a warped frequency axis */ -void silk_warped_autocorrelation_FIX( +#ifndef OVERRIDE_silk_warped_autocorrelation_FIX_c +void silk_warped_autocorrelation_FIX_c( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ @@ -50,7 +53,7 @@ void silk_warped_autocorrelation_FIX( opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; /* Order must be even */ - silk_assert( ( order & 1 ) == 0 ); + celt_assert( ( order & 1 ) == 0 ); silk_assert( 2 * QS - QC >= 0 ); /* Loop over samples */ @@ -86,3 +89,4 @@ void silk_warped_autocorrelation_FIX( } silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ } +#endif /* OVERRIDE_silk_warped_autocorrelation_FIX_c */ diff --git a/external/opus-1.3.1/silk/fixed/x86/burg_modified_FIX_sse4_1.c b/external/opus-1.3.1/silk/fixed/x86/burg_modified_FIX_sse4_1.c new file mode 100644 index 00000000..bbb1ce0f --- /dev/null +++ b/external/opus-1.3.1/silk/fixed/x86/burg_modified_FIX_sse4_1.c @@ -0,0 +1,377 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "SigProc_FIX.h" +#include "define.h" +#include "tuning_parameters.h" +#include "pitch.h" +#include "celt/x86/x86cpu.h" + +#define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384 */ + +#define QA 25 +#define N_BITS_HEAD_ROOM 2 +#define MIN_RSHIFTS -16 +#define MAX_RSHIFTS (32 - QA) + +/* Compute reflection coefficients from input signal */ +void silk_burg_modified_sse4_1( + opus_int32 *res_nrg, /* O Residual energy */ + opus_int *res_nrg_Q, /* O Residual energy Q value */ + opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ + const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ + const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ + const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ + const opus_int nb_subfr, /* I Number of subframes stacked in x */ + const opus_int D, /* I Order */ + int arch /* I Run-time architecture */ +) +{ + opus_int k, n, s, lz, rshifts, rshifts_extra, reached_max_gain; + opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2; + const opus_int16 *x_ptr; + opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ]; + opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ]; + opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ]; + opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ]; + opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ]; + opus_int32 xcorr[ SILK_MAX_ORDER_LPC ]; + + __m128i FIRST_3210, LAST_3210, ATMP_3210, TMP1_3210, TMP2_3210, T1_3210, T2_3210, PTR_3210, SUBFR_3210, X1_3210, X2_3210; + __m128i CONST1 = _mm_set1_epi32(1); + + celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); + + /* Compute autocorrelations, added over subframes */ + silk_sum_sqr_shift( &C0, &rshifts, x, nb_subfr * subfr_length ); + if( rshifts > MAX_RSHIFTS ) { + C0 = silk_LSHIFT32( C0, rshifts - MAX_RSHIFTS ); + silk_assert( C0 > 0 ); + rshifts = MAX_RSHIFTS; + } else { + lz = silk_CLZ32( C0 ) - 1; + rshifts_extra = N_BITS_HEAD_ROOM - lz; + if( rshifts_extra > 0 ) { + rshifts_extra = silk_min( rshifts_extra, MAX_RSHIFTS - rshifts ); + C0 = silk_RSHIFT32( C0, rshifts_extra ); + } else { + rshifts_extra = silk_max( rshifts_extra, MIN_RSHIFTS - rshifts ); + C0 = silk_LSHIFT32( C0, -rshifts_extra ); + } + rshifts += rshifts_extra; + } + CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ + silk_memset( C_first_row, 0, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); + if( rshifts > 0 ) { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + for( n = 1; n < D + 1; n++ ) { + C_first_row[ n - 1 ] += (opus_int32)silk_RSHIFT64( + silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n, arch ), rshifts ); + } + } + } else { + for( s = 0; s < nb_subfr; s++ ) { + int i; + opus_int32 d; + x_ptr = x + s * subfr_length; + celt_pitch_xcorr(x_ptr, x_ptr + 1, xcorr, subfr_length - D, D, arch ); + for( n = 1; n < D + 1; n++ ) { + for ( i = n + subfr_length - D, d = 0; i < subfr_length; i++ ) + d = MAC16_16( d, x_ptr[ i ], x_ptr[ i - n ] ); + xcorr[ n - 1 ] += d; + } + for( n = 1; n < D + 1; n++ ) { + C_first_row[ n - 1 ] += silk_LSHIFT32( xcorr[ n - 1 ], -rshifts ); + } + } + } + silk_memcpy( C_last_row, C_first_row, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); + + /* Initialize */ + CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ + + invGain_Q30 = (opus_int32)1 << 30; + reached_max_gain = 0; + for( n = 0; n < D; n++ ) { + /* Update first row of correlation matrix (without first element) */ + /* Update last row of correlation matrix (without last element, stored in reversed order) */ + /* Update C * Af */ + /* Update C * flipud(Af) (stored in reversed order) */ + if( rshifts > -2 ) { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], 16 - rshifts ); /* Q(16-rshifts) */ + x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 16 - rshifts ); /* Q(16-rshifts) */ + tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], QA - 16 ); /* Q(QA-16) */ + tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], QA - 16 ); /* Q(QA-16) */ + for( k = 0; k < n; k++ ) { + C_first_row[ k ] = silk_SMLAWB( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ + C_last_row[ k ] = silk_SMLAWB( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ + Atmp_QA = Af_QA[ k ]; + tmp1 = silk_SMLAWB( tmp1, Atmp_QA, x_ptr[ n - k - 1 ] ); /* Q(QA-16) */ + tmp2 = silk_SMLAWB( tmp2, Atmp_QA, x_ptr[ subfr_length - n + k ] ); /* Q(QA-16) */ + } + tmp1 = silk_LSHIFT32( -tmp1, 32 - QA - rshifts ); /* Q(16-rshifts) */ + tmp2 = silk_LSHIFT32( -tmp2, 32 - QA - rshifts ); /* Q(16-rshifts) */ + for( k = 0; k <= n; k++ ) { + CAf[ k ] = silk_SMLAWB( CAf[ k ], tmp1, x_ptr[ n - k ] ); /* Q( -rshift ) */ + CAb[ k ] = silk_SMLAWB( CAb[ k ], tmp2, x_ptr[ subfr_length - n + k - 1 ] ); /* Q( -rshift ) */ + } + } + } else { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], -rshifts ); /* Q( -rshifts ) */ + x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], -rshifts ); /* Q( -rshifts ) */ + tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], 17 ); /* Q17 */ + tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 17 ); /* Q17 */ + + X1_3210 = _mm_set1_epi32( x1 ); + X2_3210 = _mm_set1_epi32( x2 ); + TMP1_3210 = _mm_setzero_si128(); + TMP2_3210 = _mm_setzero_si128(); + for( k = 0; k < n - 3; k += 4 ) { + PTR_3210 = OP_CVTEPI16_EPI32_M64( &x_ptr[ n - k - 1 - 3 ] ); + SUBFR_3210 = OP_CVTEPI16_EPI32_M64( &x_ptr[ subfr_length - n + k ] ); + FIRST_3210 = _mm_loadu_si128( (__m128i *)&C_first_row[ k ] ); + PTR_3210 = _mm_shuffle_epi32( PTR_3210, _MM_SHUFFLE( 0, 1, 2, 3 ) ); + LAST_3210 = _mm_loadu_si128( (__m128i *)&C_last_row[ k ] ); + ATMP_3210 = _mm_loadu_si128( (__m128i *)&Af_QA[ k ] ); + + T1_3210 = _mm_mullo_epi32( PTR_3210, X1_3210 ); + T2_3210 = _mm_mullo_epi32( SUBFR_3210, X2_3210 ); + + ATMP_3210 = _mm_srai_epi32( ATMP_3210, 7 ); + ATMP_3210 = _mm_add_epi32( ATMP_3210, CONST1 ); + ATMP_3210 = _mm_srai_epi32( ATMP_3210, 1 ); + + FIRST_3210 = _mm_add_epi32( FIRST_3210, T1_3210 ); + LAST_3210 = _mm_add_epi32( LAST_3210, T2_3210 ); + + PTR_3210 = _mm_mullo_epi32( ATMP_3210, PTR_3210 ); + SUBFR_3210 = _mm_mullo_epi32( ATMP_3210, SUBFR_3210 ); + + _mm_storeu_si128( (__m128i *)&C_first_row[ k ], FIRST_3210 ); + _mm_storeu_si128( (__m128i *)&C_last_row[ k ], LAST_3210 ); + + TMP1_3210 = _mm_add_epi32( TMP1_3210, PTR_3210 ); + TMP2_3210 = _mm_add_epi32( TMP2_3210, SUBFR_3210 ); + } + + TMP1_3210 = _mm_add_epi32( TMP1_3210, _mm_unpackhi_epi64(TMP1_3210, TMP1_3210 ) ); + TMP2_3210 = _mm_add_epi32( TMP2_3210, _mm_unpackhi_epi64(TMP2_3210, TMP2_3210 ) ); + TMP1_3210 = _mm_add_epi32( TMP1_3210, _mm_shufflelo_epi16(TMP1_3210, 0x0E ) ); + TMP2_3210 = _mm_add_epi32( TMP2_3210, _mm_shufflelo_epi16(TMP2_3210, 0x0E ) ); + + tmp1 += _mm_cvtsi128_si32( TMP1_3210 ); + tmp2 += _mm_cvtsi128_si32( TMP2_3210 ); + + for( ; k < n; k++ ) { + C_first_row[ k ] = silk_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ + C_last_row[ k ] = silk_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ + Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); /* Q17 */ + tmp1 = silk_MLA( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); /* Q17 */ + tmp2 = silk_MLA( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); /* Q17 */ + } + + tmp1 = -tmp1; /* Q17 */ + tmp2 = -tmp2; /* Q17 */ + + { + __m128i xmm_tmp1, xmm_tmp2; + __m128i xmm_x_ptr_n_k_x2x0, xmm_x_ptr_n_k_x3x1; + __m128i xmm_x_ptr_sub_x2x0, xmm_x_ptr_sub_x3x1; + + xmm_tmp1 = _mm_set1_epi32( tmp1 ); + xmm_tmp2 = _mm_set1_epi32( tmp2 ); + + for( k = 0; k <= n - 3; k += 4 ) { + xmm_x_ptr_n_k_x2x0 = OP_CVTEPI16_EPI32_M64( &x_ptr[ n - k - 3 ] ); + xmm_x_ptr_sub_x2x0 = OP_CVTEPI16_EPI32_M64( &x_ptr[ subfr_length - n + k - 1 ] ); + + xmm_x_ptr_n_k_x2x0 = _mm_shuffle_epi32( xmm_x_ptr_n_k_x2x0, _MM_SHUFFLE( 0, 1, 2, 3 ) ); + + xmm_x_ptr_n_k_x2x0 = _mm_slli_epi32( xmm_x_ptr_n_k_x2x0, -rshifts - 1 ); + xmm_x_ptr_sub_x2x0 = _mm_slli_epi32( xmm_x_ptr_sub_x2x0, -rshifts - 1 ); + + /* equal shift right 4 bytes, xmm_x_ptr_n_k_x3x1 = _mm_srli_si128(xmm_x_ptr_n_k_x2x0, 4)*/ + xmm_x_ptr_n_k_x3x1 = _mm_shuffle_epi32( xmm_x_ptr_n_k_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); + xmm_x_ptr_sub_x3x1 = _mm_shuffle_epi32( xmm_x_ptr_sub_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); + + xmm_x_ptr_n_k_x2x0 = _mm_mul_epi32( xmm_x_ptr_n_k_x2x0, xmm_tmp1 ); + xmm_x_ptr_n_k_x3x1 = _mm_mul_epi32( xmm_x_ptr_n_k_x3x1, xmm_tmp1 ); + xmm_x_ptr_sub_x2x0 = _mm_mul_epi32( xmm_x_ptr_sub_x2x0, xmm_tmp2 ); + xmm_x_ptr_sub_x3x1 = _mm_mul_epi32( xmm_x_ptr_sub_x3x1, xmm_tmp2 ); + + xmm_x_ptr_n_k_x2x0 = _mm_srli_epi64( xmm_x_ptr_n_k_x2x0, 16 ); + xmm_x_ptr_n_k_x3x1 = _mm_slli_epi64( xmm_x_ptr_n_k_x3x1, 16 ); + xmm_x_ptr_sub_x2x0 = _mm_srli_epi64( xmm_x_ptr_sub_x2x0, 16 ); + xmm_x_ptr_sub_x3x1 = _mm_slli_epi64( xmm_x_ptr_sub_x3x1, 16 ); + + xmm_x_ptr_n_k_x2x0 = _mm_blend_epi16( xmm_x_ptr_n_k_x2x0, xmm_x_ptr_n_k_x3x1, 0xCC ); + xmm_x_ptr_sub_x2x0 = _mm_blend_epi16( xmm_x_ptr_sub_x2x0, xmm_x_ptr_sub_x3x1, 0xCC ); + + X1_3210 = _mm_loadu_si128( (__m128i *)&CAf[ k ] ); + PTR_3210 = _mm_loadu_si128( (__m128i *)&CAb[ k ] ); + + X1_3210 = _mm_add_epi32( X1_3210, xmm_x_ptr_n_k_x2x0 ); + PTR_3210 = _mm_add_epi32( PTR_3210, xmm_x_ptr_sub_x2x0 ); + + _mm_storeu_si128( (__m128i *)&CAf[ k ], X1_3210 ); + _mm_storeu_si128( (__m128i *)&CAb[ k ], PTR_3210 ); + } + + for( ; k <= n; k++ ) { + CAf[ k ] = silk_SMLAWW( CAf[ k ], tmp1, + silk_LSHIFT32( (opus_int32)x_ptr[ n - k ], -rshifts - 1 ) ); /* Q( -rshift ) */ + CAb[ k ] = silk_SMLAWW( CAb[ k ], tmp2, + silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n + k - 1 ], -rshifts - 1 ) ); /* Q( -rshift ) */ + } + } + } + } + + /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */ + tmp1 = C_first_row[ n ]; /* Q( -rshifts ) */ + tmp2 = C_last_row[ n ]; /* Q( -rshifts ) */ + num = 0; /* Q( -rshifts ) */ + nrg = silk_ADD32( CAb[ 0 ], CAf[ 0 ] ); /* Q( 1-rshifts ) */ + for( k = 0; k < n; k++ ) { + Atmp_QA = Af_QA[ k ]; + lz = silk_CLZ32( silk_abs( Atmp_QA ) ) - 1; + lz = silk_min( 32 - QA, lz ); + Atmp1 = silk_LSHIFT32( Atmp_QA, lz ); /* Q( QA + lz ) */ + + tmp1 = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( C_last_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ + tmp2 = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( C_first_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ + num = silk_ADD_LSHIFT32( num, silk_SMMUL( CAb[ n - k ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ + nrg = silk_ADD_LSHIFT32( nrg, silk_SMMUL( silk_ADD32( CAb[ k + 1 ], CAf[ k + 1 ] ), + Atmp1 ), 32 - QA - lz ); /* Q( 1-rshifts ) */ + } + CAf[ n + 1 ] = tmp1; /* Q( -rshifts ) */ + CAb[ n + 1 ] = tmp2; /* Q( -rshifts ) */ + num = silk_ADD32( num, tmp2 ); /* Q( -rshifts ) */ + num = silk_LSHIFT32( -num, 1 ); /* Q( 1-rshifts ) */ + + /* Calculate the next order reflection (parcor) coefficient */ + if( silk_abs( num ) < nrg ) { + rc_Q31 = silk_DIV32_varQ( num, nrg, 31 ); + } else { + rc_Q31 = ( num > 0 ) ? silk_int32_MAX : silk_int32_MIN; + } + + /* Update inverse prediction gain */ + tmp1 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 ); + tmp1 = silk_LSHIFT( silk_SMMUL( invGain_Q30, tmp1 ), 2 ); + if( tmp1 <= minInvGain_Q30 ) { + /* Max prediction gain exceeded; set reflection coefficient such that max prediction gain is exactly hit */ + tmp2 = ( (opus_int32)1 << 30 ) - silk_DIV32_varQ( minInvGain_Q30, invGain_Q30, 30 ); /* Q30 */ + rc_Q31 = silk_SQRT_APPROX( tmp2 ); /* Q15 */ + if( rc_Q31 > 0 ) { + /* Newton-Raphson iteration */ + rc_Q31 = silk_RSHIFT32( rc_Q31 + silk_DIV32( tmp2, rc_Q31 ), 1 ); /* Q15 */ + rc_Q31 = silk_LSHIFT32( rc_Q31, 16 ); /* Q31 */ + if( num < 0 ) { + /* Ensure adjusted reflection coefficients has the original sign */ + rc_Q31 = -rc_Q31; + } + } + invGain_Q30 = minInvGain_Q30; + reached_max_gain = 1; + } else { + invGain_Q30 = tmp1; + } + + /* Update the AR coefficients */ + for( k = 0; k < (n + 1) >> 1; k++ ) { + tmp1 = Af_QA[ k ]; /* QA */ + tmp2 = Af_QA[ n - k - 1 ]; /* QA */ + Af_QA[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* QA */ + Af_QA[ n - k - 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* QA */ + } + Af_QA[ n ] = silk_RSHIFT32( rc_Q31, 31 - QA ); /* QA */ + + if( reached_max_gain ) { + /* Reached max prediction gain; set remaining coefficients to zero and exit loop */ + for( k = n + 1; k < D; k++ ) { + Af_QA[ k ] = 0; + } + break; + } + + /* Update C * Af and C * Ab */ + for( k = 0; k <= n + 1; k++ ) { + tmp1 = CAf[ k ]; /* Q( -rshifts ) */ + tmp2 = CAb[ n - k + 1 ]; /* Q( -rshifts ) */ + CAf[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* Q( -rshifts ) */ + CAb[ n - k + 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* Q( -rshifts ) */ + } + } + + if( reached_max_gain ) { + for( k = 0; k < D; k++ ) { + /* Scale coefficients */ + A_Q16[ k ] = -silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); + } + /* Subtract energy of preceding samples from C0 */ + if( rshifts > 0 ) { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + C0 -= (opus_int32)silk_RSHIFT64( silk_inner_prod16_aligned_64( x_ptr, x_ptr, D, arch ), rshifts ); + } + } else { + for( s = 0; s < nb_subfr; s++ ) { + x_ptr = x + s * subfr_length; + C0 -= silk_LSHIFT32( silk_inner_prod_aligned( x_ptr, x_ptr, D, arch ), -rshifts ); + } + } + /* Approximate residual energy */ + *res_nrg = silk_LSHIFT( silk_SMMUL( invGain_Q30, C0 ), 2 ); + *res_nrg_Q = -rshifts; + } else { + /* Return residual energy */ + nrg = CAf[ 0 ]; /* Q( -rshifts ) */ + tmp1 = (opus_int32)1 << 16; /* Q16 */ + for( k = 0; k < D; k++ ) { + Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); /* Q16 */ + nrg = silk_SMLAWW( nrg, CAf[ k + 1 ], Atmp1 ); /* Q( -rshifts ) */ + tmp1 = silk_SMLAWW( tmp1, Atmp1, Atmp1 ); /* Q16 */ + A_Q16[ k ] = -Atmp1; + } + *res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */ + *res_nrg_Q = -rshifts; + } +} diff --git a/external/opus-1.3.1/silk/fixed/x86/vector_ops_FIX_sse4_1.c b/external/opus-1.3.1/silk/fixed/x86/vector_ops_FIX_sse4_1.c new file mode 100644 index 00000000..c1e90564 --- /dev/null +++ b/external/opus-1.3.1/silk/fixed/x86/vector_ops_FIX_sse4_1.c @@ -0,0 +1,88 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include "main.h" + +#include "SigProc_FIX.h" +#include "pitch.h" + +opus_int64 silk_inner_prod16_aligned_64_sse4_1( + const opus_int16 *inVec1, /* I input vector 1 */ + const opus_int16 *inVec2, /* I input vector 2 */ + const opus_int len /* I vector lengths */ +) +{ + opus_int i, dataSize8; + opus_int64 sum; + + __m128i xmm_tempa; + __m128i inVec1_76543210, acc1; + __m128i inVec2_76543210, acc2; + + sum = 0; + dataSize8 = len & ~7; + + acc1 = _mm_setzero_si128(); + acc2 = _mm_setzero_si128(); + + for( i = 0; i < dataSize8; i += 8 ) { + inVec1_76543210 = _mm_loadu_si128( (__m128i *)(&inVec1[i + 0] ) ); + inVec2_76543210 = _mm_loadu_si128( (__m128i *)(&inVec2[i + 0] ) ); + + /* only when all 4 operands are -32768 (0x8000), this results in wrap around */ + inVec1_76543210 = _mm_madd_epi16( inVec1_76543210, inVec2_76543210 ); + + xmm_tempa = _mm_cvtepi32_epi64( inVec1_76543210 ); + /* equal shift right 8 bytes */ + inVec1_76543210 = _mm_shuffle_epi32( inVec1_76543210, _MM_SHUFFLE( 0, 0, 3, 2 ) ); + inVec1_76543210 = _mm_cvtepi32_epi64( inVec1_76543210 ); + + acc1 = _mm_add_epi64( acc1, xmm_tempa ); + acc2 = _mm_add_epi64( acc2, inVec1_76543210 ); + } + + acc1 = _mm_add_epi64( acc1, acc2 ); + + /* equal shift right 8 bytes */ + acc2 = _mm_shuffle_epi32( acc1, _MM_SHUFFLE( 0, 0, 3, 2 ) ); + acc1 = _mm_add_epi64( acc1, acc2 ); + + _mm_storel_epi64( (__m128i *)&sum, acc1 ); + + for( ; i < len; i++ ) { + sum = silk_SMLABB( sum, inVec1[ i ], inVec2[ i ] ); + } + + return sum; +} diff --git a/external/opus-1.0.3/silk/float/LPC_analysis_filter_FLP.c b/external/opus-1.3.1/silk/float/LPC_analysis_filter_FLP.c similarity index 96% rename from external/opus-1.0.3/silk/float/LPC_analysis_filter_FLP.c rename to external/opus-1.3.1/silk/float/LPC_analysis_filter_FLP.c index 9845655b..0e1a1fed 100644 --- a/external/opus-1.0.3/silk/float/LPC_analysis_filter_FLP.c +++ b/external/opus-1.3.1/silk/float/LPC_analysis_filter_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -40,7 +40,7 @@ POSSIBILITY OF SUCH DAMAGE. /************************************************/ /* 16th order LPC analysis filter, does not write first 16 samples */ -static inline void silk_LPC_analysis_filter16_FLP( +static OPUS_INLINE void silk_LPC_analysis_filter16_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ @@ -78,7 +78,7 @@ static inline void silk_LPC_analysis_filter16_FLP( } /* 12th order LPC analysis filter, does not write first 12 samples */ -static inline void silk_LPC_analysis_filter12_FLP( +static OPUS_INLINE void silk_LPC_analysis_filter12_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ @@ -112,7 +112,7 @@ static inline void silk_LPC_analysis_filter12_FLP( } /* 10th order LPC analysis filter, does not write first 10 samples */ -static inline void silk_LPC_analysis_filter10_FLP( +static OPUS_INLINE void silk_LPC_analysis_filter10_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ @@ -144,7 +144,7 @@ static inline void silk_LPC_analysis_filter10_FLP( } /* 8th order LPC analysis filter, does not write first 8 samples */ -static inline void silk_LPC_analysis_filter8_FLP( +static OPUS_INLINE void silk_LPC_analysis_filter8_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ @@ -174,7 +174,7 @@ static inline void silk_LPC_analysis_filter8_FLP( } /* 6th order LPC analysis filter, does not write first 6 samples */ -static inline void silk_LPC_analysis_filter6_FLP( +static OPUS_INLINE void silk_LPC_analysis_filter6_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ @@ -215,7 +215,7 @@ void silk_LPC_analysis_filter_FLP( const opus_int Order /* I LPC order */ ) { - silk_assert( Order <= length ); + celt_assert( Order <= length ); switch( Order ) { case 6: @@ -239,7 +239,7 @@ void silk_LPC_analysis_filter_FLP( break; default: - silk_assert( 0 ); + celt_assert( 0 ); break; } diff --git a/external/opus-1.0.3/silk/float/LPC_inv_pred_gain_FLP.c b/external/opus-1.3.1/silk/float/LPC_inv_pred_gain_FLP.c similarity index 80% rename from external/opus-1.0.3/silk/float/LPC_inv_pred_gain_FLP.c rename to external/opus-1.3.1/silk/float/LPC_inv_pred_gain_FLP.c index 8645f77f..2be2122d 100644 --- a/external/opus-1.0.3/silk/float/LPC_inv_pred_gain_FLP.c +++ b/external/opus-1.3.1/silk/float/LPC_inv_pred_gain_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -31,8 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "SigProc_FIX.h" #include "SigProc_FLP.h" - -#define RC_THRESHOLD 0.9999f +#include "define.h" /* compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ @@ -43,34 +42,32 @@ silk_float silk_LPC_inverse_pred_gain_FLP( /* O return inverse prediction ga ) { opus_int k, n; - double invGain, rc, rc_mult1, rc_mult2; - silk_float Atmp[ 2 ][ SILK_MAX_ORDER_LPC ]; - silk_float *Aold, *Anew; + double invGain, rc, rc_mult1, rc_mult2, tmp1, tmp2; + silk_float Atmp[ SILK_MAX_ORDER_LPC ]; - Anew = Atmp[ order & 1 ]; - silk_memcpy( Anew, A, order * sizeof(silk_float) ); + silk_memcpy( Atmp, A, order * sizeof(silk_float) ); invGain = 1.0; for( k = order - 1; k > 0; k-- ) { - rc = -Anew[ k ]; - if( rc > RC_THRESHOLD || rc < -RC_THRESHOLD ) { + rc = -Atmp[ k ]; + rc_mult1 = 1.0f - rc * rc; + invGain *= rc_mult1; + if( invGain * MAX_PREDICTION_POWER_GAIN < 1.0f ) { return 0.0f; } - rc_mult1 = 1.0f - rc * rc; rc_mult2 = 1.0f / rc_mult1; - invGain *= rc_mult1; - /* swap pointers */ - Aold = Anew; - Anew = Atmp[ k & 1 ]; - for( n = 0; n < k; n++ ) { - Anew[ n ] = (silk_float)( ( Aold[ n ] - Aold[ k - n - 1 ] * rc ) * rc_mult2 ); + for( n = 0; n < (k + 1) >> 1; n++ ) { + tmp1 = Atmp[ n ]; + tmp2 = Atmp[ k - n - 1 ]; + Atmp[ n ] = (silk_float)( ( tmp1 - tmp2 * rc ) * rc_mult2 ); + Atmp[ k - n - 1 ] = (silk_float)( ( tmp2 - tmp1 * rc ) * rc_mult2 ); } } - rc = -Anew[ 0 ]; - if( rc > RC_THRESHOLD || rc < -RC_THRESHOLD ) { - return 0.0f; - } + rc = -Atmp[ 0 ]; rc_mult1 = 1.0f - rc * rc; invGain *= rc_mult1; + if( invGain * MAX_PREDICTION_POWER_GAIN < 1.0f ) { + return 0.0f; + } return (silk_float)invGain; } diff --git a/external/opus-1.0.3/silk/float/LTP_analysis_filter_FLP.c b/external/opus-1.3.1/silk/float/LTP_analysis_filter_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/LTP_analysis_filter_FLP.c rename to external/opus-1.3.1/silk/float/LTP_analysis_filter_FLP.c index d3a6a5ae..849b7c1c 100644 --- a/external/opus-1.0.3/silk/float/LTP_analysis_filter_FLP.c +++ b/external/opus-1.3.1/silk/float/LTP_analysis_filter_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/LTP_scale_ctrl_FLP.c b/external/opus-1.3.1/silk/float/LTP_scale_ctrl_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/LTP_scale_ctrl_FLP.c rename to external/opus-1.3.1/silk/float/LTP_scale_ctrl_FLP.c index f3f0c572..8dbe29d0 100644 --- a/external/opus-1.0.3/silk/float/LTP_scale_ctrl_FLP.c +++ b/external/opus-1.3.1/silk/float/LTP_scale_ctrl_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/SigProc_FLP.h b/external/opus-1.3.1/silk/float/SigProc_FLP.h similarity index 91% rename from external/opus-1.0.3/silk/float/SigProc_FLP.h rename to external/opus-1.3.1/silk/float/SigProc_FLP.h index 036b46da..953de8b0 100644 --- a/external/opus-1.0.3/silk/float/SigProc_FLP.h +++ b/external/opus-1.3.1/silk/float/SigProc_FLP.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -68,13 +68,6 @@ void silk_k2a_FLP( opus_int32 order /* I prediction order */ ); -/* Solve the normal equations using the Levinson-Durbin recursion */ -silk_float silk_levinsondurbin_FLP( /* O prediction error energy */ - silk_float A[], /* O prediction coefficients [order] */ - const silk_float corr[], /* I input auto-correlations [order + 1] */ - const opus_int order /* I prediction order */ -); - /* compute autocorrelation */ void silk_autocorrelation_FLP( silk_float *results, /* O result (length correlationCount) */ @@ -94,7 +87,8 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, const silk_float search_thres2, /* I Final threshold for lag candidates 0 - 1 */ const opus_int Fs_kHz, /* I sample frequency (kHz) */ const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ - const opus_int nb_subfr /* I Number of 5 ms subframes */ + const opus_int nb_subfr, /* I Number of 5 ms subframes */ + int arch /* I Run-time architecture */ ); void silk_insertion_sort_decreasing_FLP( @@ -153,19 +147,19 @@ double silk_energy_FLP( #define silk_abs_float( a ) ((silk_float)fabs(a)) /* sigmoid function */ -static inline silk_float silk_sigmoid( silk_float x ) +static OPUS_INLINE silk_float silk_sigmoid( silk_float x ) { return (silk_float)(1.0 / (1.0 + exp(-x))); } /* floating-point to integer conversion (rounding) */ -static inline opus_int32 silk_float2int( silk_float x ) +static OPUS_INLINE opus_int32 silk_float2int( silk_float x ) { return (opus_int32)float2int( x ); } /* floating-point to integer conversion (rounding) */ -static inline void silk_float2short_array( +static OPUS_INLINE void silk_float2short_array( opus_int16 *out, const silk_float *in, opus_int32 length @@ -178,7 +172,7 @@ static inline void silk_float2short_array( } /* integer to floating-point conversion */ -static inline void silk_short2float_array( +static OPUS_INLINE void silk_short2float_array( silk_float *out, const opus_int16 *in, opus_int32 length @@ -191,7 +185,7 @@ static inline void silk_short2float_array( } /* using log2() helps the fixed-point conversion */ -static inline silk_float silk_log2( double x ) +static OPUS_INLINE silk_float silk_log2( double x ) { return ( silk_float )( 3.32192809488736 * log10( x ) ); } diff --git a/external/opus-1.0.3/silk/float/apply_sine_window_FLP.c b/external/opus-1.3.1/silk/float/apply_sine_window_FLP.c similarity index 96% rename from external/opus-1.0.3/silk/float/apply_sine_window_FLP.c rename to external/opus-1.3.1/silk/float/apply_sine_window_FLP.c index e06333f7..e49e7179 100644 --- a/external/opus-1.0.3/silk/float/apply_sine_window_FLP.c +++ b/external/opus-1.3.1/silk/float/apply_sine_window_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -45,10 +45,10 @@ void silk_apply_sine_window_FLP( opus_int k; silk_float freq, c, S0, S1; - silk_assert( win_type == 1 || win_type == 2 ); + celt_assert( win_type == 1 || win_type == 2 ); /* Length must be multiple of 4 */ - silk_assert( ( length & 3 ) == 0 ); + celt_assert( ( length & 3 ) == 0 ); freq = PI / ( length + 1 ); diff --git a/external/opus-1.0.3/silk/float/autocorrelation_FLP.c b/external/opus-1.3.1/silk/float/autocorrelation_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/autocorrelation_FLP.c rename to external/opus-1.3.1/silk/float/autocorrelation_FLP.c index 9ce709e2..8b8a9e65 100644 --- a/external/opus-1.0.3/silk/float/autocorrelation_FLP.c +++ b/external/opus-1.3.1/silk/float/autocorrelation_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/burg_modified_FLP.c b/external/opus-1.3.1/silk/float/burg_modified_FLP.c similarity index 98% rename from external/opus-1.0.3/silk/float/burg_modified_FLP.c rename to external/opus-1.3.1/silk/float/burg_modified_FLP.c index 31c9b228..756b76a3 100644 --- a/external/opus-1.0.3/silk/float/burg_modified_FLP.c +++ b/external/opus-1.3.1/silk/float/burg_modified_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -52,7 +52,7 @@ silk_float silk_burg_modified_FLP( /* O returns residual energy double CAf[ SILK_MAX_ORDER_LPC + 1 ], CAb[ SILK_MAX_ORDER_LPC + 1 ]; double Af[ SILK_MAX_ORDER_LPC ]; - silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); + celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); /* Compute autocorrelations, added over subframes */ C0 = silk_energy_FLP( x, nb_subfr * subfr_length ); diff --git a/external/opus-1.0.3/silk/float/bwexpander_FLP.c b/external/opus-1.3.1/silk/float/bwexpander_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/bwexpander_FLP.c rename to external/opus-1.3.1/silk/float/bwexpander_FLP.c index 59ca4eaf..d55a4d79 100644 --- a/external/opus-1.0.3/silk/float/bwexpander_FLP.c +++ b/external/opus-1.3.1/silk/float/bwexpander_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/corrMatrix_FLP.c b/external/opus-1.3.1/silk/float/corrMatrix_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/corrMatrix_FLP.c rename to external/opus-1.3.1/silk/float/corrMatrix_FLP.c index c59f73c3..eae6a1cf 100644 --- a/external/opus-1.0.3/silk/float/corrMatrix_FLP.c +++ b/external/opus-1.3.1/silk/float/corrMatrix_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/encode_frame_FLP.c b/external/opus-1.3.1/silk/float/encode_frame_FLP.c similarity index 79% rename from external/opus-1.0.3/silk/float/encode_frame_FLP.c rename to external/opus-1.3.1/silk/float/encode_frame_FLP.c index 23260bc7..b029c3f5 100644 --- a/external/opus-1.0.3/silk/float/encode_frame_FLP.c +++ b/external/opus-1.3.1/silk/float/encode_frame_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -29,11 +29,12 @@ POSSIBILITY OF SUCH DAMAGE. #include "config.h" #endif +#include #include "main_FLP.h" #include "tuning_parameters.h" /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */ -static inline void silk_LBRR_encode_FLP( +static OPUS_INLINE void silk_LBRR_encode_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float xfw[], /* I Input signal */ @@ -41,21 +42,28 @@ static inline void silk_LBRR_encode_FLP( ); void silk_encode_do_VAD_FLP( - silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ + silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ + opus_int activity /* I Decision of Opus voice activity detector */ ) { + const opus_int activity_threshold = SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ); + /****************************/ /* Voice Activity Detection */ /****************************/ - silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1 ); + silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.arch ); + /* If Opus VAD is inactive and Silk VAD is active: lower Silk VAD to just under the threshold */ + if( activity == VAD_NO_ACTIVITY && psEnc->sCmn.speech_activity_Q8 >= activity_threshold ) { + psEnc->sCmn.speech_activity_Q8 = activity_threshold - 1; + } /**************************************************/ /* Convert speech activity into VAD and DTX flags */ /**************************************************/ - if( psEnc->sCmn.speech_activity_Q8 < SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { + if( psEnc->sCmn.speech_activity_Q8 < activity_threshold ) { psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.noSpeechCounter++; - if( psEnc->sCmn.noSpeechCounter < NB_SPEECH_FRAMES_BEFORE_DTX ) { + if( psEnc->sCmn.noSpeechCounter <= NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.inDTX = 0; } else if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX + NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.noSpeechCounter = NB_SPEECH_FRAMES_BEFORE_DTX; @@ -85,7 +93,6 @@ opus_int silk_encode_frame_FLP( silk_encoder_control_FLP sEncCtrl; opus_int i, iter, maxIter, found_upper, found_lower, ret = 0; silk_float *x_frame, *res_pitch_frame; - silk_float xfw[ MAX_FRAME_LENGTH ]; silk_float res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ]; ec_enc sRangeEnc_copy, sRangeEnc_copy2; silk_nsq_state sNSQ_copy, sNSQ_copy2; @@ -97,6 +104,9 @@ opus_int silk_encode_frame_FLP( opus_int8 LastGainIndex_copy2; opus_int32 pGains_Q16[ MAX_NB_SUBFR ]; opus_uint8 ec_buf_copy[ 1275 ]; + opus_int gain_lock[ MAX_NB_SUBFR ] = {0}; + opus_int16 best_gain_mult[ MAX_NB_SUBFR ]; + opus_int best_sum[ MAX_NB_SUBFR ]; /* This is totally unnecessary but many compilers (including gcc) are too dumb to realise it */ LastGainIndex_copy2 = nBits_lower = nBits_upper = gainMult_lower = gainMult_upper = 0; @@ -129,7 +139,7 @@ opus_int silk_encode_frame_FLP( /*****************************************/ /* Find pitch lags, initial LPC analysis */ /*****************************************/ - silk_find_pitch_lags_FLP( psEnc, &sEncCtrl, res_pitch, x_frame ); + silk_find_pitch_lags_FLP( psEnc, &sEncCtrl, res_pitch, x_frame, psEnc->sCmn.arch ); /************************/ /* Noise shape analysis */ @@ -139,22 +149,17 @@ opus_int silk_encode_frame_FLP( /***************************************************/ /* Find linear prediction coefficients (LPC + LTP) */ /***************************************************/ - silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch, x_frame, condCoding ); + silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch_frame, x_frame, condCoding ); /****************************************/ /* Process gains */ /****************************************/ silk_process_gains_FLP( psEnc, &sEncCtrl, condCoding ); - /*****************************************/ - /* Prefiltering for noise shaper */ - /*****************************************/ - silk_prefilter_FLP( psEnc, &sEncCtrl, xfw, x_frame ); - /****************************************/ /* Low Bitrate Redundant Encoding */ /****************************************/ - silk_LBRR_encode_FLP( psEnc, &sEncCtrl, xfw, condCoding ); + silk_LBRR_encode_FLP( psEnc, &sEncCtrl, x_frame, condCoding ); /* Loop over quantizer and entroy coding to control bitrate */ maxIter = 6; @@ -188,7 +193,11 @@ opus_int silk_encode_frame_FLP( /*****************************************/ /* Noise shaping quantization */ /*****************************************/ - silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, &psEnc->sCmn.indices, &psEnc->sCmn.sNSQ, psEnc->sCmn.pulses, xfw ); + silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, &psEnc->sCmn.indices, &psEnc->sCmn.sNSQ, psEnc->sCmn.pulses, x_frame ); + + if ( iter == maxIter && !found_lower ) { + silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); + } /****************************************/ /* Encode Parameters */ @@ -203,6 +212,33 @@ opus_int silk_encode_frame_FLP( nBits = ec_tell( psRangeEnc ); + /* If we still bust after the last iteration, do some damage control. */ + if ( iter == maxIter && !found_lower && nBits > maxBits ) { + silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); + + /* Keep gains the same as the last frame. */ + psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; + for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { + psEnc->sCmn.indices.GainsIndices[ i ] = 4; + } + if (condCoding != CODE_CONDITIONALLY) { + psEnc->sCmn.indices.GainsIndices[ 0 ] = sEncCtrl.lastGainIndexPrev; + } + psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; + psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; + /* Clear all pulses. */ + for ( i = 0; i < psEnc->sCmn.frame_length; i++ ) { + psEnc->sCmn.pulses[ i ] = 0; + } + + silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); + + silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, + psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); + + nBits = ec_tell( psRangeEnc ); + } + if( useCBR == 0 && iter == 0 && nBits <= maxBits ) { break; } @@ -212,7 +248,7 @@ opus_int silk_encode_frame_FLP( if( found_lower && ( gainsID == gainsID_lower || nBits > maxBits ) ) { /* Restore output state from earlier iteration that did meet the bitrate budget */ silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); - silk_assert( sRangeEnc_copy2.offs <= 1275 ); + celt_assert( sRangeEnc_copy2.offs <= 1275 ); silk_memcpy( psRangeEnc->buf, ec_buf_copy, sRangeEnc_copy2.offs ); silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy2, sizeof( silk_nsq_state ) ); psEnc->sShape.LastGainIndex = LastGainIndex_copy2; @@ -223,7 +259,9 @@ opus_int silk_encode_frame_FLP( if( nBits > maxBits ) { if( found_lower == 0 && iter >= 2 ) { /* Adjust the quantizer's rate/distortion tradeoff and discard previous "upper" results */ - sEncCtrl.Lambda *= 1.5f; + sEncCtrl.Lambda = silk_max_float(sEncCtrl.Lambda*1.5f, 1.5f); + /* Reducing dithering can help us hit the target. */ + psEnc->sCmn.indices.quantOffsetType = 0; found_upper = 0; gainsID_upper = -1; } else { @@ -240,7 +278,7 @@ opus_int silk_encode_frame_FLP( gainsID_lower = gainsID; /* Copy part of the output state */ silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); - silk_assert( psRangeEnc->offs <= 1275 ); + celt_assert( psRangeEnc->offs <= 1275 ); silk_memcpy( ec_buf_copy, psRangeEnc->buf, psRangeEnc->offs ); silk_memcpy( &sNSQ_copy2, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); LastGainIndex_copy2 = psEnc->sShape.LastGainIndex; @@ -250,15 +288,34 @@ opus_int silk_encode_frame_FLP( break; } + if ( !found_lower && nBits > maxBits ) { + int j; + for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { + int sum=0; + for ( j = i*psEnc->sCmn.subfr_length; j < (i+1)*psEnc->sCmn.subfr_length; j++ ) { + sum += abs( psEnc->sCmn.pulses[j] ); + } + if ( iter == 0 || (sum < best_sum[i] && !gain_lock[i]) ) { + best_sum[i] = sum; + best_gain_mult[i] = gainMult_Q8; + } else { + gain_lock[i] = 1; + } + } + } if( ( found_lower & found_upper ) == 0 ) { /* Adjust gain according to high-rate rate/distortion curve */ - opus_int32 gain_factor_Q16; - gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); - gain_factor_Q16 = silk_min_32( gain_factor_Q16, SILK_FIX_CONST( 2, 16 ) ); if( nBits > maxBits ) { - gain_factor_Q16 = silk_max_32( gain_factor_Q16, SILK_FIX_CONST( 1.3, 16 ) ); + if (gainMult_Q8 < 16384) { + gainMult_Q8 *= 2; + } else { + gainMult_Q8 = 32767; + } + } else { + opus_int32 gain_factor_Q16; + gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); + gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); } - gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); } else { /* Adjust gain by interpolating */ gainMult_Q8 = gainMult_lower + ( ( gainMult_upper - gainMult_lower ) * ( maxBits - nBits_lower ) ) / ( nBits_upper - nBits_lower ); @@ -272,7 +329,13 @@ opus_int silk_encode_frame_FLP( } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - pGains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], gainMult_Q8 ), 8 ); + opus_int16 tmp; + if ( gain_lock[i] ) { + tmp = best_gain_mult[i]; + } else { + tmp = gainMult_Q8; + } + pGains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], tmp ), 8 ); } /* Quantize gains */ @@ -294,10 +357,6 @@ opus_int silk_encode_frame_FLP( silk_memmove( psEnc->x_buf, &psEnc->x_buf[ psEnc->sCmn.frame_length ], ( psEnc->sCmn.ltp_mem_length + LA_SHAPE_MS * psEnc->sCmn.fs_kHz ) * sizeof( silk_float ) ); - /* Parameters needed for next frame */ - psEnc->sCmn.prevLag = sEncCtrl.pitchL[ psEnc->sCmn.nb_subfr - 1 ]; - psEnc->sCmn.prevSignalType = psEnc->sCmn.indices.signalType; - /* Exit without entropy coding */ if( psEnc->sCmn.prefillFlag ) { /* No payload */ @@ -305,6 +364,10 @@ opus_int silk_encode_frame_FLP( return ret; } + /* Parameters needed for next frame */ + psEnc->sCmn.prevLag = sEncCtrl.pitchL[ psEnc->sCmn.nb_subfr - 1 ]; + psEnc->sCmn.prevSignalType = psEnc->sCmn.indices.signalType; + /****************************************/ /* Finalize payload */ /****************************************/ @@ -316,7 +379,7 @@ opus_int silk_encode_frame_FLP( } /* Low-Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode excitation at lower bitrate */ -static inline void silk_LBRR_encode_FLP( +static OPUS_INLINE void silk_LBRR_encode_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float xfw[], /* I Input signal */ diff --git a/external/opus-1.0.3/silk/float/energy_FLP.c b/external/opus-1.3.1/silk/float/energy_FLP.c similarity index 94% rename from external/opus-1.0.3/silk/float/energy_FLP.c rename to external/opus-1.3.1/silk/float/energy_FLP.c index e3eedf97..7bc7173c 100644 --- a/external/opus-1.0.3/silk/float/energy_FLP.c +++ b/external/opus-1.3.1/silk/float/energy_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -37,13 +37,12 @@ double silk_energy_FLP( opus_int dataSize ) { - opus_int i, dataSize4; + opus_int i; double result; /* 4x unrolled loop */ result = 0.0; - dataSize4 = dataSize & 0xFFFC; - for( i = 0; i < dataSize4; i += 4 ) { + for( i = 0; i < dataSize - 3; i += 4 ) { result += data[ i + 0 ] * (double)data[ i + 0 ] + data[ i + 1 ] * (double)data[ i + 1 ] + data[ i + 2 ] * (double)data[ i + 2 ] + diff --git a/external/opus-1.0.3/silk/float/find_LPC_FLP.c b/external/opus-1.3.1/silk/float/find_LPC_FLP.c similarity index 98% rename from external/opus-1.0.3/silk/float/find_LPC_FLP.c rename to external/opus-1.3.1/silk/float/find_LPC_FLP.c index 66fa7dd4..fa3ffe7f 100644 --- a/external/opus-1.0.3/silk/float/find_LPC_FLP.c +++ b/external/opus-1.3.1/silk/float/find_LPC_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -73,7 +73,7 @@ void silk_find_LPC_FLP( silk_interpolate( NLSF0_Q15, psEncC->prev_NLSFq_Q15, NLSF_Q15, k, psEncC->predictLPCOrder ); /* Convert to LPC for residual energy evaluation */ - silk_NLSF2A_FLP( a_tmp, NLSF0_Q15, psEncC->predictLPCOrder ); + silk_NLSF2A_FLP( a_tmp, NLSF0_Q15, psEncC->predictLPCOrder, psEncC->arch ); /* Calculate residual energy with LSF interpolation */ silk_LPC_analysis_filter_FLP( LPC_res, a_tmp, x, 2 * subfr_length, psEncC->predictLPCOrder ); @@ -99,6 +99,6 @@ void silk_find_LPC_FLP( silk_A2NLSF_FLP( NLSF_Q15, a, psEncC->predictLPCOrder ); } - silk_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || + celt_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); } diff --git a/external/opus-1.3.1/silk/float/find_LTP_FLP.c b/external/opus-1.3.1/silk/float/find_LTP_FLP.c new file mode 100644 index 00000000..f9706493 --- /dev/null +++ b/external/opus-1.3.1/silk/float/find_LTP_FLP.c @@ -0,0 +1,64 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FLP.h" +#include "tuning_parameters.h" + +void silk_find_LTP_FLP( + silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ + silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* O Weight for LTP quantization */ + const silk_float r_ptr[], /* I LPC residual */ + const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ + const opus_int subfr_length, /* I Subframe length */ + const opus_int nb_subfr /* I number of subframes */ +) +{ + opus_int k; + silk_float *xX_ptr, *XX_ptr; + const silk_float *lag_ptr; + silk_float xx, temp; + + xX_ptr = xX; + XX_ptr = XX; + for( k = 0; k < nb_subfr; k++ ) { + lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); + silk_corrMatrix_FLP( lag_ptr, subfr_length, LTP_ORDER, XX_ptr ); + silk_corrVector_FLP( lag_ptr, r_ptr, subfr_length, LTP_ORDER, xX_ptr ); + xx = ( silk_float )silk_energy_FLP( r_ptr, subfr_length + LTP_ORDER ); + temp = 1.0f / silk_max( xx, LTP_CORR_INV_MAX * 0.5f * ( XX_ptr[ 0 ] + XX_ptr[ 24 ] ) + 1.0f ); + silk_scale_vector_FLP( XX_ptr, temp, LTP_ORDER * LTP_ORDER ); + silk_scale_vector_FLP( xX_ptr, temp, LTP_ORDER ); + + r_ptr += subfr_length; + XX_ptr += LTP_ORDER * LTP_ORDER; + xX_ptr += LTP_ORDER; + } +} diff --git a/external/opus-1.0.3/silk/float/find_pitch_lags_FLP.c b/external/opus-1.3.1/silk/float/find_pitch_lags_FLP.c similarity index 95% rename from external/opus-1.0.3/silk/float/find_pitch_lags_FLP.c rename to external/opus-1.3.1/silk/float/find_pitch_lags_FLP.c index 00862a6d..dedbcd28 100644 --- a/external/opus-1.0.3/silk/float/find_pitch_lags_FLP.c +++ b/external/opus-1.3.1/silk/float/find_pitch_lags_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -37,7 +37,8 @@ void silk_find_pitch_lags_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ silk_float res[], /* O Residual */ - const silk_float x[] /* I Speech signal */ + const silk_float x[], /* I Speech signal */ + int arch /* I Run-time architecture */ ) { opus_int buf_len; @@ -55,7 +56,7 @@ void silk_find_pitch_lags_FLP( buf_len = psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length; /* Safety check */ - silk_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); + celt_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); x_buf = x - psEnc->sCmn.ltp_mem_length; @@ -116,7 +117,7 @@ void silk_find_pitch_lags_FLP( /*****************************************/ if( silk_pitch_analysis_core_FLP( res, psEncCtrl->pitchL, &psEnc->sCmn.indices.lagIndex, &psEnc->sCmn.indices.contourIndex, &psEnc->LTPCorr, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16 / 65536.0f, - thrhld, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr ) == 0 ) + thrhld, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr, arch ) == 0 ) { psEnc->sCmn.indices.signalType = TYPE_VOICED; } else { diff --git a/external/opus-1.0.3/silk/float/find_pred_coefs_FLP.c b/external/opus-1.3.1/silk/float/find_pred_coefs_FLP.c similarity index 89% rename from external/opus-1.0.3/silk/float/find_pred_coefs_FLP.c rename to external/opus-1.3.1/silk/float/find_pred_coefs_FLP.c index 2156893a..dcf7c520 100644 --- a/external/opus-1.0.3/silk/float/find_pred_coefs_FLP.c +++ b/external/opus-1.3.1/silk/float/find_pred_coefs_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -41,8 +41,9 @@ void silk_find_pred_coefs_FLP( ) { opus_int i; - silk_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; - silk_float invGains[ MAX_NB_SUBFR ], Wght[ MAX_NB_SUBFR ]; + silk_float XXLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; + silk_float xXLTP[ MAX_NB_SUBFR * LTP_ORDER ]; + silk_float invGains[ MAX_NB_SUBFR ]; opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]; const silk_float *x_ptr; silk_float *x_pre_ptr, LPC_in_pre[ MAX_NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ]; @@ -52,22 +53,20 @@ void silk_find_pred_coefs_FLP( for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { silk_assert( psEncCtrl->Gains[ i ] > 0.0f ); invGains[ i ] = 1.0f / psEncCtrl->Gains[ i ]; - Wght[ i ] = invGains[ i ] * invGains[ i ]; } if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /**********/ /* VOICED */ /**********/ - silk_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); + celt_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); /* LTP analysis */ - silk_find_LTP_FLP( psEncCtrl->LTPCoef, WLTP, &psEncCtrl->LTPredCodGain, res_pitch, - psEncCtrl->pitchL, Wght, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length ); + silk_find_LTP_FLP( XXLTP, xXLTP, res_pitch, psEncCtrl->pitchL, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr ); /* Quantize LTP gain parameters */ silk_quant_LTP_gains_FLP( psEncCtrl->LTPCoef, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, - WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr ); + &psEnc->sCmn.sum_log_gain_Q7, &psEncCtrl->LTPredCodGain, XXLTP, xXLTP, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); /* Control LTP scaling */ silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl, condCoding ); @@ -90,12 +89,13 @@ void silk_find_pred_coefs_FLP( } silk_memset( psEncCtrl->LTPCoef, 0, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( silk_float ) ); psEncCtrl->LTPredCodGain = 0.0f; + psEnc->sCmn.sum_log_gain_Q7 = 0; } /* Limit on total predictive coding gain */ if( psEnc->sCmn.first_frame_after_reset ) { minInvGain = 1.0f / MAX_PREDICTION_POWER_GAIN_AFTER_RESET; - } else { + } else { minInvGain = (silk_float)pow( 2, psEncCtrl->LTPredCodGain / 3 ) / MAX_PREDICTION_POWER_GAIN; minInvGain /= 0.25f + 0.75f * psEncCtrl->coding_quality; } diff --git a/external/opus-1.0.3/silk/float/inner_product_FLP.c b/external/opus-1.3.1/silk/float/inner_product_FLP.c similarity index 94% rename from external/opus-1.0.3/silk/float/inner_product_FLP.c rename to external/opus-1.3.1/silk/float/inner_product_FLP.c index 60823d6e..cdd39d24 100644 --- a/external/opus-1.0.3/silk/float/inner_product_FLP.c +++ b/external/opus-1.3.1/silk/float/inner_product_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -38,13 +38,12 @@ double silk_inner_product_FLP( opus_int dataSize ) { - opus_int i, dataSize4; + opus_int i; double result; /* 4x unrolled loop */ result = 0.0; - dataSize4 = dataSize & 0xFFFC; - for( i = 0; i < dataSize4; i += 4 ) { + for( i = 0; i < dataSize - 3; i += 4 ) { result += data1[ i + 0 ] * (double)data2[ i + 0 ] + data1[ i + 1 ] * (double)data2[ i + 1 ] + data1[ i + 2 ] * (double)data2[ i + 2 ] + diff --git a/external/opus-1.0.3/silk/float/k2a_FLP.c b/external/opus-1.3.1/silk/float/k2a_FLP.c similarity index 88% rename from external/opus-1.0.3/silk/float/k2a_FLP.c rename to external/opus-1.3.1/silk/float/k2a_FLP.c index 6f05d4b9..1448008d 100644 --- a/external/opus-1.0.3/silk/float/k2a_FLP.c +++ b/external/opus-1.3.1/silk/float/k2a_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -39,15 +39,16 @@ void silk_k2a_FLP( ) { opus_int k, n; - silk_float Atmp[ SILK_MAX_ORDER_LPC ]; + silk_float rck, tmp1, tmp2; for( k = 0; k < order; k++ ) { - for( n = 0; n < k; n++ ) { - Atmp[ n ] = A[ n ]; + rck = rc[ k ]; + for( n = 0; n < (k + 1) >> 1; n++ ) { + tmp1 = A[ n ]; + tmp2 = A[ k - n - 1 ]; + A[ n ] = tmp1 + tmp2 * rck; + A[ k - n - 1 ] = tmp2 + tmp1 * rck; } - for( n = 0; n < k; n++ ) { - A[ n ] += Atmp[ k - n - 1 ] * rc[ k ]; - } - A[ k ] = -rc[ k ]; + A[ k ] = -rck; } } diff --git a/external/opus-1.0.3/silk/float/main_FLP.h b/external/opus-1.3.1/silk/float/main_FLP.h similarity index 83% rename from external/opus-1.0.3/silk/float/main_FLP.h rename to external/opus-1.3.1/silk/float/main_FLP.h index 93455d4d..5dc0ccf4 100644 --- a/external/opus-1.0.3/silk/float/main_FLP.h +++ b/external/opus-1.3.1/silk/float/main_FLP.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -56,7 +56,8 @@ void silk_HP_variable_cutoff( /* Encoder main function */ void silk_encode_do_VAD_FLP( - silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ + silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ + opus_int activity /* I Decision of Opus voice activity detector */ ); /* Encoder main function */ @@ -71,29 +72,19 @@ opus_int silk_encode_frame_FLP( /* Initializes the Silk encoder state */ opus_int silk_init_encoder( - silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ + silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ + int arch /* I Run-tim architecture */ ); /* Control the Silk encoder */ opus_int silk_control_encoder( silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ silk_EncControlStruct *encControl, /* I Control structure */ - const opus_int32 TargetRate_bps, /* I Target max bitrate (bps) */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz ); -/****************/ -/* Prefiltering */ -/****************/ -void silk_prefilter_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - const silk_encoder_control_FLP *psEncCtrl, /* I Encoder control FLP */ - silk_float xw[], /* O Weighted signal */ - const silk_float x[] /* I Speech signal */ -); - /**************************/ /* Noise shaping analysis */ /**************************/ @@ -129,7 +120,8 @@ void silk_find_pitch_lags_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ silk_float res[], /* O Residual */ - const silk_float x[] /* I Speech signal */ + const silk_float x[], /* I Speech signal */ + int arch /* I Run-time architecture */ ); /* Find LPC and LTP coefficients */ @@ -151,15 +143,12 @@ void silk_find_LPC_FLP( /* LTP analysis */ void silk_find_LTP_FLP( - silk_float b[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ - silk_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ - silk_float *LTPredCodGain, /* O LTP coding gain */ - const silk_float r_lpc[], /* I LPC residual */ + silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ + silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* O Weight for LTP quantization */ + const silk_float r_ptr[], /* I LPC residual */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ - const silk_float Wght[ MAX_NB_SUBFR ], /* I Weights */ const opus_int subfr_length, /* I Subframe length */ - const opus_int nb_subfr, /* I number of subframes */ - const opus_int mem_offset /* I Number of samples in LTP memory */ + const opus_int nb_subfr /* I number of subframes */ ); void silk_LTP_analysis_filter_FLP( @@ -196,13 +185,16 @@ void silk_LPC_analysis_filter_FLP( /* LTP tap quantizer */ void silk_quant_LTP_gains_FLP( - silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (Un-)quantized LTP gains */ + silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */ opus_int8 *periodicity_index, /* O Periodicity index */ - const silk_float W[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Error weights */ - const opus_int mu_Q10, /* I Mu value (R/D tradeoff) */ - const opus_int lowComplexity, /* I Flag for low complexity */ - const opus_int nb_subfr /* I number of subframes */ + opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ + silk_float *pred_gain_dB, /* O LTP prediction gain */ + const silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Correlation matrix */ + const silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* I Correlation vector */ + const opus_int subfr_len, /* I Number of samples per subframe */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ ); /* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ @@ -241,22 +233,6 @@ void silk_corrVector_FLP( silk_float *Xt /* O X'*t correlation vector [order] */ ); -/* Add noise to matrix diagonal */ -void silk_regularize_correlations_FLP( - silk_float *XX, /* I/O Correlation matrices */ - silk_float *xx, /* I/O Correlation values */ - const silk_float noise, /* I Noise energy to add */ - const opus_int D /* I Dimension of XX */ -); - -/* Function to solve linear equation Ax = b, where A is an MxM symmetric matrix */ -void silk_solve_LDL_FLP( - silk_float *A, /* I/O Symmetric square matrix, out: reg. */ - const opus_int M, /* I Size of matrix */ - const silk_float *b, /* I Pointer to b vector */ - silk_float *x /* O Pointer to x solution vector */ -); - /* Apply sine window to signal vector. */ /* Window types: */ /* 1 -> sine window from 0 to pi/2 */ @@ -281,7 +257,8 @@ void silk_A2NLSF_FLP( void silk_NLSF2A_FLP( silk_float *pAR, /* O LPC coefficients [ LPC_order ] */ const opus_int16 *NLSF_Q15, /* I NLSF vector [ LPC_order ] */ - const opus_int LPC_order /* I LPC order */ + const opus_int LPC_order, /* I LPC order */ + int arch /* I Run-time architecture */ ); /* Limit, stabilize, and quantize NLSFs */ diff --git a/external/opus-1.0.3/silk/float/noise_shape_analysis_FLP.c b/external/opus-1.3.1/silk/float/noise_shape_analysis_FLP.c similarity index 72% rename from external/opus-1.0.3/silk/float/noise_shape_analysis_FLP.c rename to external/opus-1.3.1/silk/float/noise_shape_analysis_FLP.c index 33bfd20d..cb3d8a50 100644 --- a/external/opus-1.0.3/silk/float/noise_shape_analysis_FLP.c +++ b/external/opus-1.3.1/silk/float/noise_shape_analysis_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -36,7 +36,7 @@ POSSIBILITY OF SUCH DAMAGE. /* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */ /* Note: A monic filter is one with the first coefficient equal to 1.0. In Silk we omit the first */ /* coefficient in an array of coefficients, for monic filters. */ -static inline silk_float warped_gain( +static OPUS_INLINE silk_float warped_gain( const silk_float *coefs, silk_float lambda, opus_int order @@ -54,26 +54,22 @@ static inline silk_float warped_gain( /* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ /* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ -static inline void warped_true2monic_coefs( - silk_float *coefs_syn, - silk_float *coefs_ana, +static OPUS_INLINE void warped_true2monic_coefs( + silk_float *coefs, silk_float lambda, silk_float limit, opus_int order ) { opus_int i, iter, ind = 0; - silk_float tmp, maxabs, chirp, gain_syn, gain_ana; + silk_float tmp, maxabs, chirp, gain; /* Convert to monic coefficients */ for( i = order - 1; i > 0; i-- ) { - coefs_syn[ i - 1 ] -= lambda * coefs_syn[ i ]; - coefs_ana[ i - 1 ] -= lambda * coefs_ana[ i ]; + coefs[ i - 1 ] -= lambda * coefs[ i ]; } - gain_syn = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_syn[ 0 ] ); - gain_ana = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_ana[ 0 ] ); + gain = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs[ 0 ] ); for( i = 0; i < order; i++ ) { - coefs_syn[ i ] *= gain_syn; - coefs_ana[ i ] *= gain_ana; + coefs[ i ] *= gain; } /* Limit */ @@ -81,7 +77,7 @@ static inline void warped_true2monic_coefs( /* Find maximum absolute value */ maxabs = -1.0f; for( i = 0; i < order; i++ ) { - tmp = silk_max( silk_abs_float( coefs_syn[ i ] ), silk_abs_float( coefs_ana[ i ] ) ); + tmp = silk_abs_float( coefs[ i ] ); if( tmp > maxabs ) { maxabs = tmp; ind = i; @@ -94,36 +90,59 @@ static inline void warped_true2monic_coefs( /* Convert back to true warped coefficients */ for( i = 1; i < order; i++ ) { - coefs_syn[ i - 1 ] += lambda * coefs_syn[ i ]; - coefs_ana[ i - 1 ] += lambda * coefs_ana[ i ]; + coefs[ i - 1 ] += lambda * coefs[ i ]; } - gain_syn = 1.0f / gain_syn; - gain_ana = 1.0f / gain_ana; + gain = 1.0f / gain; for( i = 0; i < order; i++ ) { - coefs_syn[ i ] *= gain_syn; - coefs_ana[ i ] *= gain_ana; + coefs[ i ] *= gain; } /* Apply bandwidth expansion */ chirp = 0.99f - ( 0.8f + 0.1f * iter ) * ( maxabs - limit ) / ( maxabs * ( ind + 1 ) ); - silk_bwexpander_FLP( coefs_syn, order, chirp ); - silk_bwexpander_FLP( coefs_ana, order, chirp ); + silk_bwexpander_FLP( coefs, order, chirp ); /* Convert to monic warped coefficients */ for( i = order - 1; i > 0; i-- ) { - coefs_syn[ i - 1 ] -= lambda * coefs_syn[ i ]; - coefs_ana[ i - 1 ] -= lambda * coefs_ana[ i ]; + coefs[ i - 1 ] -= lambda * coefs[ i ]; } - gain_syn = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_syn[ 0 ] ); - gain_ana = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_ana[ 0 ] ); + gain = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs[ 0 ] ); for( i = 0; i < order; i++ ) { - coefs_syn[ i ] *= gain_syn; - coefs_ana[ i ] *= gain_ana; + coefs[ i ] *= gain; } } silk_assert( 0 ); } +static OPUS_INLINE void limit_coefs( + silk_float *coefs, + silk_float limit, + opus_int order +) { + opus_int i, iter, ind = 0; + silk_float tmp, maxabs, chirp; + + for( iter = 0; iter < 10; iter++ ) { + /* Find maximum absolute value */ + maxabs = -1.0f; + for( i = 0; i < order; i++ ) { + tmp = silk_abs_float( coefs[ i ] ); + if( tmp > maxabs ) { + maxabs = tmp; + ind = i; + } + } + if( maxabs <= limit ) { + /* Coefficients are within range - done */ + return; + } + + /* Apply bandwidth expansion */ + chirp = 0.99f - ( 0.8f + 0.1f * iter ) * ( maxabs - limit ) / ( maxabs * ( ind + 1 ) ); + silk_bwexpander_FLP( coefs, order, chirp ); + } + silk_assert( 0 ); +} + /* Compute noise shaping coefficients and initial gain values */ void silk_noise_shape_analysis_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ @@ -133,12 +152,13 @@ void silk_noise_shape_analysis_FLP( ) { silk_shape_state_FLP *psShapeSt = &psEnc->sShape; - opus_int k, nSamples; - silk_float SNR_adj_dB, HarmBoost, HarmShapeGain, Tilt; - silk_float nrg, pre_nrg, log_energy, log_energy_prev, energy_variation; - silk_float delta, BWExp1, BWExp2, gain_mult, gain_add, strength, b, warping; + opus_int k, nSamples, nSegs; + silk_float SNR_adj_dB, HarmShapeGain, Tilt; + silk_float nrg, log_energy, log_energy_prev, energy_variation; + silk_float BWExp, gain_mult, gain_add, strength, b, warping; silk_float x_windowed[ SHAPE_LPC_WIN_MAX ]; silk_float auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; + silk_float rc[ MAX_SHAPE_LPC_ORDER + 1 ]; const silk_float *x_ptr, *pitch_res_ptr; /* Point to start of first LPC analysis block */ @@ -176,14 +196,14 @@ void silk_noise_shape_analysis_FLP( if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Initially set to 0; may be overruled in process_gains(..) */ psEnc->sCmn.indices.quantOffsetType = 0; - psEncCtrl->sparseness = 0.0f; } else { /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */ nSamples = 2 * psEnc->sCmn.fs_kHz; energy_variation = 0.0f; log_energy_prev = 0.0f; pitch_res_ptr = pitch_res; - for( k = 0; k < silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; k++ ) { + nSegs = silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; + for( k = 0; k < nSegs; k++ ) { nrg = ( silk_float )nSamples + ( silk_float )silk_energy_FLP( pitch_res_ptr, nSamples ); log_energy = silk_log2( nrg ); if( k > 0 ) { @@ -192,17 +212,13 @@ void silk_noise_shape_analysis_FLP( log_energy_prev = log_energy; pitch_res_ptr += nSamples; } - psEncCtrl->sparseness = silk_sigmoid( 0.4f * ( energy_variation - 5.0f ) ); /* Set quantization offset depending on sparseness measure */ - if( psEncCtrl->sparseness > SPARSENESS_THRESHOLD_QNT_OFFSET ) { + if( energy_variation > ENERGY_VARIATION_THRESHOLD_QNT_OFFSET * (nSegs-1) ) { psEnc->sCmn.indices.quantOffsetType = 0; } else { psEnc->sCmn.indices.quantOffsetType = 1; } - - /* Increase coding SNR for sparse signals */ - SNR_adj_dB += SPARSE_SNR_INCR_dB * ( psEncCtrl->sparseness - 0.5f ); } /*******************************/ @@ -210,19 +226,10 @@ void silk_noise_shape_analysis_FLP( /*******************************/ /* More BWE for signals with high prediction gain */ strength = FIND_PITCH_WHITE_NOISE_FRACTION * psEncCtrl->predGain; /* between 0.0 and 1.0 */ - BWExp1 = BWExp2 = BANDWIDTH_EXPANSION / ( 1.0f + strength * strength ); - delta = LOW_RATE_BANDWIDTH_EXPANSION_DELTA * ( 1.0f - 0.75f * psEncCtrl->coding_quality ); - BWExp1 -= delta; - BWExp2 += delta; - /* BWExp1 will be applied after BWExp2, so make it relative */ - BWExp1 /= BWExp2; - - if( psEnc->sCmn.warping_Q16 > 0 ) { - /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ - warping = (silk_float)psEnc->sCmn.warping_Q16 / 65536.0f + 0.01f * psEncCtrl->coding_quality; - } else { - warping = 0.0f; - } + BWExp = BANDWIDTH_EXPANSION / ( 1.0f + strength * strength ); + + /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ + warping = (silk_float)psEnc->sCmn.warping_Q16 / 65536.0f + 0.01f * psEncCtrl->coding_quality; /********************************************/ /* Compute noise shaping AR coefs and gains */ @@ -252,37 +259,28 @@ void silk_noise_shape_analysis_FLP( } /* Add white noise, as a fraction of energy */ - auto_corr[ 0 ] += auto_corr[ 0 ] * SHAPE_WHITE_NOISE_FRACTION; + auto_corr[ 0 ] += auto_corr[ 0 ] * SHAPE_WHITE_NOISE_FRACTION + 1.0f; /* Convert correlations to prediction coefficients, and compute residual energy */ - nrg = silk_levinsondurbin_FLP( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], auto_corr, psEnc->sCmn.shapingLPCOrder ); + nrg = silk_schur_FLP( rc, auto_corr, psEnc->sCmn.shapingLPCOrder ); + silk_k2a_FLP( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], rc, psEnc->sCmn.shapingLPCOrder ); psEncCtrl->Gains[ k ] = ( silk_float )sqrt( nrg ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Adjust gain for warping */ - psEncCtrl->Gains[ k ] *= warped_gain( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], warping, psEnc->sCmn.shapingLPCOrder ); + psEncCtrl->Gains[ k ] *= warped_gain( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], warping, psEnc->sCmn.shapingLPCOrder ); } /* Bandwidth expansion for synthesis filter shaping */ - silk_bwexpander_FLP( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp2 ); - - /* Compute noise shaping filter coefficients */ - silk_memcpy( - &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], - &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], - psEnc->sCmn.shapingLPCOrder * sizeof( silk_float ) ); + silk_bwexpander_FLP( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp ); - /* Bandwidth expansion for analysis filter shaping */ - silk_bwexpander_FLP( &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp1 ); - - /* Ratio of prediction gains, in energy domain */ - pre_nrg = silk_LPC_inverse_pred_gain_FLP( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder ); - nrg = silk_LPC_inverse_pred_gain_FLP( &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder ); - psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg ); - - /* Convert to monic warped prediction coefficients and limit absolute values */ - warped_true2monic_coefs( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], - warping, 3.999f, psEnc->sCmn.shapingLPCOrder ); + if( psEnc->sCmn.warping_Q16 > 0 ) { + /* Convert to monic warped prediction coefficients and limit absolute values */ + warped_true2monic_coefs( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], warping, 3.999f, psEnc->sCmn.shapingLPCOrder ); + } else { + /* Limit absolute values */ + limit_coefs( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], 3.999f, psEnc->sCmn.shapingLPCOrder ); + } } /*****************/ @@ -296,11 +294,6 @@ void silk_noise_shape_analysis_FLP( psEncCtrl->Gains[ k ] += gain_add; } - gain_mult = 1.0f + INPUT_TILT + psEncCtrl->coding_quality * HIGH_RATE_INPUT_TILT; - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - psEncCtrl->GainsPre[ k ] *= gain_mult; - } - /************************************************/ /* Control low-frequency shaping and noise tilt */ /************************************************/ @@ -331,12 +324,6 @@ void silk_noise_shape_analysis_FLP( /****************************/ /* HARMONIC SHAPING CONTROL */ /****************************/ - /* Control boosting of harmonic frequencies */ - HarmBoost = LOW_RATE_HARMONIC_BOOST * ( 1.0f - psEncCtrl->coding_quality ) * psEnc->LTPCorr; - - /* More harmonic boost for noisy input signals */ - HarmBoost += LOW_INPUT_QUALITY_HARMONIC_BOOST * ( 1.0f - psEncCtrl->input_quality ); - if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Harmonic noise shaping */ HarmShapeGain = HARMONIC_SHAPING; @@ -355,8 +342,6 @@ void silk_noise_shape_analysis_FLP( /* Smooth over subframes */ /*************************/ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - psShapeSt->HarmBoost_smth += SUBFR_SMTH_COEF * ( HarmBoost - psShapeSt->HarmBoost_smth ); - psEncCtrl->HarmBoost[ k ] = psShapeSt->HarmBoost_smth; psShapeSt->HarmShapeGain_smth += SUBFR_SMTH_COEF * ( HarmShapeGain - psShapeSt->HarmShapeGain_smth ); psEncCtrl->HarmShapeGain[ k ] = psShapeSt->HarmShapeGain_smth; psShapeSt->Tilt_smth += SUBFR_SMTH_COEF * ( Tilt - psShapeSt->Tilt_smth ); diff --git a/external/opus-1.0.3/silk/float/pitch_analysis_core_FLP.c b/external/opus-1.3.1/silk/float/pitch_analysis_core_FLP.c similarity index 84% rename from external/opus-1.0.3/silk/float/pitch_analysis_core_FLP.c rename to external/opus-1.3.1/silk/float/pitch_analysis_core_FLP.c index fbff90c3..f351bc37 100644 --- a/external/opus-1.0.3/silk/float/pitch_analysis_core_FLP.c +++ b/external/opus-1.3.1/silk/float/pitch_analysis_core_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -35,9 +35,9 @@ POSSIBILITY OF SUCH DAMAGE. #include "SigProc_FLP.h" #include "SigProc_FIX.h" #include "pitch_est_defines.h" +#include "pitch.h" #define SCRATCH_SIZE 22 -#define eps 1.192092896e-07f /************************************************************/ /* Internally used functions */ @@ -48,7 +48,8 @@ static void silk_P_Ana_calc_corr_st3( opus_int start_lag, /* I start lag */ opus_int sf_length, /* I sub frame length */ opus_int nb_subfr, /* I number of subframes */ - opus_int complexity /* I Complexity setting */ + opus_int complexity, /* I Complexity setting */ + int arch /* I Run-time architecture */ ); static void silk_P_Ana_calc_energy_st3( @@ -74,7 +75,8 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, const silk_float search_thres2, /* I Final threshold for lag candidates 0 - 1 */ const opus_int Fs_kHz, /* I sample frequency (kHz) */ const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ - const opus_int nb_subfr /* I Number of 5 ms subframes */ + const opus_int nb_subfr, /* I Number of 5 ms subframes */ + int arch /* I Run-time architecture */ ) { opus_int i, k, d, j; @@ -85,6 +87,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, opus_int32 filt_state[ 6 ]; silk_float threshold, contour_bias; silk_float C[ PE_MAX_NB_SUBFR][ (PE_MAX_LAG >> 1) + 5 ]; + opus_val32 xcorr[ PE_MAX_LAG_MS * 4 - PE_MIN_LAG_MS * 4 + 1 ]; silk_float CC[ PE_NB_CBKS_STAGE2_EXT ]; const silk_float *target_ptr, *basis_ptr; double cross_corr, normalizer, energy, energy_tmp; @@ -106,11 +109,11 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, const opus_int8 *Lag_CB_ptr; /* Check for valid sampling frequency */ - silk_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); + celt_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); /* Check for valid complexity setting */ - silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); - silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); + celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); + celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); silk_assert( search_thres1 >= 0.0f && search_thres1 <= 1.0f ); silk_assert( search_thres2 >= 0.0f && search_thres2 <= 1.0f ); @@ -129,8 +132,6 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, max_lag_4kHz = PE_MAX_LAG_MS * 4; max_lag_8kHz = PE_MAX_LAG_MS * 8 - 1; - silk_memset(C, 0, sizeof(silk_float) * nb_subfr * ((PE_MAX_LAG >> 1) + 5)); - /* Resample from input sampled at Fs_kHz to 8 kHz */ if( Fs_kHz == 16 ) { /* Resample to 16 -> 8 khz */ @@ -147,7 +148,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, silk_resampler_down2_3( filt_state, frame_8_FIX, frame_12_FIX, frame_length ); silk_short2float_array( frame_8kHz, frame_8_FIX, frame_length_8kHz ); } else { - silk_assert( Fs_kHz == 8 ); + celt_assert( Fs_kHz == 8 ); silk_float2short_array( frame_8_FIX, frame, frame_length_8kHz ); } @@ -158,45 +159,50 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, /* Low-pass filter */ for( i = frame_length_4kHz - 1; i > 0; i-- ) { - frame_4kHz[ i ] += frame_4kHz[ i - 1 ]; + frame_4kHz[ i ] = silk_ADD_SAT16( frame_4kHz[ i ], frame_4kHz[ i - 1 ] ); } /****************************************************************************** * FIRST STAGE, operating in 4 khz ******************************************************************************/ + silk_memset(C, 0, sizeof(silk_float) * nb_subfr * ((PE_MAX_LAG >> 1) + 5)); target_ptr = &frame_4kHz[ silk_LSHIFT( sf_length_4kHz, 2 ) ]; for( k = 0; k < nb_subfr >> 1; k++ ) { /* Check that we are within range of the array */ - silk_assert( target_ptr >= frame_4kHz ); - silk_assert( target_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); + celt_assert( target_ptr >= frame_4kHz ); + celt_assert( target_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); basis_ptr = target_ptr - min_lag_4kHz; /* Check that we are within range of the array */ - silk_assert( basis_ptr >= frame_4kHz ); - silk_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); + celt_assert( basis_ptr >= frame_4kHz ); + celt_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); + + celt_pitch_xcorr( target_ptr, target_ptr-max_lag_4kHz, xcorr, sf_length_8kHz, max_lag_4kHz - min_lag_4kHz + 1, arch ); /* Calculate first vector products before loop */ - cross_corr = silk_inner_product_FLP( target_ptr, basis_ptr, sf_length_8kHz ); - normalizer = silk_energy_FLP( basis_ptr, sf_length_8kHz ) + sf_length_8kHz * 4000.0f; + cross_corr = xcorr[ max_lag_4kHz - min_lag_4kHz ]; + normalizer = silk_energy_FLP( target_ptr, sf_length_8kHz ) + + silk_energy_FLP( basis_ptr, sf_length_8kHz ) + + sf_length_8kHz * 4000.0f; - C[ 0 ][ min_lag_4kHz ] += (silk_float)(cross_corr / sqrt(normalizer)); + C[ 0 ][ min_lag_4kHz ] += (silk_float)( 2 * cross_corr / normalizer ); /* From now on normalizer is computed recursively */ - for(d = min_lag_4kHz + 1; d <= max_lag_4kHz; d++) { + for( d = min_lag_4kHz + 1; d <= max_lag_4kHz; d++ ) { basis_ptr--; /* Check that we are within range of the array */ silk_assert( basis_ptr >= frame_4kHz ); silk_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); - cross_corr = silk_inner_product_FLP(target_ptr, basis_ptr, sf_length_8kHz); + cross_corr = xcorr[ max_lag_4kHz - d ]; /* Add contribution of new sample and remove contribution from oldest sample */ normalizer += basis_ptr[ 0 ] * (double)basis_ptr[ 0 ] - basis_ptr[ sf_length_8kHz ] * (double)basis_ptr[ sf_length_8kHz ]; - C[ 0 ][ d ] += (silk_float)(cross_corr / sqrt( normalizer )); + C[ 0 ][ d ] += (silk_float)( 2 * cross_corr / normalizer ); } /* Update target pointer */ target_ptr += sf_length_8kHz; @@ -209,18 +215,12 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, /* Sort */ length_d_srch = 4 + 2 * complexity; - silk_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); + celt_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); silk_insertion_sort_decreasing_FLP( &C[ 0 ][ min_lag_4kHz ], d_srch, max_lag_4kHz - min_lag_4kHz + 1, length_d_srch ); /* Escape if correlation is very low already here */ Cmax = C[ 0 ][ min_lag_4kHz ]; - target_ptr = &frame_4kHz[ silk_SMULBB( sf_length_4kHz, nb_subfr ) ]; - energy = 1000.0f; - for( i = 0; i < silk_LSHIFT( sf_length_4kHz, 2 ); i++ ) { - energy += target_ptr[i] * (double)target_ptr[i]; - } - threshold = Cmax * Cmax; - if( energy / 16.0f > threshold ) { + if( Cmax < 0.2f ) { silk_memset( pitch_out, 0, nb_subfr * sizeof( opus_int ) ); *LTPCorr = 0.0f; *lagIndex = 0; @@ -238,7 +238,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, break; } } - silk_assert( length_d_srch > 0 ); + celt_assert( length_d_srch > 0 ); for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) { d_comp[ i ] = 0; @@ -287,14 +287,14 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, target_ptr = &frame_8kHz[ PE_LTP_MEM_LENGTH_MS * 8 ]; } for( k = 0; k < nb_subfr; k++ ) { - energy_tmp = silk_energy_FLP( target_ptr, sf_length_8kHz ); + energy_tmp = silk_energy_FLP( target_ptr, sf_length_8kHz ) + 1.0; for( j = 0; j < length_d_comp; j++ ) { d = d_comp[ j ]; basis_ptr = target_ptr - d; cross_corr = silk_inner_product_FLP( basis_ptr, target_ptr, sf_length_8kHz ); - energy = silk_energy_FLP( basis_ptr, sf_length_8kHz ); if( cross_corr > 0.0f ) { - C[ k ][ d ] = (silk_float)(cross_corr * cross_corr / (energy * energy_tmp + eps)); + energy = silk_energy_FLP( basis_ptr, sf_length_8kHz ); + C[ k ][ d ] = (silk_float)( 2 * cross_corr / ( energy + energy_tmp ) ); } else { C[ k ][ d ] = 0.0f; } @@ -317,7 +317,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, } else if( Fs_kHz == 16 ) { prevLag = silk_RSHIFT( prevLag, 1 ); } - prevLag_log2 = silk_log2((silk_float)prevLag); + prevLag_log2 = silk_log2( (silk_float)prevLag ); } else { prevLag_log2 = 0; } @@ -356,23 +356,20 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, CBimax_new = i; } } - CCmax_new = silk_max_float(CCmax_new, 0.0f); /* To avoid taking square root of negative number later */ - CCmax_new_b = CCmax_new; /* Bias towards shorter lags */ - lag_log2 = silk_log2((silk_float)d); - CCmax_new_b -= PE_SHORTLAG_BIAS * nb_subfr * lag_log2; + lag_log2 = silk_log2( (silk_float)d ); + CCmax_new_b = CCmax_new - PE_SHORTLAG_BIAS * nb_subfr * lag_log2; /* Bias towards previous lag */ if( prevLag > 0 ) { delta_lag_log2_sqr = lag_log2 - prevLag_log2; delta_lag_log2_sqr *= delta_lag_log2_sqr; - CCmax_new_b -= PE_PREVLAG_BIAS * nb_subfr * (*LTPCorr) * delta_lag_log2_sqr / (delta_lag_log2_sqr + 0.5f); + CCmax_new_b -= PE_PREVLAG_BIAS * nb_subfr * (*LTPCorr) * delta_lag_log2_sqr / ( delta_lag_log2_sqr + 0.5f ); } - if( CCmax_new_b > CCmax_b && /* Find maximum biased correlation */ - CCmax_new > nb_subfr * search_thres2 * search_thres2 && /* Correlation needs to be high enough to be voiced */ - silk_CB_lags_stage2[ 0 ][ CBimax_new ] <= min_lag_8kHz /* Lag must be in range */ + if( CCmax_new_b > CCmax_b && /* Find maximum biased correlation */ + CCmax_new > nb_subfr * search_thres2 /* Correlation needs to be high enough to be voiced */ ) { CCmax_b = CCmax_new_b; CCmax = CCmax_new; @@ -390,6 +387,10 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, return 1; } + /* Output normalized correlation */ + *LTPCorr = (silk_float)( CCmax / nb_subfr ); + silk_assert( *LTPCorr >= 0.0f ); + if( Fs_kHz > 8 ) { /* Search in original signal */ @@ -406,13 +407,11 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, end_lag = silk_min_int( lag + 2, max_lag ); lag_new = lag; /* to avoid undefined lag */ CBimax = 0; /* to avoid undefined lag */ - silk_assert( CCmax >= 0.0f ); - *LTPCorr = (silk_float)sqrt( CCmax / nb_subfr ); /* Output normalized correlation */ CCmax = -1000.0f; /* Calculate the correlations and energies needed in stage 3 */ - silk_P_Ana_calc_corr_st3( cross_corr_st3, frame, start_lag, sf_length, nb_subfr, complexity ); + silk_P_Ana_calc_corr_st3( cross_corr_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); silk_P_Ana_calc_energy_st3( energies_st3, frame, start_lag, sf_length, nb_subfr, complexity ); lag_counter = 0; @@ -430,25 +429,25 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; } + target_ptr = &frame[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; + energy_tmp = silk_energy_FLP( target_ptr, nb_subfr * sf_length ) + 1.0; for( d = start_lag; d <= end_lag; d++ ) { for( j = 0; j < nb_cbk_search; j++ ) { cross_corr = 0.0; - energy = eps; + energy = energy_tmp; for( k = 0; k < nb_subfr; k++ ) { - energy += energies_st3[ k ][ j ][ lag_counter ]; cross_corr += cross_corr_st3[ k ][ j ][ lag_counter ]; + energy += energies_st3[ k ][ j ][ lag_counter ]; } if( cross_corr > 0.0 ) { - CCmax_new = (silk_float)(cross_corr * cross_corr / energy); + CCmax_new = (silk_float)( 2 * cross_corr / energy ); /* Reduce depending on flatness of contour */ CCmax_new *= 1.0f - contour_bias * j; } else { CCmax_new = 0.0f; } - if( CCmax_new > CCmax && - ( d + (opus_int)silk_CB_lags_stage3[ 0 ][ j ] ) <= max_lag - ) { + if( CCmax_new > CCmax && ( d + (opus_int)silk_CB_lags_stage3[ 0 ][ j ] ) <= max_lag ) { CCmax = CCmax_new; lag_new = d; CBimax = j; @@ -464,51 +463,51 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, *lagIndex = (opus_int16)( lag_new - min_lag ); *contourIndex = (opus_int8)CBimax; } else { /* Fs_kHz == 8 */ - /* Save Lags and correlation */ - silk_assert( CCmax >= 0.0f ); - *LTPCorr = (silk_float)sqrt( CCmax / nb_subfr ); /* Output normalized correlation */ + /* Save Lags */ for( k = 0; k < nb_subfr; k++ ) { pitch_out[ k ] = lag + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size ); - pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], min_lag_8kHz, PE_MAX_LAG_MS * Fs_kHz ); + pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], min_lag_8kHz, PE_MAX_LAG_MS * 8 ); } *lagIndex = (opus_int16)( lag - min_lag_8kHz ); *contourIndex = (opus_int8)CBimax; } - silk_assert( *lagIndex >= 0 ); + celt_assert( *lagIndex >= 0 ); /* return as voiced */ return 0; } +/*********************************************************************** + * Calculates the correlations used in stage 3 search. In order to cover + * the whole lag codebook for all the searched offset lags (lag +- 2), + * the following correlations are needed in each sub frame: + * + * sf1: lag range [-8,...,7] total 16 correlations + * sf2: lag range [-4,...,4] total 9 correlations + * sf3: lag range [-3,....4] total 8 correltions + * sf4: lag range [-6,....8] total 15 correlations + * + * In total 48 correlations. The direct implementation computed in worst + * case 4*12*5 = 240 correlations, but more likely around 120. + ***********************************************************************/ static void silk_P_Ana_calc_corr_st3( silk_float cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */ const silk_float frame[], /* I vector to correlate */ opus_int start_lag, /* I start lag */ opus_int sf_length, /* I sub frame length */ opus_int nb_subfr, /* I number of subframes */ - opus_int complexity /* I Complexity setting */ + opus_int complexity, /* I Complexity setting */ + int arch /* I Run-time architecture */ ) - /*********************************************************************** - Calculates the correlations used in stage 3 search. In order to cover - the whole lag codebook for all the searched offset lags (lag +- 2), - the following correlations are needed in each sub frame: - - sf1: lag range [-8,...,7] total 16 correlations - sf2: lag range [-4,...,4] total 9 correlations - sf3: lag range [-3,....4] total 8 correltions - sf4: lag range [-6,....8] total 15 correlations - - In total 48 correlations. The direct implementation computed in worst case - 4*12*5 = 240 correlations, but more likely around 120. - **********************************************************************/ { - const silk_float *target_ptr, *basis_ptr; + const silk_float *target_ptr; opus_int i, j, k, lag_counter, lag_low, lag_high; opus_int nb_cbk_search, delta, idx, cbk_size; silk_float scratch_mem[ SCRATCH_SIZE ]; + opus_val32 xcorr[ SCRATCH_SIZE ]; const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; - silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); - silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); + celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); + celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; @@ -516,7 +515,7 @@ static void silk_P_Ana_calc_corr_st3( nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); + celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; @@ -530,10 +529,11 @@ static void silk_P_Ana_calc_corr_st3( /* Calculate the correlations for each subframe */ lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 ); lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 ); + silk_assert(lag_high-lag_low+1 <= SCRATCH_SIZE); + celt_pitch_xcorr( target_ptr, target_ptr - start_lag - lag_high, xcorr, sf_length, lag_high - lag_low + 1, arch ); for( j = lag_low; j <= lag_high; j++ ) { - basis_ptr = target_ptr - ( start_lag + j ); silk_assert( lag_counter < SCRATCH_SIZE ); - scratch_mem[ lag_counter ] = (silk_float)silk_inner_product_FLP( target_ptr, basis_ptr, sf_length ); + scratch_mem[ lag_counter ] = xcorr[ lag_high - j ]; lag_counter++; } @@ -552,6 +552,10 @@ static void silk_P_Ana_calc_corr_st3( } } +/********************************************************************/ +/* Calculate the energies for first two subframes. The energies are */ +/* calculated recursively. */ +/********************************************************************/ static void silk_P_Ana_calc_energy_st3( silk_float energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */ const silk_float frame[], /* I vector to correlate */ @@ -560,10 +564,6 @@ static void silk_P_Ana_calc_energy_st3( opus_int nb_subfr, /* I number of subframes */ opus_int complexity /* I Complexity setting */ ) -/**************************************************************** -Calculate the energies for first two subframes. The energies are -calculated recursively. -****************************************************************/ { const silk_float *target_ptr, *basis_ptr; double energy; @@ -572,8 +572,8 @@ calculated recursively. silk_float scratch_mem[ SCRATCH_SIZE ]; const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; - silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); - silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); + celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); + celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; @@ -581,7 +581,7 @@ calculated recursively. nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); + celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; diff --git a/external/opus-1.0.3/silk/float/process_gains_FLP.c b/external/opus-1.3.1/silk/float/process_gains_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/process_gains_FLP.c rename to external/opus-1.3.1/silk/float/process_gains_FLP.c index d572a4cd..c0da0dae 100644 --- a/external/opus-1.0.3/silk/float/process_gains_FLP.c +++ b/external/opus-1.3.1/silk/float/process_gains_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/regularize_correlations_FLP.c b/external/opus-1.3.1/silk/float/regularize_correlations_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/regularize_correlations_FLP.c rename to external/opus-1.3.1/silk/float/regularize_correlations_FLP.c index f5684637..df461260 100644 --- a/external/opus-1.0.3/silk/float/regularize_correlations_FLP.c +++ b/external/opus-1.3.1/silk/float/regularize_correlations_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/residual_energy_FLP.c b/external/opus-1.3.1/silk/float/residual_energy_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/residual_energy_FLP.c rename to external/opus-1.3.1/silk/float/residual_energy_FLP.c index e65457ab..1bd07b33 100644 --- a/external/opus-1.0.3/silk/float/residual_energy_FLP.c +++ b/external/opus-1.3.1/silk/float/residual_energy_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -47,7 +47,7 @@ silk_float silk_residual_energy_covar_FLP( /* O silk_float tmp, nrg = 0.0f, regularization; /* Safety checks */ - silk_assert( D >= 0 ); + celt_assert( D >= 0 ); regularization = REGULARIZATION_FACTOR * ( wXX[ 0 ] + wXX[ D * D - 1 ] ); for( k = 0; k < MAX_ITERATIONS_RESIDUAL_NRG; k++ ) { diff --git a/external/opus-1.0.3/silk/float/scale_copy_vector_FLP.c b/external/opus-1.3.1/silk/float/scale_copy_vector_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/scale_copy_vector_FLP.c rename to external/opus-1.3.1/silk/float/scale_copy_vector_FLP.c index 988795a6..20db32b3 100644 --- a/external/opus-1.0.3/silk/float/scale_copy_vector_FLP.c +++ b/external/opus-1.3.1/silk/float/scale_copy_vector_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/scale_vector_FLP.c b/external/opus-1.3.1/silk/float/scale_vector_FLP.c similarity index 99% rename from external/opus-1.0.3/silk/float/scale_vector_FLP.c rename to external/opus-1.3.1/silk/float/scale_vector_FLP.c index 387eb4ba..108fdcbe 100644 --- a/external/opus-1.0.3/silk/float/scale_vector_FLP.c +++ b/external/opus-1.3.1/silk/float/scale_vector_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/float/schur_FLP.c b/external/opus-1.3.1/silk/float/schur_FLP.c similarity index 90% rename from external/opus-1.0.3/silk/float/schur_FLP.c rename to external/opus-1.3.1/silk/float/schur_FLP.c index 90c3a18b..8526c748 100644 --- a/external/opus-1.0.3/silk/float/schur_FLP.c +++ b/external/opus-1.3.1/silk/float/schur_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -38,22 +38,23 @@ silk_float silk_schur_FLP( /* O returns residual energy ) { opus_int k, n; - silk_float C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; - silk_float Ctmp1, Ctmp2, rc_tmp; + double C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; + double Ctmp1, Ctmp2, rc_tmp; - silk_assert( order==6||order==8||order==10||order==12||order==14||order==16 ); + celt_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); /* Copy correlations */ - for( k = 0; k < order+1; k++ ) { + k = 0; + do { C[ k ][ 0 ] = C[ k ][ 1 ] = auto_corr[ k ]; - } + } while( ++k <= order ); for( k = 0; k < order; k++ ) { /* Get reflection coefficient */ rc_tmp = -C[ k + 1 ][ 0 ] / silk_max_float( C[ 0 ][ 1 ], 1e-9f ); /* Save the output */ - refl_coef[ k ] = rc_tmp; + refl_coef[ k ] = (silk_float)rc_tmp; /* Update correlations */ for( n = 0; n < order - k; n++ ) { @@ -65,6 +66,5 @@ silk_float silk_schur_FLP( /* O returns residual energy } /* Return residual energy */ - return C[ 0 ][ 1 ]; + return (silk_float)C[ 0 ][ 1 ]; } - diff --git a/external/opus-1.0.3/silk/float/sort_FLP.c b/external/opus-1.3.1/silk/float/sort_FLP.c similarity index 97% rename from external/opus-1.0.3/silk/float/sort_FLP.c rename to external/opus-1.3.1/silk/float/sort_FLP.c index e290c380..0e18f319 100644 --- a/external/opus-1.0.3/silk/float/sort_FLP.c +++ b/external/opus-1.3.1/silk/float/sort_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -47,9 +47,9 @@ void silk_insertion_sort_decreasing_FLP( opus_int i, j; /* Safety checks */ - silk_assert( K > 0 ); - silk_assert( L > 0 ); - silk_assert( L >= K ); + celt_assert( K > 0 ); + celt_assert( L > 0 ); + celt_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { diff --git a/external/opus-1.0.3/silk/float/structs_FLP.h b/external/opus-1.3.1/silk/float/structs_FLP.h similarity index 82% rename from external/opus-1.0.3/silk/float/structs_FLP.h rename to external/opus-1.3.1/silk/float/structs_FLP.h index 1f0b4e2b..3150b386 100644 --- a/external/opus-1.0.3/silk/float/structs_FLP.h +++ b/external/opus-1.3.1/silk/float/structs_FLP.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -42,32 +42,16 @@ extern "C" /********************************/ typedef struct { opus_int8 LastGainIndex; - silk_float HarmBoost_smth; silk_float HarmShapeGain_smth; silk_float Tilt_smth; } silk_shape_state_FLP; -/********************************/ -/* Prefilter state */ -/********************************/ -typedef struct { - silk_float sLTP_shp[ LTP_BUF_LENGTH ]; - silk_float sAR_shp[ MAX_SHAPE_LPC_ORDER + 1 ]; - opus_int sLTP_shp_buf_idx; - silk_float sLF_AR_shp; - silk_float sLF_MA_shp; - silk_float sHarmHP; - opus_int32 rand_seed; - opus_int lagPrev; -} silk_prefilter_state_FLP; - /********************************/ /* Encoder state FLP */ /********************************/ typedef struct { silk_encoder_state sCmn; /* Common struct, shared with fixed-point code */ silk_shape_state_FLP sShape; /* Noise shaping state */ - silk_prefilter_state_FLP sPrefilt; /* Prefilter State */ /* Buffer for find pitch and noise shape analysis */ silk_float x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */ @@ -86,12 +70,9 @@ typedef struct { opus_int pitchL[ MAX_NB_SUBFR ]; /* Noise shaping parameters */ - silk_float AR1[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; - silk_float AR2[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + silk_float AR[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; silk_float LF_MA_shp[ MAX_NB_SUBFR ]; silk_float LF_AR_shp[ MAX_NB_SUBFR ]; - silk_float GainsPre[ MAX_NB_SUBFR ]; - silk_float HarmBoost[ MAX_NB_SUBFR ]; silk_float Tilt[ MAX_NB_SUBFR ]; silk_float HarmShapeGain[ MAX_NB_SUBFR ]; silk_float Lambda; @@ -99,7 +80,6 @@ typedef struct { silk_float coding_quality; /* Measures */ - silk_float sparseness; silk_float predGain; silk_float LTPredCodGain; silk_float ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */ diff --git a/external/opus-1.0.3/silk/float/warped_autocorrelation_FLP.c b/external/opus-1.3.1/silk/float/warped_autocorrelation_FLP.c similarity index 93% rename from external/opus-1.0.3/silk/float/warped_autocorrelation_FLP.c rename to external/opus-1.3.1/silk/float/warped_autocorrelation_FLP.c index e9ecc2a3..09186e73 100644 --- a/external/opus-1.0.3/silk/float/warped_autocorrelation_FLP.c +++ b/external/opus-1.3.1/silk/float/warped_autocorrelation_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -42,11 +42,11 @@ void silk_warped_autocorrelation_FLP( { opus_int n, i; double tmp1, tmp2; - double state[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; - double C[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + double state[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + double C[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; /* Order must be even */ - silk_assert( ( order & 1 ) == 0 ); + celt_assert( ( order & 1 ) == 0 ); /* Loop over samples */ for( n = 0; n < length; n++ ) { diff --git a/external/opus-1.0.3/silk/float/wrappers_FLP.c b/external/opus-1.3.1/silk/float/wrappers_FLP.c similarity index 76% rename from external/opus-1.0.3/silk/float/wrappers_FLP.c rename to external/opus-1.3.1/silk/float/wrappers_FLP.c index 4259e90e..ad90b874 100644 --- a/external/opus-1.0.3/silk/float/wrappers_FLP.c +++ b/external/opus-1.3.1/silk/float/wrappers_FLP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -54,13 +54,14 @@ void silk_A2NLSF_FLP( void silk_NLSF2A_FLP( silk_float *pAR, /* O LPC coefficients [ LPC_order ] */ const opus_int16 *NLSF_Q15, /* I NLSF vector [ LPC_order ] */ - const opus_int LPC_order /* I LPC order */ + const opus_int LPC_order, /* I LPC order */ + int arch /* I Run-time architecture */ ) { opus_int i; opus_int16 a_fix_Q12[ MAX_LPC_ORDER ]; - silk_NLSF2A( a_fix_Q12, NLSF_Q15, LPC_order ); + silk_NLSF2A( a_fix_Q12, NLSF_Q15, LPC_order, arch ); for( i = 0; i < LPC_order; i++ ) { pAR[ i ] = ( silk_float )a_fix_Q12[ i ] * ( 1.0f / 4096.0f ); @@ -102,14 +103,14 @@ void silk_NSQ_wrapper_FLP( ) { opus_int i, j; - opus_int32 x_Q3[ MAX_FRAME_LENGTH ]; + opus_int16 x16[ MAX_FRAME_LENGTH ]; opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; opus_int LTP_scale_Q14; /* Noise shaping parameters */ - opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ opus_int Lambda_Q10; opus_int Tilt_Q14[ MAX_NB_SUBFR ]; @@ -119,7 +120,7 @@ void silk_NSQ_wrapper_FLP( /* Noise shape parameters */ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { for( j = 0; j < psEnc->sCmn.shapingLPCOrder; j++ ) { - AR2_Q13[ i * MAX_SHAPE_LPC_ORDER + j ] = silk_float2int( psEncCtrl->AR2[ i * MAX_SHAPE_LPC_ORDER + j ] * 8192.0f ); + AR_Q13[ i * MAX_SHAPE_LPC_ORDER + j ] = silk_float2int( psEncCtrl->AR[ i * MAX_SHAPE_LPC_ORDER + j ] * 8192.0f ); } } @@ -155,16 +156,16 @@ void silk_NSQ_wrapper_FLP( /* Convert input to fix */ for( i = 0; i < psEnc->sCmn.frame_length; i++ ) { - x_Q3[ i ] = silk_float2int( 8.0f * x[ i ] ); + x16[ i ] = silk_float2int( x[ i ] ); } /* Call NSQ */ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { - silk_NSQ_del_dec( &psEnc->sCmn, psNSQ, psIndices, x_Q3, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, - AR2_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14 ); + silk_NSQ_del_dec( &psEnc->sCmn, psNSQ, psIndices, x16, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, + AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14, psEnc->sCmn.arch ); } else { - silk_NSQ( &psEnc->sCmn, psNSQ, psIndices, x_Q3, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, - AR2_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14 ); + silk_NSQ( &psEnc->sCmn, psNSQ, psIndices, x16, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, + AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14, psEnc->sCmn.arch ); } } @@ -172,29 +173,35 @@ void silk_NSQ_wrapper_FLP( /* Floating-point Silk LTP quantiation wrapper */ /***********************************************/ void silk_quant_LTP_gains_FLP( - silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (Un-)quantized LTP gains */ + silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */ opus_int8 *periodicity_index, /* O Periodicity index */ - const silk_float W[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Error weights */ - const opus_int mu_Q10, /* I Mu value (R/D tradeoff) */ - const opus_int lowComplexity, /* I Flag for low complexity */ - const opus_int nb_subfr /* I number of subframes */ + opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ + silk_float *pred_gain_dB, /* O LTP prediction gain */ + const silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Correlation matrix */ + const silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* I Correlation vector */ + const opus_int subfr_len, /* I Number of samples per subframe */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ ) { - opus_int i; + opus_int i, pred_gain_dB_Q7; opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ]; - opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ]; + opus_int32 XX_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; + opus_int32 xX_Q17[ MAX_NB_SUBFR * LTP_ORDER ]; - for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { - B_Q14[ i ] = (opus_int16)silk_float2int( B[ i ] * 16384.0f ); - } for( i = 0; i < nb_subfr * LTP_ORDER * LTP_ORDER; i++ ) { - W_Q18[ i ] = (opus_int32)silk_float2int( W[ i ] * 262144.0f ); + XX_Q17[ i ] = (opus_int32)silk_float2int( XX[ i ] * 131072.0f ); + } + for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { + xX_Q17[ i ] = (opus_int32)silk_float2int( xX[ i ] * 131072.0f ); } - silk_quant_LTP_gains( B_Q14, cbk_index, periodicity_index, W_Q18, mu_Q10, lowComplexity, nb_subfr ); + silk_quant_LTP_gains( B_Q14, cbk_index, periodicity_index, sum_log_gain_Q7, &pred_gain_dB_Q7, XX_Q17, xX_Q17, subfr_len, nb_subfr, arch ); for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { B[ i ] = (silk_float)B_Q14[ i ] * ( 1.0f / 16384.0f ); } + + *pred_gain_dB = (silk_float)pred_gain_dB_Q7 * ( 1.0f / 128.0f ); } diff --git a/external/opus-1.0.3/silk/gain_quant.c b/external/opus-1.3.1/silk/gain_quant.c similarity index 98% rename from external/opus-1.0.3/silk/gain_quant.c rename to external/opus-1.3.1/silk/gain_quant.c index b2f73735..ee65245a 100644 --- a/external/opus-1.0.3/silk/gain_quant.c +++ b/external/opus-1.3.1/silk/gain_quant.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -76,6 +76,7 @@ void silk_gains_quant( /* Accumulate deltas */ if( ind[ k ] > double_step_size_threshold ) { *prev_ind += silk_LSHIFT( ind[ k ], 1 ) - double_step_size_threshold; + *prev_ind = silk_min_int( *prev_ind, N_LEVELS_QGAIN - 1 ); } else { *prev_ind += ind[ k ]; } diff --git a/external/opus-1.0.3/silk/init_decoder.c b/external/opus-1.3.1/silk/init_decoder.c similarity index 97% rename from external/opus-1.0.3/silk/init_decoder.c rename to external/opus-1.3.1/silk/init_decoder.c index 47834890..16c03dcd 100644 --- a/external/opus-1.0.3/silk/init_decoder.c +++ b/external/opus-1.3.1/silk/init_decoder.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -44,6 +44,7 @@ opus_int silk_init_decoder( /* Used to deactivate LSF interpolation */ psDec->first_frame_after_reset = 1; psDec->prev_gain_Q16 = 65536; + psDec->arch = opus_select_arch(); /* Reset CNG state */ silk_CNG_Reset( psDec ); diff --git a/external/opus-1.0.3/silk/init_encoder.c b/external/opus-1.3.1/silk/init_encoder.c similarity index 89% rename from external/opus-1.0.3/silk/init_encoder.c rename to external/opus-1.3.1/silk/init_encoder.c index fe3fe968..65995c33 100644 --- a/external/opus-1.0.3/silk/init_encoder.c +++ b/external/opus-1.3.1/silk/init_encoder.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -34,12 +34,14 @@ POSSIBILITY OF SUCH DAMAGE. #include "main_FLP.h" #endif #include "tuning_parameters.h" +#include "cpu_support.h" /*********************************/ /* Initialize Silk Encoder state */ /*********************************/ opus_int silk_init_encoder( - silk_encoder_state_Fxx *psEnc /* I/O Pointer to Silk FIX encoder state */ + silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk FIX encoder state */ + int arch /* I Run-time architecture */ ) { opus_int ret = 0; @@ -47,6 +49,8 @@ opus_int silk_init_encoder( /* Clear the entire encoder state */ silk_memset( psEnc, 0, sizeof( silk_encoder_state_Fxx ) ); + psEnc->sCmn.arch = arch; + psEnc->sCmn.variable_HP_smth1_Q15 = silk_LSHIFT( silk_lin2log( SILK_FIX_CONST( VARIABLE_HP_MIN_CUTOFF_HZ, 16 ) ) - ( 16 << 7 ), 8 ); psEnc->sCmn.variable_HP_smth2_Q15 = psEnc->sCmn.variable_HP_smth1_Q15; diff --git a/external/opus-1.0.3/silk/inner_prod_aligned.c b/external/opus-1.3.1/silk/inner_prod_aligned.c similarity index 99% rename from external/opus-1.0.3/silk/inner_prod_aligned.c rename to external/opus-1.3.1/silk/inner_prod_aligned.c index fe20a2b1..257ae9e0 100644 --- a/external/opus-1.0.3/silk/inner_prod_aligned.c +++ b/external/opus-1.3.1/silk/inner_prod_aligned.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/interpolate.c b/external/opus-1.3.1/silk/interpolate.c similarity index 96% rename from external/opus-1.0.3/silk/interpolate.c rename to external/opus-1.3.1/silk/interpolate.c index 226488b9..833c28ef 100644 --- a/external/opus-1.0.3/silk/interpolate.c +++ b/external/opus-1.3.1/silk/interpolate.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -42,8 +42,8 @@ void silk_interpolate( { opus_int i; - silk_assert( ifact_Q2 >= 0 ); - silk_assert( ifact_Q2 <= 4 ); + celt_assert( ifact_Q2 >= 0 ); + celt_assert( ifact_Q2 <= 4 ); for( i = 0; i < d; i++ ) { xi[ i ] = (opus_int16)silk_ADD_RSHIFT( x0[ i ], silk_SMULBB( x1[ i ] - x0[ i ], ifact_Q2 ), 2 ); diff --git a/external/opus-1.0.3/silk/lin2log.c b/external/opus-1.3.1/silk/lin2log.c similarity index 94% rename from external/opus-1.0.3/silk/lin2log.c rename to external/opus-1.3.1/silk/lin2log.c index 212b670d..0d5155aa 100644 --- a/external/opus-1.0.3/silk/lin2log.c +++ b/external/opus-1.3.1/silk/lin2log.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -41,6 +41,6 @@ opus_int32 silk_lin2log( silk_CLZ_FRAC( inLin, &lz, &frac_Q7 ); /* Piece-wise parabolic approximation */ - return silk_LSHIFT( 31 - lz, 7 ) + silk_SMLAWB( frac_Q7, silk_MUL( frac_Q7, 128 - frac_Q7 ), 179 ); + return silk_ADD_LSHIFT32( silk_SMLAWB( frac_Q7, silk_MUL( frac_Q7, 128 - frac_Q7 ), 179 ), 31 - lz, 7 ); } diff --git a/external/opus-1.0.3/silk/log2lin.c b/external/opus-1.3.1/silk/log2lin.c similarity index 95% rename from external/opus-1.0.3/silk/log2lin.c rename to external/opus-1.3.1/silk/log2lin.c index 33a19ad1..b7c48e47 100644 --- a/external/opus-1.0.3/silk/log2lin.c +++ b/external/opus-1.3.1/silk/log2lin.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -33,7 +33,7 @@ POSSIBILITY OF SUCH DAMAGE. /* Approximation of 2^() (very close inverse of silk_lin2log()) */ /* Convert input to a linear scale */ -opus_int32 silk_log2lin( +opus_int32 silk_log2lin( const opus_int32 inLog_Q7 /* I input on log scale */ ) { @@ -41,6 +41,8 @@ opus_int32 silk_log2lin( if( inLog_Q7 < 0 ) { return 0; + } else if ( inLog_Q7 >= 3967 ) { + return silk_int32_MAX; } out = silk_LSHIFT( 1, silk_RSHIFT( inLog_Q7, 7 ) ); diff --git a/external/opus-1.0.3/silk/macros.h b/external/opus-1.3.1/silk/macros.h similarity index 71% rename from external/opus-1.0.3/silk/macros.h rename to external/opus-1.3.1/silk/macros.h index 2612fc7a..3c67b6e5 100644 --- a/external/opus-1.0.3/silk/macros.h +++ b/external/opus-1.3.1/silk/macros.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -32,19 +32,39 @@ POSSIBILITY OF SUCH DAMAGE. #include "config.h" #endif -/* This is an inline header file for general platform. */ +#include "opus_types.h" +#include "opus_defines.h" +#include "arch.h" + +/* This is an OPUS_INLINE header file for general platform. */ /* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ +#if OPUS_FAST_INT64 +#define silk_SMULWB(a32, b32) ((opus_int32)(((a32) * (opus_int64)((opus_int16)(b32))) >> 16)) +#else #define silk_SMULWB(a32, b32) ((((a32) >> 16) * (opus_int32)((opus_int16)(b32))) + ((((a32) & 0x0000FFFF) * (opus_int32)((opus_int16)(b32))) >> 16)) +#endif /* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ +#if OPUS_FAST_INT64 +#define silk_SMLAWB(a32, b32, c32) ((opus_int32)((a32) + (((b32) * (opus_int64)((opus_int16)(c32))) >> 16))) +#else #define silk_SMLAWB(a32, b32, c32) ((a32) + ((((b32) >> 16) * (opus_int32)((opus_int16)(c32))) + ((((b32) & 0x0000FFFF) * (opus_int32)((opus_int16)(c32))) >> 16))) +#endif /* (a32 * (b32 >> 16)) >> 16 */ +#if OPUS_FAST_INT64 +#define silk_SMULWT(a32, b32) ((opus_int32)(((a32) * (opus_int64)((b32) >> 16)) >> 16)) +#else #define silk_SMULWT(a32, b32) (((a32) >> 16) * ((b32) >> 16) + ((((a32) & 0x0000FFFF) * ((b32) >> 16)) >> 16)) +#endif /* a32 + (b32 * (c32 >> 16)) >> 16 */ +#if OPUS_FAST_INT64 +#define silk_SMLAWT(a32, b32, c32) ((opus_int32)((a32) + (((b32) * ((opus_int64)(c32) >> 16)) >> 16))) +#else #define silk_SMLAWT(a32, b32, c32) ((a32) + (((b32) >> 16) * ((c32) >> 16)) + ((((b32) & 0x0000FFFF) * ((c32) >> 16)) >> 16)) +#endif /* (opus_int32)((opus_int16)(a3))) * (opus_int32)((opus_int16)(b32)) output have to be 32bit int */ #define silk_SMULBB(a32, b32) ((opus_int32)((opus_int16)(a32)) * (opus_int32)((opus_int16)(b32))) @@ -62,10 +82,18 @@ POSSIBILITY OF SUCH DAMAGE. #define silk_SMLAL(a64, b32, c32) (silk_ADD64((a64), ((opus_int64)(b32) * (opus_int64)(c32)))) /* (a32 * b32) >> 16 */ +#if OPUS_FAST_INT64 +#define silk_SMULWW(a32, b32) ((opus_int32)(((opus_int64)(a32) * (b32)) >> 16)) +#else #define silk_SMULWW(a32, b32) silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)) +#endif /* a32 + ((b32 * c32) >> 16) */ +#if OPUS_FAST_INT64 +#define silk_SMLAWW(a32, b32, c32) ((opus_int32)((a32) + (((opus_int64)(b32) * (c32)) >> 16))) +#else #define silk_SMLAWW(a32, b32, c32) silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16)) +#endif /* add/subtract with output saturated */ #define silk_ADD_SAT32(a, b) ((((opus_uint32)(a) + (opus_uint32)(b)) & 0x80000000) == 0 ? \ @@ -76,59 +104,47 @@ POSSIBILITY OF SUCH DAMAGE. (( (a) & ((b)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a)-(b)) : \ ((((a)^0x80000000) & (b) & 0x80000000) ? silk_int32_MAX : (a)-(b)) ) -static inline opus_int32 silk_CLZ16(opus_int16 in16) +#if defined(MIPSr1_ASM) +#include "mips/macros_mipsr1.h" +#endif + +#include "ecintrin.h" +#ifndef OVERRIDE_silk_CLZ16 +static OPUS_INLINE opus_int32 silk_CLZ16(opus_int16 in16) { - opus_int32 out32 = 0; - if( in16 == 0 ) { - return 16; - } - /* test nibbles */ - if( in16 & 0xFF00 ) { - if( in16 & 0xF000 ) { - in16 >>= 12; - } else { - out32 += 4; - in16 >>= 8; - } - } else { - if( in16 & 0xFFF0 ) { - out32 += 8; - in16 >>= 4; - } else { - out32 += 12; - } - } - /* test bits and return */ - if( in16 & 0xC ) { - if( in16 & 0x8 ) - return out32 + 0; - else - return out32 + 1; - } else { - if( in16 & 0xE ) - return out32 + 2; - else - return out32 + 3; - } + return 32 - EC_ILOG(in16<<16|0x8000); } +#endif -static inline opus_int32 silk_CLZ32(opus_int32 in32) +#ifndef OVERRIDE_silk_CLZ32 +static OPUS_INLINE opus_int32 silk_CLZ32(opus_int32 in32) { - /* test highest 16 bits and convert to opus_int16 */ - if( in32 & 0xFFFF0000 ) { - return silk_CLZ16((opus_int16)(in32 >> 16)); - } else { - return silk_CLZ16((opus_int16)in32) + 16; - } + return in32 ? 32 - EC_ILOG(in32) : 32; } +#endif /* Row based */ -#define matrix_ptr(Matrix_base_adr, row, column, N) *(Matrix_base_adr + ((row)*(N)+(column))) -#define matrix_adr(Matrix_base_adr, row, column, N) (Matrix_base_adr + ((row)*(N)+(column))) +#define matrix_ptr(Matrix_base_adr, row, column, N) \ + (*((Matrix_base_adr) + ((row)*(N)+(column)))) +#define matrix_adr(Matrix_base_adr, row, column, N) \ + ((Matrix_base_adr) + ((row)*(N)+(column))) /* Column based */ #ifndef matrix_c_ptr -# define matrix_c_ptr(Matrix_base_adr, row, column, M) *(Matrix_base_adr + ((row)+(M)*(column))) +# define matrix_c_ptr(Matrix_base_adr, row, column, M) \ + (*((Matrix_base_adr) + ((row)+(M)*(column)))) +#endif + +#ifdef OPUS_ARM_INLINE_ASM +#include "arm/macros_armv4.h" +#endif + +#ifdef OPUS_ARM_INLINE_EDSP +#include "arm/macros_armv5e.h" +#endif + +#ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR +#include "arm/macros_arm64.h" #endif #endif /* SILK_MACROS_H */ diff --git a/external/opus-1.0.3/silk/main.h b/external/opus-1.3.1/silk/main.h similarity index 82% rename from external/opus-1.0.3/silk/main.h rename to external/opus-1.3.1/silk/main.h index 32675f69..1a33eed5 100644 --- a/external/opus-1.0.3/silk/main.h +++ b/external/opus-1.3.1/silk/main.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -38,6 +38,14 @@ POSSIBILITY OF SUCH DAMAGE. #include "entenc.h" #include "entdec.h" +#if defined(OPUS_X86_MAY_HAVE_SSE4_1) +#include "x86/main_sse.h" +#endif + +#if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#include "arm/NSQ_del_dec_arm.h" +#endif + /* Convert Left/Right stereo signal to adaptive Mid/Side representation */ void silk_stereo_LR_to_MS( stereo_enc_state *state, /* I/O State */ @@ -105,22 +113,22 @@ void silk_stereo_decode_mid_only( /* Encodes signs of excitation */ void silk_encode_signs( - ec_enc *psRangeEnc, /* I/O Compressor data structure */ - const opus_int8 pulses[], /* I pulse signal */ - opus_int length, /* I length of input */ - const opus_int signalType, /* I Signal type */ - const opus_int quantOffsetType, /* I Quantization offset type */ - const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + const opus_int8 pulses[], /* I pulse signal */ + opus_int length, /* I length of input */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I Quantization offset type */ + const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ); /* Decodes signs of excitation */ void silk_decode_signs( - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int pulses[], /* I/O pulse signal */ - opus_int length, /* I length of input */ - const opus_int signalType, /* I Signal type */ - const opus_int quantOffsetType, /* I Quantization offset type */ - const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 pulses[], /* I/O pulse signal */ + opus_int length, /* I length of input */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I Quantization offset type */ + const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ); /* Check encoder control struct */ @@ -161,7 +169,7 @@ void silk_shell_encoder( /* Shell decoder, operates on one shell code frame of 16 pulses */ void silk_shell_decoder( - opus_int *pulses0, /* O data: nonnegative pulse amplitudes */ + opus_int16 *pulses0, /* O data: nonnegative pulse amplitudes */ ec_dec *psRangeDec, /* I/O Compressor data structure */ const opus_int pulses4 /* I number of pulses per pulse-subframe */ ); @@ -201,39 +209,52 @@ void silk_interpolate( /* LTP tap quantizer */ void silk_quant_LTP_gains( - opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (un)quantized LTP gains */ + opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ opus_int8 *periodicity_index, /* O Periodicity Index */ - const opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Error Weights in Q18 */ - opus_int mu_Q9, /* I Mu value (R/D tradeoff) */ - opus_int lowComplexity, /* I Flag for low complexity */ - const opus_int nb_subfr /* I number of subframes */ + opus_int32 *sum_gain_dB_Q7, /* I/O Cumulative max prediction gain */ + opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ + const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ + const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ + const opus_int subfr_len, /* I Number of samples per subframe */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ ); /* Entropy constrained matrix-weighted VQ, for a single input data vector */ -void silk_VQ_WMat_EC( +void silk_VQ_WMat_EC_c( opus_int8 *ind, /* O index of best codebook vector */ - opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ - const opus_int16 *in_Q14, /* I input vector to be quantized */ - const opus_int32 *W_Q18, /* I weighting matrix */ + opus_int32 *res_nrg_Q15, /* O best residual energy */ + opus_int32 *rate_dist_Q8, /* O best total bitrate */ + opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ + const opus_int32 *XX_Q17, /* I correlation matrix */ + const opus_int32 *xX_Q17, /* I correlation vector */ const opus_int8 *cb_Q7, /* I codebook */ + const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ - const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ - opus_int L /* I number of vectors in codebook */ + const opus_int subfr_len, /* I number of samples per subframe */ + const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + const opus_int L /* I number of vectors in codebook */ ); +#if !defined(OVERRIDE_silk_VQ_WMat_EC) +#define silk_VQ_WMat_EC(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L, arch) \ + ((void)(arch),silk_VQ_WMat_EC_c(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L)) +#endif + /************************************/ /* Noise shaping quantization (NSQ) */ /************************************/ -void silk_NSQ( - const silk_encoder_state *psEncC, /* I/O Encoder State */ + +void silk_NSQ_c( + const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int32 x_Q3[], /* I Prefiltered input signal */ + const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ @@ -243,16 +264,23 @@ void silk_NSQ( const opus_int LTP_scale_Q14 /* I LTP state scaling */ ); +#if !defined(OVERRIDE_silk_NSQ) +#define silk_NSQ(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ + ((void)(arch),silk_NSQ_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) +#endif + /* Noise shaping using delayed decision */ -void silk_NSQ_del_dec( - const silk_encoder_state *psEncC, /* I/O Encoder State */ +void silk_NSQ_del_dec_c( + const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int32 x_Q3[], /* I Prefiltered input signal */ + const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ @@ -262,6 +290,13 @@ void silk_NSQ_del_dec( const opus_int LTP_scale_Q14 /* I LTP state scaling */ ); +#if !defined(OVERRIDE_silk_NSQ_del_dec) +#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ + ((void)(arch),silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) +#endif + /************/ /* Silk VAD */ /************/ @@ -271,11 +306,15 @@ opus_int silk_VAD_Init( /* O Return v ); /* Get speech activity level in Q8 */ -opus_int silk_VAD_GetSA_Q8( /* O Return value, 0 if success */ +opus_int silk_VAD_GetSA_Q8_c( /* O Return value, 0 if success */ silk_encoder_state *psEncC, /* I/O Encoder state */ const opus_int16 pIn[] /* I PCM input */ ); +#if !defined(OVERRIDE_silk_VAD_GetSA_Q8) +#define silk_VAD_GetSA_Q8(psEnC, pIn, arch) ((void)(arch),silk_VAD_GetSA_Q8_c(psEnC, pIn)) +#endif + /* Low-pass filter with variable cutoff frequency based on */ /* piece-wise linear interpolation between elliptic filters */ /* Start by setting transition_frame_no = 1; */ @@ -311,6 +350,7 @@ void silk_NLSF_VQ( opus_int32 err_Q26[], /* O Quantization errors [K] */ const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ + const opus_int16 pWght_Q9[], /* I Codebook weights [K*LPC_order] */ const opus_int K, /* I Number of codebook vectors */ const opus_int LPC_order /* I Number of LPCs */ ); @@ -369,7 +409,8 @@ opus_int silk_decode_frame( opus_int16 pOut[], /* O Pointer to output speech frame */ opus_int32 *pN, /* O Pointer to size of output frame */ opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ - opus_int condCoding /* I The type of conditional coding to use */ + opus_int condCoding, /* I The type of conditional coding to use */ + int arch /* I Run-time architecture */ ); /* Decode indices from bitstream */ @@ -393,13 +434,14 @@ void silk_decode_core( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I Decoder control */ opus_int16 xq[], /* O Decoded speech */ - const opus_int pulses[ MAX_FRAME_LENGTH ] /* I Pulse signal */ + const opus_int16 pulses[ MAX_FRAME_LENGTH ], /* I Pulse signal */ + int arch /* I Run-time architecture */ ); /* Decode quantization indices of excitation (Shell coding) */ void silk_decode_pulses( ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int pulses[], /* O Excitation signal */ + opus_int16 pulses[], /* O Excitation signal */ const opus_int signalType, /* I Sigtype */ const opus_int quantOffsetType, /* I quantOffsetType */ const opus_int frame_length /* I Frame length */ diff --git a/external/opus-1.3.1/silk/mips/NSQ_del_dec_mipsr1.h b/external/opus-1.3.1/silk/mips/NSQ_del_dec_mipsr1.h new file mode 100644 index 00000000..cd70713a --- /dev/null +++ b/external/opus-1.3.1/silk/mips/NSQ_del_dec_mipsr1.h @@ -0,0 +1,410 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef __NSQ_DEL_DEC_MIPSR1_H__ +#define __NSQ_DEL_DEC_MIPSR1_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main.h" +#include "stack_alloc.h" + +#define OVERRIDE_silk_noise_shape_quantizer_del_dec +static inline void silk_noise_shape_quantizer_del_dec( + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ + opus_int signalType, /* I Signal type */ + const opus_int32 x_Q10[], /* I */ + opus_int8 pulses[], /* O */ + opus_int16 xq[], /* O */ + opus_int32 sLTP_Q15[], /* I/O LTP filter state */ + opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ + const opus_int16 a_Q12[], /* I Short term prediction coefs */ + const opus_int16 b_Q14[], /* I Long term prediction coefs */ + const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ + opus_int lag, /* I Pitch lag */ + opus_int32 HarmShapeFIRPacked_Q14, /* I */ + opus_int Tilt_Q14, /* I Spectral tilt */ + opus_int32 LF_shp_Q14, /* I */ + opus_int32 Gain_Q16, /* I */ + opus_int Lambda_Q10, /* I */ + opus_int offset_Q10, /* I */ + opus_int length, /* I Input length */ + opus_int subfr, /* I Subframe number */ + opus_int shapingLPCOrder, /* I Shaping LPC filter order */ + opus_int predictLPCOrder, /* I Prediction filter order */ + opus_int warping_Q16, /* I */ + opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ + opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int decisionDelay, /* I */ + int arch /* I */ +) +{ + opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; + opus_int32 Winner_rand_state; + opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14; + opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10; + opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; + opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; + opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14; + NSQ_sample_struct psSampleState[ MAX_DEL_DEC_STATES ][ 2 ]; + NSQ_del_dec_struct *psDD; + NSQ_sample_struct *psSS; + opus_int16 b_Q14_0, b_Q14_1, b_Q14_2, b_Q14_3, b_Q14_4; + opus_int16 a_Q12_0, a_Q12_1, a_Q12_2, a_Q12_3, a_Q12_4, a_Q12_5, a_Q12_6; + opus_int16 a_Q12_7, a_Q12_8, a_Q12_9, a_Q12_10, a_Q12_11, a_Q12_12, a_Q12_13; + opus_int16 a_Q12_14, a_Q12_15; + + opus_int32 cur, prev, next; + + /*Unused.*/ + (void)arch; + + //Intialize b_Q14 variables + b_Q14_0 = b_Q14[ 0 ]; + b_Q14_1 = b_Q14[ 1 ]; + b_Q14_2 = b_Q14[ 2 ]; + b_Q14_3 = b_Q14[ 3 ]; + b_Q14_4 = b_Q14[ 4 ]; + + //Intialize a_Q12 variables + a_Q12_0 = a_Q12[0]; + a_Q12_1 = a_Q12[1]; + a_Q12_2 = a_Q12[2]; + a_Q12_3 = a_Q12[3]; + a_Q12_4 = a_Q12[4]; + a_Q12_5 = a_Q12[5]; + a_Q12_6 = a_Q12[6]; + a_Q12_7 = a_Q12[7]; + a_Q12_8 = a_Q12[8]; + a_Q12_9 = a_Q12[9]; + a_Q12_10 = a_Q12[10]; + a_Q12_11 = a_Q12[11]; + a_Q12_12 = a_Q12[12]; + a_Q12_13 = a_Q12[13]; + a_Q12_14 = a_Q12[14]; + a_Q12_15 = a_Q12[15]; + + long long temp64; + + silk_assert( nStatesDelayedDecision > 0 ); + + shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; + pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; + Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); + + for( i = 0; i < length; i++ ) { + /* Perform common calculations used in all states */ + + /* Long-term prediction */ + if( signalType == TYPE_VOICED ) { + /* Unrolled loop */ + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + temp64 = __builtin_mips_mult(pred_lag_ptr[ 0 ], b_Q14_0 ); + temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -1 ], b_Q14_1 ); + temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -2 ], b_Q14_2 ); + temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -3 ], b_Q14_3 ); + temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -4 ], b_Q14_4 ); + temp64 += 32768; + LTP_pred_Q14 = __builtin_mips_extr_w(temp64, 16); + LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */ + pred_lag_ptr++; + } else { + LTP_pred_Q14 = 0; + } + + /* Long-term shaping */ + if( lag > 0 ) { + /* Symmetric, packed FIR coefficients */ + n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); + n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); + n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */ + shp_lag_ptr++; + } else { + n_LTP_Q14 = 0; + } + + for( k = 0; k < nStatesDelayedDecision; k++ ) { + /* Delayed decision state */ + psDD = &psDelDec[ k ]; + + /* Sample state */ + psSS = psSampleState[ k ]; + + /* Generate dither */ + psDD->Seed = silk_RAND( psDD->Seed ); + + /* Pointer used in short term prediction and shaping */ + psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; + /* Short-term prediction */ + silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 ); + temp64 = __builtin_mips_mult(psLPC_Q14[ 0 ], a_Q12_0 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -1 ], a_Q12_1 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -2 ], a_Q12_2 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -3 ], a_Q12_3 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -4 ], a_Q12_4 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -5 ], a_Q12_5 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -6 ], a_Q12_6 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -7 ], a_Q12_7 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -8 ], a_Q12_8 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -9 ], a_Q12_9 ); + if( predictLPCOrder == 16 ) { + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -10 ], a_Q12_10 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -11 ], a_Q12_11 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -12 ], a_Q12_12 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -13 ], a_Q12_13 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -14 ], a_Q12_14 ); + temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -15 ], a_Q12_15 ); + } + temp64 += 32768; + LPC_pred_Q14 = __builtin_mips_extr_w(temp64, 16); + + LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */ + + /* Noise shape feedback */ + silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ + /* Output of lowpass section */ + tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 ); + psDD->sAR2_Q14[ 0 ] = tmp2; + + temp64 = __builtin_mips_mult(tmp2, AR_shp_Q13[ 0 ] ); + + prev = psDD->sAR2_Q14[ 1 ]; + + /* Loop over allpass sections */ + for( j = 2; j < shapingLPCOrder; j += 2 ) { + cur = psDD->sAR2_Q14[ j ]; + next = psDD->sAR2_Q14[ j+1 ]; + /* Output of allpass section */ + tmp2 = silk_SMLAWB( prev, cur - tmp1, warping_Q16 ); + psDD->sAR2_Q14[ j - 1 ] = tmp1; + temp64 = __builtin_mips_madd( temp64, tmp1, AR_shp_Q13[ j - 1 ] ); + temp64 = __builtin_mips_madd( temp64, tmp2, AR_shp_Q13[ j ] ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( cur, next - tmp2, warping_Q16 ); + psDD->sAR2_Q14[ j + 0 ] = tmp2; + prev = next; + } + psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1; + temp64 = __builtin_mips_madd( temp64, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] ); + temp64 += 32768; + n_AR_Q14 = __builtin_mips_extr_w(temp64, 16); + n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 ); /* Q11 -> Q12 */ + n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 ); /* Q12 */ + n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 ); /* Q12 -> Q14 */ + + n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 ); /* Q12 */ + n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 ); /* Q12 */ + n_LF_Q14 = silk_LSHIFT( n_LF_Q14, 2 ); /* Q12 -> Q14 */ + + /* Input minus prediction plus noise feedback */ + /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ + tmp1 = silk_ADD32( n_AR_Q14, n_LF_Q14 ); /* Q14 */ + tmp2 = silk_ADD32( n_LTP_Q14, LPC_pred_Q14 ); /* Q13 */ + tmp1 = silk_SUB32( tmp2, tmp1 ); /* Q13 */ + tmp1 = silk_RSHIFT_ROUND( tmp1, 4 ); /* Q10 */ + + r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */ + + /* Flip sign depending on dither */ + if ( psDD->Seed < 0 ) { + r_Q10 = -r_Q10; + } + r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); + + /* Find two quantization level candidates and measure their rate-distortion */ + q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); + q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); + if( q1_Q0 > 0 ) { + q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); + q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); + q2_Q10 = silk_ADD32( q1_Q10, 1024 ); + rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); + rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); + } else if( q1_Q0 == 0 ) { + q1_Q10 = offset_Q10; + q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); + rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); + rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); + } else if( q1_Q0 == -1 ) { + q2_Q10 = offset_Q10; + q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); + rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); + rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); + } else { /* q1_Q0 < -1 */ + q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); + q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); + q2_Q10 = silk_ADD32( q1_Q10, 1024 ); + rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); + rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 ); + } + rr_Q10 = silk_SUB32( r_Q10, q1_Q10 ); + rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 ); + rr_Q10 = silk_SUB32( r_Q10, q2_Q10 ); + rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 ); + + if( rd1_Q10 < rd2_Q10 ) { + psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); + psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); + psSS[ 0 ].Q_Q10 = q1_Q10; + psSS[ 1 ].Q_Q10 = q2_Q10; + } else { + psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); + psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); + psSS[ 0 ].Q_Q10 = q2_Q10; + psSS[ 1 ].Q_Q10 = q1_Q10; + } + + /* Update states for best quantization */ + + /* Quantized excitation */ + exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 ); + if ( psDD->Seed < 0 ) { + exc_Q14 = -exc_Q14; + } + + /* Add predictions */ + LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); + xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); + + /* Update states */ + sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); + psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); + psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; + psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; + psSS[ 0 ].xq_Q14 = xq_Q14; + + /* Update states for second best quantization */ + + /* Quantized excitation */ + exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 ); + if ( psDD->Seed < 0 ) { + exc_Q14 = -exc_Q14; + } + + + /* Add predictions */ + LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); + xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); + + /* Update states */ + sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); + psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); + psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; + psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; + psSS[ 1 ].xq_Q14 = xq_Q14; + } + + *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; + if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; + last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; + + /* Find winner */ + RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; + Winner_ind = 0; + for( k = 1; k < nStatesDelayedDecision; k++ ) { + if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) { + RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10; + Winner_ind = k; + } + } + + /* Increase RD values of expired states */ + Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ]; + for( k = 0; k < nStatesDelayedDecision; k++ ) { + if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) { + psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 ); + psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 ); + silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 ); + } + } + + /* Find worst in first set and best in second set */ + RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; + RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10; + RDmax_ind = 0; + RDmin_ind = 0; + for( k = 1; k < nStatesDelayedDecision; k++ ) { + /* find worst in first set */ + if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) { + RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10; + RDmax_ind = k; + } + /* find best in second set */ + if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) { + RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10; + RDmin_ind = k; + } + } + + /* Replace a state if best from second set outperforms worst in first set */ + if( RDmin_Q10 < RDmax_Q10 ) { + silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i, + ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) ); + silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) ); + } + + /* Write samples from winner to output and long-term filter states */ + psDD = &psDelDec[ Winner_ind ]; + if( subfr > 0 || i >= decisionDelay ) { + pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); + xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( + silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) ); + NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ]; + sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ]; + } + NSQ->sLTP_shp_buf_idx++; + NSQ->sLTP_buf_idx++; + + /* Update states */ + for( k = 0; k < nStatesDelayedDecision; k++ ) { + psDD = &psDelDec[ k ]; + psSS = &psSampleState[ k ][ 0 ]; + psDD->LF_AR_Q14 = psSS->LF_AR_Q14; + psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; + psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; + psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; + psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 ); + psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14; + psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) ); + psDD->RandState[ *smpl_buf_idx ] = psDD->Seed; + psDD->RD_Q10 = psSS->RD_Q10; + } + delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; + } + /* Update LPC states */ + for( k = 0; k < nStatesDelayedDecision; k++ ) { + psDD = &psDelDec[ k ]; + silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); + } +} + +#endif /* __NSQ_DEL_DEC_MIPSR1_H__ */ diff --git a/external/opus-1.3.1/silk/mips/macros_mipsr1.h b/external/opus-1.3.1/silk/mips/macros_mipsr1.h new file mode 100644 index 00000000..12ed981a --- /dev/null +++ b/external/opus-1.3.1/silk/mips/macros_mipsr1.h @@ -0,0 +1,92 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + + +#ifndef __SILK_MACROS_MIPSR1_H__ +#define __SILK_MACROS_MIPSR1_H__ + +#define mips_clz(x) __builtin_clz(x) + +#undef silk_SMULWB +static inline int silk_SMULWB(int a, int b) +{ + long long ac; + int c; + + ac = __builtin_mips_mult(a, (opus_int32)(opus_int16)b); + c = __builtin_mips_extr_w(ac, 16); + + return c; +} + +#undef silk_SMLAWB +#define silk_SMLAWB(a32, b32, c32) ((a32) + silk_SMULWB(b32, c32)) + +#undef silk_SMULWW +static inline int silk_SMULWW(int a, int b) +{ + long long ac; + int c; + + ac = __builtin_mips_mult(a, b); + c = __builtin_mips_extr_w(ac, 16); + + return c; +} + +#undef silk_SMLAWW +static inline int silk_SMLAWW(int a, int b, int c) +{ + long long ac; + int res; + + ac = __builtin_mips_mult(b, c); + res = __builtin_mips_extr_w(ac, 16); + res += a; + + return res; +} + +#define OVERRIDE_silk_CLZ16 +static inline opus_int32 silk_CLZ16(opus_int16 in16) +{ + int re32; + opus_int32 in32 = (opus_int32 )in16; + re32 = mips_clz(in32); + re32-=16; + return re32; +} + +#define OVERRIDE_silk_CLZ32 +static inline opus_int32 silk_CLZ32(opus_int32 in32) +{ + int re32; + re32 = mips_clz(in32); + return re32; +} + +#endif /* __SILK_MACROS_MIPSR1_H__ */ diff --git a/external/opus-1.3.1/silk/mips/sigproc_fix_mipsr1.h b/external/opus-1.3.1/silk/mips/sigproc_fix_mipsr1.h new file mode 100644 index 00000000..51520c0a --- /dev/null +++ b/external/opus-1.3.1/silk/mips/sigproc_fix_mipsr1.h @@ -0,0 +1,60 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef SILK_SIGPROC_FIX_MIPSR1_H +#define SILK_SIGPROC_FIX_MIPSR1_H + +#undef silk_SAT16 +static inline short int silk_SAT16(int a) +{ + int c; + c = __builtin_mips_shll_s_w(a, 16); + c = c>>16; + + return c; +} + +#undef silk_LSHIFT_SAT32 +static inline int silk_LSHIFT_SAT32(int a, int shift) +{ + int r; + + r = __builtin_mips_shll_s_w(a, shift); + + return r; +} + +#undef silk_RSHIFT_ROUND +static inline int silk_RSHIFT_ROUND(int a, int shift) +{ + int r; + + r = __builtin_mips_shra_r_w(a, shift); + return r; +} + +#endif /* SILK_SIGPROC_FIX_MIPSR1_H */ diff --git a/external/opus-1.0.3/silk/pitch_est_defines.h b/external/opus-1.3.1/silk/pitch_est_defines.h similarity index 99% rename from external/opus-1.0.3/silk/pitch_est_defines.h rename to external/opus-1.3.1/silk/pitch_est_defines.h index 0b6770eb..e1e4b5d7 100644 --- a/external/opus-1.0.3/silk/pitch_est_defines.h +++ b/external/opus-1.3.1/silk/pitch_est_defines.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/pitch_est_tables.c b/external/opus-1.3.1/silk/pitch_est_tables.c similarity index 99% rename from external/opus-1.0.3/silk/pitch_est_tables.c rename to external/opus-1.3.1/silk/pitch_est_tables.c index 7b139ed2..81a8baca 100644 --- a/external/opus-1.0.3/silk/pitch_est_tables.c +++ b/external/opus-1.3.1/silk/pitch_est_tables.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/process_NLSFs.c b/external/opus-1.3.1/silk/process_NLSFs.c similarity index 92% rename from external/opus-1.0.3/silk/process_NLSFs.c rename to external/opus-1.3.1/silk/process_NLSFs.c index 34ce7914..d1308095 100644 --- a/external/opus-1.0.3/silk/process_NLSFs.c +++ b/external/opus-1.3.1/silk/process_NLSFs.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -41,14 +41,14 @@ void silk_process_NLSFs( { opus_int i, doInterpolate; opus_int NLSF_mu_Q20; - opus_int32 i_sqr_Q15; + opus_int16 i_sqr_Q15; opus_int16 pNLSF0_temp_Q15[ MAX_LPC_ORDER ]; opus_int16 pNLSFW_QW[ MAX_LPC_ORDER ]; opus_int16 pNLSFW0_temp_QW[ MAX_LPC_ORDER ]; silk_assert( psEncC->speech_activity_Q8 >= 0 ); silk_assert( psEncC->speech_activity_Q8 <= SILK_FIX_CONST( 1.0, 8 ) ); - silk_assert( psEncC->useInterpolatedNLSFs == 1 || psEncC->indices.NLSFInterpCoef_Q2 == ( 1 << 2 ) ); + celt_assert( psEncC->useInterpolatedNLSFs == 1 || psEncC->indices.NLSFInterpCoef_Q2 == ( 1 << 2 ) ); /***********************/ /* Calculate mu values */ @@ -60,7 +60,7 @@ void silk_process_NLSFs( NLSF_mu_Q20 = silk_ADD_RSHIFT( NLSF_mu_Q20, NLSF_mu_Q20, 1 ); } - silk_assert( NLSF_mu_Q20 > 0 ); + celt_assert( NLSF_mu_Q20 > 0 ); silk_assert( NLSF_mu_Q20 <= SILK_FIX_CONST( 0.005, 20 ) ); /* Calculate NLSF weights */ @@ -79,7 +79,8 @@ void silk_process_NLSFs( /* Update NLSF weights with contribution from first half */ i_sqr_Q15 = silk_LSHIFT( silk_SMULBB( psEncC->indices.NLSFInterpCoef_Q2, psEncC->indices.NLSFInterpCoef_Q2 ), 11 ); for( i = 0; i < psEncC->predictLPCOrder; i++ ) { - pNLSFW_QW[ i ] = silk_SMLAWB( silk_RSHIFT( pNLSFW_QW[ i ], 1 ), (opus_int32)pNLSFW0_temp_QW[ i ], i_sqr_Q15 ); + pNLSFW_QW[ i ] = silk_ADD16( silk_RSHIFT( pNLSFW_QW[ i ], 1 ), silk_RSHIFT( + silk_SMULBB( pNLSFW0_temp_QW[ i ], i_sqr_Q15 ), 16) ); silk_assert( pNLSFW_QW[ i ] >= 1 ); } } @@ -88,7 +89,7 @@ void silk_process_NLSFs( NLSF_mu_Q20, psEncC->NLSF_MSVQ_Survivors, psEncC->indices.signalType ); /* Convert quantized NLSFs back to LPC coefficients */ - silk_NLSF2A( PredCoef_Q12[ 1 ], pNLSF_Q15, psEncC->predictLPCOrder ); + silk_NLSF2A( PredCoef_Q12[ 1 ], pNLSF_Q15, psEncC->predictLPCOrder, psEncC->arch ); if( doInterpolate ) { /* Calculate the interpolated, quantized LSF vector for the first half */ @@ -96,10 +97,11 @@ void silk_process_NLSFs( psEncC->indices.NLSFInterpCoef_Q2, psEncC->predictLPCOrder ); /* Convert back to LPC coefficients */ - silk_NLSF2A( PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEncC->predictLPCOrder ); + silk_NLSF2A( PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEncC->predictLPCOrder, psEncC->arch ); } else { /* Copy LPC coefficients for first half from second half */ + celt_assert( psEncC->predictLPCOrder <= MAX_LPC_ORDER ); silk_memcpy( PredCoef_Q12[ 0 ], PredCoef_Q12[ 1 ], psEncC->predictLPCOrder * sizeof( opus_int16 ) ); } } diff --git a/external/opus-1.3.1/silk/quant_LTP_gains.c b/external/opus-1.3.1/silk/quant_LTP_gains.c new file mode 100644 index 00000000..d6b8eff8 --- /dev/null +++ b/external/opus-1.3.1/silk/quant_LTP_gains.c @@ -0,0 +1,132 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main.h" +#include "tuning_parameters.h" + +void silk_quant_LTP_gains( + opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ + opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ + opus_int8 *periodicity_index, /* O Periodicity Index */ + opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ + opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ + const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ + const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ + const opus_int subfr_len, /* I Number of samples per subframe */ + const opus_int nb_subfr, /* I Number of subframes */ + int arch /* I Run-time architecture */ +) +{ + opus_int j, k, cbk_size; + opus_int8 temp_idx[ MAX_NB_SUBFR ]; + const opus_uint8 *cl_ptr_Q5; + const opus_int8 *cbk_ptr_Q7; + const opus_uint8 *cbk_gain_ptr_Q7; + const opus_int32 *XX_Q17_ptr, *xX_Q17_ptr; + opus_int32 res_nrg_Q15_subfr, res_nrg_Q15, rate_dist_Q7_subfr, rate_dist_Q7, min_rate_dist_Q7; + opus_int32 sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7; + opus_int gain_Q7; + + /***************************************************/ + /* iterate over different codebooks with different */ + /* rates/distortions, and choose best */ + /***************************************************/ + min_rate_dist_Q7 = silk_int32_MAX; + best_sum_log_gain_Q7 = 0; + for( k = 0; k < 3; k++ ) { + /* Safety margin for pitch gain control, to take into account factors + such as state rescaling/rewhitening. */ + opus_int32 gain_safety = SILK_FIX_CONST( 0.4, 7 ); + + cl_ptr_Q5 = silk_LTP_gain_BITS_Q5_ptrs[ k ]; + cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ k ]; + cbk_gain_ptr_Q7 = silk_LTP_vq_gain_ptrs_Q7[ k ]; + cbk_size = silk_LTP_vq_sizes[ k ]; + + /* Set up pointers to first subframe */ + XX_Q17_ptr = XX_Q17; + xX_Q17_ptr = xX_Q17; + + res_nrg_Q15 = 0; + rate_dist_Q7 = 0; + sum_log_gain_tmp_Q7 = *sum_log_gain_Q7; + for( j = 0; j < nb_subfr; j++ ) { + max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0, 7 ) - sum_log_gain_tmp_Q7 ) + + SILK_FIX_CONST( 7, 7 ) ) - gain_safety; + silk_VQ_WMat_EC( + &temp_idx[ j ], /* O index of best codebook vector */ + &res_nrg_Q15_subfr, /* O residual energy */ + &rate_dist_Q7_subfr, /* O best weighted quantization error + mu * rate */ + &gain_Q7, /* O sum of absolute LTP coefficients */ + XX_Q17_ptr, /* I correlation matrix */ + xX_Q17_ptr, /* I correlation vector */ + cbk_ptr_Q7, /* I codebook */ + cbk_gain_ptr_Q7, /* I codebook effective gains */ + cl_ptr_Q5, /* I code length for each codebook vector */ + subfr_len, /* I number of samples per subframe */ + max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + cbk_size, /* I number of vectors in codebook */ + arch /* I Run-time architecture */ + ); + + res_nrg_Q15 = silk_ADD_POS_SAT32( res_nrg_Q15, res_nrg_Q15_subfr ); + rate_dist_Q7 = silk_ADD_POS_SAT32( rate_dist_Q7, rate_dist_Q7_subfr ); + sum_log_gain_tmp_Q7 = silk_max(0, sum_log_gain_tmp_Q7 + + silk_lin2log( gain_safety + gain_Q7 ) - SILK_FIX_CONST( 7, 7 )); + + XX_Q17_ptr += LTP_ORDER * LTP_ORDER; + xX_Q17_ptr += LTP_ORDER; + } + + if( rate_dist_Q7 <= min_rate_dist_Q7 ) { + min_rate_dist_Q7 = rate_dist_Q7; + *periodicity_index = (opus_int8)k; + silk_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( opus_int8 ) ); + best_sum_log_gain_Q7 = sum_log_gain_tmp_Q7; + } + } + + cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ *periodicity_index ]; + for( j = 0; j < nb_subfr; j++ ) { + for( k = 0; k < LTP_ORDER; k++ ) { + B_Q14[ j * LTP_ORDER + k ] = silk_LSHIFT( cbk_ptr_Q7[ cbk_index[ j ] * LTP_ORDER + k ], 7 ); + } + } + + if( nb_subfr == 2 ) { + res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 1 ); + } else { + res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 2 ); + } + + *sum_log_gain_Q7 = best_sum_log_gain_Q7; + *pred_gain_dB_Q7 = (opus_int)silk_SMULBB( -3, silk_lin2log( res_nrg_Q15 ) - ( 15 << 7 ) ); +} diff --git a/external/opus-1.0.3/silk/resampler.c b/external/opus-1.3.1/silk/resampler.c similarity index 97% rename from external/opus-1.0.3/silk/resampler.c rename to external/opus-1.3.1/silk/resampler.c index 7e58332f..1f11e508 100644 --- a/external/opus-1.0.3/silk/resampler.c +++ b/external/opus-1.3.1/silk/resampler.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -91,14 +91,14 @@ opus_int silk_resampler_init( if( forEnc ) { if( ( Fs_Hz_in != 8000 && Fs_Hz_in != 12000 && Fs_Hz_in != 16000 && Fs_Hz_in != 24000 && Fs_Hz_in != 48000 ) || ( Fs_Hz_out != 8000 && Fs_Hz_out != 12000 && Fs_Hz_out != 16000 ) ) { - silk_assert( 0 ); + celt_assert( 0 ); return -1; } S->inputDelay = delay_matrix_enc[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; } else { if( ( Fs_Hz_in != 8000 && Fs_Hz_in != 12000 && Fs_Hz_in != 16000 ) || ( Fs_Hz_out != 8000 && Fs_Hz_out != 12000 && Fs_Hz_out != 16000 && Fs_Hz_out != 24000 && Fs_Hz_out != 48000 ) ) { - silk_assert( 0 ); + celt_assert( 0 ); return -1; } S->inputDelay = delay_matrix_dec[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; @@ -151,7 +151,7 @@ opus_int silk_resampler_init( S->Coefs = silk_Resampler_1_6_COEFS; } else { /* None available */ - silk_assert( 0 ); + celt_assert( 0 ); return -1; } } else { @@ -181,9 +181,9 @@ opus_int silk_resampler( opus_int nSamples; /* Need at least 1 ms of input data */ - silk_assert( inLen >= S->Fs_in_kHz ); + celt_assert( inLen >= S->Fs_in_kHz ); /* Delay can't exceed the 1 ms of buffering */ - silk_assert( S->inputDelay <= S->Fs_in_kHz ); + celt_assert( S->inputDelay <= S->Fs_in_kHz ); nSamples = S->Fs_in_kHz - S->inputDelay; diff --git a/external/opus-1.0.3/silk/resampler_down2.c b/external/opus-1.3.1/silk/resampler_down2.c similarity index 93% rename from external/opus-1.0.3/silk/resampler_down2.c rename to external/opus-1.3.1/silk/resampler_down2.c index 21d11992..971d7bfd 100644 --- a/external/opus-1.0.3/silk/resampler_down2.c +++ b/external/opus-1.3.1/silk/resampler_down2.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -35,16 +35,16 @@ POSSIBILITY OF SUCH DAMAGE. /* Downsample by a factor 2 */ void silk_resampler_down2( opus_int32 *S, /* I/O State vector [ 2 ] */ - opus_int16 *out, /* O Output signal [ len ] */ - const opus_int16 *in, /* I Input signal [ floor(len/2) ] */ + opus_int16 *out, /* O Output signal [ floor(len/2) ] */ + const opus_int16 *in, /* I Input signal [ len ] */ opus_int32 inLen /* I Number of input samples */ ) { opus_int32 k, len2 = silk_RSHIFT32( inLen, 1 ); opus_int32 in32, out32, Y, X; - silk_assert( silk_resampler_down2_0 > 0 ); - silk_assert( silk_resampler_down2_1 < 0 ); + celt_assert( silk_resampler_down2_0 > 0 ); + celt_assert( silk_resampler_down2_1 < 0 ); /* Internal variables and state are in Q10 format */ for( k = 0; k < len2; k++ ) { diff --git a/external/opus-1.0.3/silk/resampler_down2_3.c b/external/opus-1.3.1/silk/resampler_down2_3.c similarity index 96% rename from external/opus-1.0.3/silk/resampler_down2_3.c rename to external/opus-1.3.1/silk/resampler_down2_3.c index fe5b671d..4342614d 100644 --- a/external/opus-1.0.3/silk/resampler_down2_3.c +++ b/external/opus-1.3.1/silk/resampler_down2_3.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -31,6 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "SigProc_FIX.h" #include "resampler_private.h" +#include "stack_alloc.h" #define ORDER_FIR 4 @@ -43,8 +44,11 @@ void silk_resampler_down2_3( ) { opus_int32 nSamplesIn, counter, res_Q6; - opus_int32 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR ]; + VARDECL( opus_int32, buf ); opus_int32 *buf_ptr; + SAVE_STACK; + + ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 ); /* Copy buffered samples to start of buffer */ silk_memcpy( buf, S, ORDER_FIR * sizeof( opus_int32 ) ); @@ -95,4 +99,5 @@ void silk_resampler_down2_3( /* Copy last part of filtered signal to the state for the next call */ silk_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) ); + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/resampler_private.h b/external/opus-1.3.1/silk/resampler_private.h similarity index 99% rename from external/opus-1.0.3/silk/resampler_private.h rename to external/opus-1.3.1/silk/resampler_private.h index 45d342c7..422a7d9d 100644 --- a/external/opus-1.0.3/silk/resampler_private.h +++ b/external/opus-1.3.1/silk/resampler_private.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/resampler_private_AR2.c b/external/opus-1.3.1/silk/resampler_private_AR2.c similarity index 99% rename from external/opus-1.0.3/silk/resampler_private_AR2.c rename to external/opus-1.3.1/silk/resampler_private_AR2.c index d069f2d8..5fff2371 100644 --- a/external/opus-1.0.3/silk/resampler_private_AR2.c +++ b/external/opus-1.3.1/silk/resampler_private_AR2.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/resampler_private_IIR_FIR.c b/external/opus-1.3.1/silk/resampler_private_IIR_FIR.c similarity index 98% rename from external/opus-1.0.3/silk/resampler_private_IIR_FIR.c rename to external/opus-1.3.1/silk/resampler_private_IIR_FIR.c index 2b9602d5..6b2b3a2e 100644 --- a/external/opus-1.0.3/silk/resampler_private_IIR_FIR.c +++ b/external/opus-1.3.1/silk/resampler_private_IIR_FIR.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -33,7 +33,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "resampler_private.h" #include "stack_alloc.h" -static inline opus_int16 *silk_resampler_private_IIR_FIR_INTERPOL( +static OPUS_INLINE opus_int16 *silk_resampler_private_IIR_FIR_INTERPOL( opus_int16 *out, opus_int16 *buf, opus_int32 max_index_Q16, diff --git a/external/opus-1.0.3/silk/resampler_private_down_FIR.c b/external/opus-1.3.1/silk/resampler_private_down_FIR.c similarity index 97% rename from external/opus-1.0.3/silk/resampler_private_down_FIR.c rename to external/opus-1.3.1/silk/resampler_private_down_FIR.c index 8bedb0de..3e8735a3 100644 --- a/external/opus-1.0.3/silk/resampler_private_down_FIR.c +++ b/external/opus-1.3.1/silk/resampler_private_down_FIR.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -31,8 +31,9 @@ POSSIBILITY OF SUCH DAMAGE. #include "SigProc_FIX.h" #include "resampler_private.h" +#include "stack_alloc.h" -static inline opus_int16 *silk_resampler_private_down_FIR_INTERPOL( +static OPUS_INLINE opus_int16 *silk_resampler_private_down_FIR_INTERPOL( opus_int16 *out, opus_int32 *buf, const opus_int16 *FIR_Coefs, @@ -135,7 +136,7 @@ static inline opus_int16 *silk_resampler_private_down_FIR_INTERPOL( } break; default: - silk_assert( 0 ); + celt_assert( 0 ); } return out; } @@ -151,8 +152,11 @@ void silk_resampler_private_down_FIR( silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; opus_int32 nSamplesIn; opus_int32 max_index_Q16, index_increment_Q16; - opus_int32 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + SILK_RESAMPLER_MAX_FIR_ORDER ]; + VARDECL( opus_int32, buf ); const opus_int16 *FIR_Coefs; + SAVE_STACK; + + ALLOC( buf, S->batchSize + S->FIR_Order, opus_int32 ); /* Copy buffered samples to start of buffer */ silk_memcpy( buf, S->sFIR.i32, S->FIR_Order * sizeof( opus_int32 ) ); @@ -186,4 +190,5 @@ void silk_resampler_private_down_FIR( /* Copy last part of filtered signal to the state for the next call */ silk_memcpy( S->sFIR.i32, &buf[ nSamplesIn ], S->FIR_Order * sizeof( opus_int32 ) ); + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/resampler_private_up2_HQ.c b/external/opus-1.3.1/silk/resampler_private_up2_HQ.c similarity index 99% rename from external/opus-1.0.3/silk/resampler_private_up2_HQ.c rename to external/opus-1.3.1/silk/resampler_private_up2_HQ.c index 9e6dfc9e..c7ec8de3 100644 --- a/external/opus-1.0.3/silk/resampler_private_up2_HQ.c +++ b/external/opus-1.3.1/silk/resampler_private_up2_HQ.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/resampler_rom.c b/external/opus-1.3.1/silk/resampler_rom.c similarity index 68% rename from external/opus-1.0.3/silk/resampler_rom.c rename to external/opus-1.3.1/silk/resampler_rom.c index b50af2e2..5e6b0447 100644 --- a/external/opus-1.0.3/silk/resampler_rom.c +++ b/external/opus-1.3.1/silk/resampler_rom.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -41,36 +41,36 @@ POSSIBILITY OF SUCH DAMAGE. /* Tables with IIR and FIR coefficients for fractional downsamplers (123 Words) */ silk_DWORD_ALIGN const opus_int16 silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ] = { - -20694, -13867, - -49, 64, 17, -157, 353, -496, 163, 11047, 22205, - -39, 6, 91, -170, 186, 23, -896, 6336, 19928, - -19, -36, 102, -89, -24, 328, -951, 2568, 15909, + -20694, -13867, + -49, 64, 17, -157, 353, -496, 163, 11047, 22205, + -39, 6, 91, -170, 186, 23, -896, 6336, 19928, + -19, -36, 102, -89, -24, 328, -951, 2568, 15909, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ] = { - -14457, -14019, - 64, 128, -122, 36, 310, -768, 584, 9267, 17733, - 12, 128, 18, -142, 288, -117, -865, 4123, 14459, + -14457, -14019, + 64, 128, -122, 36, 310, -768, 584, 9267, 17733, + 12, 128, 18, -142, 288, -117, -865, 4123, 14459, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR1 / 2 ] = { - 616, -14323, - -10, 39, 58, -46, -84, 120, 184, -315, -541, 1284, 5380, 9024, + 616, -14323, + -10, 39, 58, -46, -84, 120, 184, -315, -541, 1284, 5380, 9024, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { - 16102, -15162, - -13, 0, 20, 26, 5, -31, -43, -4, 65, 90, 7, -157, -248, -44, 593, 1583, 2612, 3271, + 16102, -15162, + -13, 0, 20, 26, 5, -31, -43, -4, 65, 90, 7, -157, -248, -44, 593, 1583, 2612, 3271, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_4_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { - 22500, -15099, - 3, -14, -20, -15, 2, 25, 37, 25, -16, -71, -107, -79, 50, 292, 623, 982, 1288, 1464, + 22500, -15099, + 3, -14, -20, -15, 2, 25, 37, 25, -16, -71, -107, -79, 50, 292, 623, 982, 1288, 1464, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_6_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { - 27540, -15257, - 17, 12, 8, 1, -10, -22, -30, -32, -22, 3, 44, 100, 168, 243, 317, 381, 429, 455, + 27540, -15257, + 17, 12, 8, 1, -10, -22, -30, -32, -22, 3, 44, 100, 168, 243, 317, 381, 429, 455, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ] = { @@ -81,16 +81,16 @@ silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ] = { /* Table with interplation fractions of 1/24, 3/24, 5/24, ... , 23/24 : 23/24 (46 Words) */ silk_DWORD_ALIGN const opus_int16 silk_resampler_frac_FIR_12[ 12 ][ RESAMPLER_ORDER_FIR_12 / 2 ] = { - { 189, -600, 617, 30567 }, - { 117, -159, -1070, 29704 }, - { 52, 221, -2392, 28276 }, - { -4, 529, -3350, 26341 }, - { -48, 758, -3956, 23973 }, - { -80, 905, -4235, 21254 }, - { -99, 972, -4222, 18278 }, - { -107, 967, -3957, 15143 }, - { -103, 896, -3487, 11950 }, - { -91, 773, -2865, 8798 }, - { -71, 611, -2143, 5784 }, - { -46, 425, -1375, 2996 }, + { 189, -600, 617, 30567 }, + { 117, -159, -1070, 29704 }, + { 52, 221, -2392, 28276 }, + { -4, 529, -3350, 26341 }, + { -48, 758, -3956, 23973 }, + { -80, 905, -4235, 21254 }, + { -99, 972, -4222, 18278 }, + { -107, 967, -3957, 15143 }, + { -103, 896, -3487, 11950 }, + { -91, 773, -2865, 8798 }, + { -71, 611, -2143, 5784 }, + { -46, 425, -1375, 2996 }, }; diff --git a/external/opus-1.0.3/silk/resampler_rom.h b/external/opus-1.3.1/silk/resampler_rom.h similarity index 99% rename from external/opus-1.0.3/silk/resampler_rom.h rename to external/opus-1.3.1/silk/resampler_rom.h index 473b24a2..490b3388 100644 --- a/external/opus-1.0.3/silk/resampler_rom.h +++ b/external/opus-1.3.1/silk/resampler_rom.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/resampler_structs.h b/external/opus-1.3.1/silk/resampler_structs.h similarity index 99% rename from external/opus-1.0.3/silk/resampler_structs.h rename to external/opus-1.3.1/silk/resampler_structs.h index d1a0b951..9e9457d1 100644 --- a/external/opus-1.0.3/silk/resampler_structs.h +++ b/external/opus-1.3.1/silk/resampler_structs.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/shell_coder.c b/external/opus-1.3.1/silk/shell_coder.c similarity index 93% rename from external/opus-1.0.3/silk/shell_coder.c rename to external/opus-1.3.1/silk/shell_coder.c index febfe633..4af34147 100644 --- a/external/opus-1.0.3/silk/shell_coder.c +++ b/external/opus-1.3.1/silk/shell_coder.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -33,7 +33,7 @@ POSSIBILITY OF SUCH DAMAGE. /* shell coder; pulse-subframe length is hardcoded */ -static inline void combine_pulses( +static OPUS_INLINE void combine_pulses( opus_int *out, /* O combined pulses vector [len] */ const opus_int *in, /* I input vector [2 * len] */ const opus_int len /* I number of OUTPUT samples */ @@ -45,8 +45,7 @@ static inline void combine_pulses( } } -#ifdef OPUS_ENABLE_ENCODER -static inline void encode_split( +static OPUS_INLINE void encode_split( ec_enc *psRangeEnc, /* I/O compressor data structure */ const opus_int p_child1, /* I pulse amplitude of first child subframe */ const opus_int p, /* I pulse amplitude of current subframe */ @@ -57,11 +56,10 @@ static inline void encode_split( ec_enc_icdf( psRangeEnc, p_child1, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 ); } } -#endif /* OPUS_ENABLE_ENCODER */ -static inline void decode_split( - opus_int *p_child1, /* O pulse amplitude of first child subframe */ - opus_int *p_child2, /* O pulse amplitude of second child subframe */ +static OPUS_INLINE void decode_split( + opus_int16 *p_child1, /* O pulse amplitude of first child subframe */ + opus_int16 *p_child2, /* O pulse amplitude of second child subframe */ ec_dec *psRangeDec, /* I/O Compressor data structure */ const opus_int p, /* I pulse amplitude of current subframe */ const opus_uint8 *shell_table /* I table of shell cdfs */ @@ -76,7 +74,6 @@ static inline void decode_split( } } -#ifdef OPUS_ENABLE_ENCODER /* Shell encoder, operates on one shell code frame of 16 pulses */ void silk_shell_encoder( ec_enc *psRangeEnc, /* I/O compressor data structure */ @@ -116,16 +113,16 @@ void silk_shell_encoder( encode_split( psRangeEnc, pulses0[ 12 ], pulses1[ 6 ], silk_shell_code_table0 ); encode_split( psRangeEnc, pulses0[ 14 ], pulses1[ 7 ], silk_shell_code_table0 ); } -#endif /* OPUS_ENABLE_ENCODER */ + /* Shell decoder, operates on one shell code frame of 16 pulses */ void silk_shell_decoder( - opus_int *pulses0, /* O data: nonnegative pulse amplitudes */ + opus_int16 *pulses0, /* O data: nonnegative pulse amplitudes */ ec_dec *psRangeDec, /* I/O Compressor data structure */ const opus_int pulses4 /* I number of pulses per pulse-subframe */ ) { - opus_int pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ]; + opus_int16 pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ]; /* this function operates on one shell code frame of 16 pulses */ silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); diff --git a/external/opus-1.0.3/silk/sigm_Q15.c b/external/opus-1.3.1/silk/sigm_Q15.c similarity index 99% rename from external/opus-1.0.3/silk/sigm_Q15.c rename to external/opus-1.3.1/silk/sigm_Q15.c index cf5af6bc..3c507d25 100644 --- a/external/opus-1.0.3/silk/sigm_Q15.c +++ b/external/opus-1.3.1/silk/sigm_Q15.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/sort.c b/external/opus-1.3.1/silk/sort.c similarity index 95% rename from external/opus-1.0.3/silk/sort.c rename to external/opus-1.3.1/silk/sort.c index a4072ec4..4fba16f8 100644 --- a/external/opus-1.0.3/silk/sort.c +++ b/external/opus-1.3.1/silk/sort.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -33,7 +33,7 @@ POSSIBILITY OF SUCH DAMAGE. /* Best case: O(n) for an already sorted array */ /* Worst case: O(n^2) for an inversely sorted array */ /* */ -/* Shell short: http://en.wikipedia.org/wiki/Shell_sort */ +/* Shell short: https://en.wikipedia.org/wiki/Shell_sort */ #include "SigProc_FIX.h" @@ -48,9 +48,9 @@ void silk_insertion_sort_increasing( opus_int i, j; /* Safety checks */ - silk_assert( K > 0 ); - silk_assert( L > 0 ); - silk_assert( L >= K ); + celt_assert( K > 0 ); + celt_assert( L > 0 ); + celt_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { @@ -96,9 +96,9 @@ void silk_insertion_sort_decreasing_int16( opus_int value; /* Safety checks */ - silk_assert( K > 0 ); - silk_assert( L > 0 ); - silk_assert( L >= K ); + celt_assert( K > 0 ); + celt_assert( L > 0 ); + celt_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { @@ -141,7 +141,7 @@ void silk_insertion_sort_increasing_all_values_int16( opus_int i, j; /* Safety checks */ - silk_assert( L > 0 ); + celt_assert( L > 0 ); /* Sort vector elements by value, increasing order */ for( i = 1; i < L; i++ ) { diff --git a/external/opus-1.0.3/silk/stereo_LR_to_MS.c b/external/opus-1.3.1/silk/stereo_LR_to_MS.c similarity index 91% rename from external/opus-1.0.3/silk/stereo_LR_to_MS.c rename to external/opus-1.3.1/silk/stereo_LR_to_MS.c index 6a680e09..c8226663 100644 --- a/external/opus-1.0.3/silk/stereo_LR_to_MS.c +++ b/external/opus-1.3.1/silk/stereo_LR_to_MS.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "main.h" +#include "stack_alloc.h" /* Convert Left/Right stereo signal to adaptive Mid/Side representation */ void silk_stereo_LR_to_MS( @@ -49,11 +50,15 @@ void silk_stereo_LR_to_MS( opus_int n, is10msFrame, denom_Q16, delta0_Q13, delta1_Q13; opus_int32 sum, diff, smooth_coef_Q16, pred_Q13[ 2 ], pred0_Q13, pred1_Q13; opus_int32 LP_ratio_Q14, HP_ratio_Q14, frac_Q16, frac_3_Q16, min_mid_rate_bps, width_Q14, w_Q24, deltaw_Q24; - opus_int16 side[ MAX_FRAME_LENGTH + 2 ]; - opus_int16 LP_mid[ MAX_FRAME_LENGTH ], HP_mid[ MAX_FRAME_LENGTH ]; - opus_int16 LP_side[ MAX_FRAME_LENGTH ], HP_side[ MAX_FRAME_LENGTH ]; + VARDECL( opus_int16, side ); + VARDECL( opus_int16, LP_mid ); + VARDECL( opus_int16, HP_mid ); + VARDECL( opus_int16, LP_side ); + VARDECL( opus_int16, HP_side ); opus_int16 *mid = &x1[ -2 ]; + SAVE_STACK; + ALLOC( side, frame_length + 2, opus_int16 ); /* Convert to basic mid/side signals */ for( n = 0; n < frame_length + 2; n++ ) { sum = x1[ n - 2 ] + (opus_int32)x2[ n - 2 ]; @@ -69,15 +74,19 @@ void silk_stereo_LR_to_MS( silk_memcpy( state->sSide, &side[ frame_length ], 2 * sizeof( opus_int16 ) ); /* LP and HP filter mid signal */ + ALLOC( LP_mid, frame_length, opus_int16 ); + ALLOC( HP_mid, frame_length, opus_int16 ); for( n = 0; n < frame_length; n++ ) { - sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT( mid[ n ] + mid[ n + 2 ], mid[ n + 1 ], 1 ), 2 ); + sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 2 ); LP_mid[ n ] = sum; HP_mid[ n ] = mid[ n + 1 ] - sum; } /* LP and HP filter side signal */ + ALLOC( LP_side, frame_length, opus_int16 ); + ALLOC( HP_side, frame_length, opus_int16 ); for( n = 0; n < frame_length; n++ ) { - sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT( side[ n ] + side[ n + 2 ], side[ n + 1 ], 1 ), 2 ); + sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT( side[ n ] + (opus_int32)side[ n + 2 ], side[ n + 1 ], 1 ), 2 ); LP_side[ n ] = sum; HP_side[ n ] = side[ n + 1 ] - sum; } @@ -100,7 +109,7 @@ void silk_stereo_LR_to_MS( if( total_rate_bps < 1 ) { total_rate_bps = 1; } - min_mid_rate_bps = silk_SMLABB( 2000, fs_kHz, 900 ); + min_mid_rate_bps = silk_SMLABB( 2000, fs_kHz, 600 ); silk_assert( min_mid_rate_bps < 32767 ); /* Default bitrate distribution: 8 parts for Mid and (5+3*frac) parts for Side. so: mid_rate = ( 8 / ( 13 + 3 * frac ) ) * total_ rate */ frac_3_Q16 = silk_MUL( 3, frac_Q16 ); @@ -198,7 +207,7 @@ void silk_stereo_LR_to_MS( pred0_Q13 += delta0_Q13; pred1_Q13 += delta1_Q13; w_Q24 += deltaw_Q24; - sum = silk_LSHIFT( silk_ADD_LSHIFT( mid[ n ] + mid[ n + 2 ], mid[ n + 1 ], 1 ), 9 ); /* Q11 */ + sum = silk_LSHIFT( silk_ADD_LSHIFT( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 9 ); /* Q11 */ sum = silk_SMLAWB( silk_SMULWB( w_Q24, side[ n + 1 ] ), sum, pred0_Q13 ); /* Q8 */ sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)mid[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ x2[ n - 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); @@ -208,7 +217,7 @@ void silk_stereo_LR_to_MS( pred1_Q13 = -pred_Q13[ 1 ]; w_Q24 = silk_LSHIFT( width_Q14, 10 ); for( n = STEREO_INTERP_LEN_MS * fs_kHz; n < frame_length; n++ ) { - sum = silk_LSHIFT( silk_ADD_LSHIFT( mid[ n ] + mid[ n + 2 ], mid[ n + 1 ], 1 ), 9 ); /* Q11 */ + sum = silk_LSHIFT( silk_ADD_LSHIFT( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 9 ); /* Q11 */ sum = silk_SMLAWB( silk_SMULWB( w_Q24, side[ n + 1 ] ), sum, pred0_Q13 ); /* Q8 */ sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)mid[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ x2[ n - 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); @@ -216,4 +225,5 @@ void silk_stereo_LR_to_MS( state->pred_prev_Q13[ 0 ] = (opus_int16)pred_Q13[ 0 ]; state->pred_prev_Q13[ 1 ] = (opus_int16)pred_Q13[ 1 ]; state->width_prev_Q14 = (opus_int16)width_Q14; + RESTORE_STACK; } diff --git a/external/opus-1.0.3/silk/stereo_MS_to_LR.c b/external/opus-1.3.1/silk/stereo_MS_to_LR.c similarity index 99% rename from external/opus-1.0.3/silk/stereo_MS_to_LR.c rename to external/opus-1.3.1/silk/stereo_MS_to_LR.c index 23515870..62521a4f 100644 --- a/external/opus-1.0.3/silk/stereo_MS_to_LR.c +++ b/external/opus-1.3.1/silk/stereo_MS_to_LR.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/stereo_decode_pred.c b/external/opus-1.3.1/silk/stereo_decode_pred.c similarity index 99% rename from external/opus-1.0.3/silk/stereo_decode_pred.c rename to external/opus-1.3.1/silk/stereo_decode_pred.c index 026aa7a0..56ba3925 100644 --- a/external/opus-1.0.3/silk/stereo_decode_pred.c +++ b/external/opus-1.3.1/silk/stereo_decode_pred.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/stereo_encode_pred.c b/external/opus-1.3.1/silk/stereo_encode_pred.c similarity index 94% rename from external/opus-1.0.3/silk/stereo_encode_pred.c rename to external/opus-1.3.1/silk/stereo_encode_pred.c index 3cffd367..03becb67 100644 --- a/external/opus-1.0.3/silk/stereo_encode_pred.c +++ b/external/opus-1.3.1/silk/stereo_encode_pred.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -41,11 +41,11 @@ void silk_stereo_encode_pred( /* Entropy coding */ n = 5 * ix[ 0 ][ 2 ] + ix[ 1 ][ 2 ]; - silk_assert( n < 25 ); + celt_assert( n < 25 ); ec_enc_icdf( psRangeEnc, n, silk_stereo_pred_joint_iCDF, 8 ); for( n = 0; n < 2; n++ ) { - silk_assert( ix[ n ][ 0 ] < 3 ); - silk_assert( ix[ n ][ 1 ] < STEREO_QUANT_SUB_STEPS ); + celt_assert( ix[ n ][ 0 ] < 3 ); + celt_assert( ix[ n ][ 1 ] < STEREO_QUANT_SUB_STEPS ); ec_enc_icdf( psRangeEnc, ix[ n ][ 0 ], silk_uniform3_iCDF, 8 ); ec_enc_icdf( psRangeEnc, ix[ n ][ 1 ], silk_uniform5_iCDF, 8 ); } diff --git a/external/opus-1.0.3/silk/stereo_find_predictor.c b/external/opus-1.3.1/silk/stereo_find_predictor.c similarity index 99% rename from external/opus-1.0.3/silk/stereo_find_predictor.c rename to external/opus-1.3.1/silk/stereo_find_predictor.c index aec58dab..e30e90bd 100644 --- a/external/opus-1.0.3/silk/stereo_find_predictor.c +++ b/external/opus-1.3.1/silk/stereo_find_predictor.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/stereo_quant_pred.c b/external/opus-1.3.1/silk/stereo_quant_pred.c similarity index 99% rename from external/opus-1.0.3/silk/stereo_quant_pred.c rename to external/opus-1.3.1/silk/stereo_quant_pred.c index df97c9f6..d4ced6c3 100644 --- a/external/opus-1.0.3/silk/stereo_quant_pred.c +++ b/external/opus-1.3.1/silk/stereo_quant_pred.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/structs.h b/external/opus-1.3.1/silk/structs.h similarity index 97% rename from external/opus-1.0.3/silk/structs.h rename to external/opus-1.3.1/silk/structs.h index 5d37f660..3380c757 100644 --- a/external/opus-1.0.3/silk/structs.h +++ b/external/opus-1.3.1/silk/structs.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -48,6 +48,7 @@ typedef struct { opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; opus_int32 sLF_AR_shp_Q14; + opus_int32 sDiff_shp_Q14; opus_int lagPrev; opus_int sLTP_buf_idx; opus_int sLTP_shp_buf_idx; @@ -77,6 +78,7 @@ typedef struct { opus_int32 In_LP_State[ 2 ]; /* Low pass filter state */ opus_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */ opus_int mode; /* Operating mode, <0: switch down, >0: switch up; 0: do nothing */ + opus_int32 saved_fs_kHz; /* If non-zero, holds the last sampling rate before a bandwidth switching reset. */ } silk_LP_state; /* Structure containing NLSF codebook */ @@ -86,6 +88,7 @@ typedef struct { const opus_int16 quantStepSize_Q16; const opus_int16 invQuantStepSize_Q6; const opus_uint8 *CB1_NLSF_Q8; + const opus_int16 *CB1_Wght_Q9; const opus_uint8 *CB1_iCDF; const opus_uint8 *pred_Q8; const opus_uint8 *ec_sel; @@ -169,8 +172,7 @@ typedef struct { opus_int pitchEstimationComplexity; /* Complexity level for pitch estimator */ opus_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */ opus_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */ - opus_int LTPQuantLowComplexity; /* Flag for low complexity LTP quantization */ - opus_int mu_LTP_Q9; /* Rate-distortion tradeoff in LTP quantization */ + opus_int32 sum_log_gain_Q7; /* Cumulative max prediction gain */ opus_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */ opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation, pitch prediction */ opus_int controlled_since_last_payload; /* Flag for ensuring codec_control only runs once per packet */ @@ -191,6 +193,8 @@ typedef struct { SideInfoIndices indices; opus_int8 pulses[ MAX_FRAME_LENGTH ]; + int arch; + /* Input/output buffering */ opus_int16 inputBuf[ MAX_FRAME_LENGTH + 2 ]; /* Buffer containing input signal */ opus_int inputBufIx; @@ -298,6 +302,7 @@ typedef struct { /* Stuff used for PLC */ opus_int lossCnt; opus_int prevSignalType; + int arch; silk_PLC_struct sPLC; diff --git a/external/opus-1.0.3/silk/sum_sqr_shift.c b/external/opus-1.3.1/silk/sum_sqr_shift.c similarity index 73% rename from external/opus-1.0.3/silk/sum_sqr_shift.c rename to external/opus-1.3.1/silk/sum_sqr_shift.c index f98a1088..4fd0c3d7 100644 --- a/external/opus-1.0.3/silk/sum_sqr_shift.c +++ b/external/opus-1.3.1/silk/sum_sqr_shift.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -41,43 +41,40 @@ void silk_sum_sqr_shift( ) { opus_int i, shft; - opus_int32 nrg_tmp, nrg; + opus_uint32 nrg_tmp; + opus_int32 nrg; - nrg = 0; - shft = 0; - len--; - for( i = 0; i < len; i += 2 ) { - nrg = silk_SMLABB_ovflw( nrg, x[ i ], x[ i ] ); - nrg = silk_SMLABB_ovflw( nrg, x[ i + 1 ], x[ i + 1 ] ); - if( nrg < 0 ) { - /* Scale down */ - nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); - shft = 2; - i+=2; - break; - } + /* Do a first run with the maximum shift we could have. */ + shft = 31-silk_CLZ32(len); + /* Let's be conservative with rounding and start with nrg=len. */ + nrg = len; + for( i = 0; i < len - 1; i += 2 ) { + nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); + nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); + nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } - for( ; i < len; i += 2 ) { + if( i < len ) { + /* One sample left to process */ + nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); + nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); + } + silk_assert( nrg >= 0 ); + /* Make sure the result will fit in a 32-bit signed integer with two bits + of headroom. */ + shft = silk_max_32(0, shft+3 - silk_CLZ32(nrg)); + nrg = 0; + for( i = 0 ; i < len - 1; i += 2 ) { nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); - nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, (opus_uint32)nrg_tmp, shft ); - if( nrg < 0 ) { - /* Scale down */ - nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); - shft += 2; - } + nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } - if( i == len ) { + if( i < len ) { /* One sample left to process */ nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } - /* Make sure to have at least one extra leading zero (two leading zeros in total) */ - if( nrg & 0xC0000000 ) { - nrg = silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); - shft += 2; - } + silk_assert( nrg >= 0 ); /* Output arguments */ *shift = shft; diff --git a/external/opus-1.0.3/silk/table_LSF_cos.c b/external/opus-1.3.1/silk/table_LSF_cos.c similarity index 99% rename from external/opus-1.0.3/silk/table_LSF_cos.c rename to external/opus-1.3.1/silk/table_LSF_cos.c index 710537fb..ec9dc639 100644 --- a/external/opus-1.0.3/silk/table_LSF_cos.c +++ b/external/opus-1.3.1/silk/table_LSF_cos.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/tables.h b/external/opus-1.3.1/silk/tables.h similarity index 89% rename from external/opus-1.0.3/silk/tables.h rename to external/opus-1.3.1/silk/tables.h index 072b7929..95230c45 100644 --- a/external/opus-1.0.3/silk/tables.h +++ b/external/opus-1.3.1/silk/tables.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -47,8 +47,8 @@ extern const opus_uint8 silk_pitch_contour_NB_iCDF[ 11 ]; extern const opus_uint8 silk_pitch_contour_10_ms_iCDF[ 12 ]; /* 12 */ extern const opus_uint8 silk_pitch_contour_10_ms_NB_iCDF[ 3 ]; /* 3 */ -extern const opus_uint8 silk_pulses_per_block_iCDF[ N_RATE_LEVELS ][ MAX_PULSES + 2 ]; /* 180 */ -extern const opus_uint8 silk_pulses_per_block_BITS_Q5[ N_RATE_LEVELS - 1 ][ MAX_PULSES + 2 ]; /* 162 */ +extern const opus_uint8 silk_pulses_per_block_iCDF[ N_RATE_LEVELS ][ SILK_MAX_PULSES + 2 ]; /* 180 */ +extern const opus_uint8 silk_pulses_per_block_BITS_Q5[ N_RATE_LEVELS - 1 ][ SILK_MAX_PULSES + 2 ]; /* 162 */ extern const opus_uint8 silk_rate_levels_iCDF[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ extern const opus_uint8 silk_rate_levels_BITS_Q5[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ @@ -59,7 +59,7 @@ extern const opus_uint8 silk_shell_code_table0[ 152 ]; extern const opus_uint8 silk_shell_code_table1[ 152 ]; /* 152 */ extern const opus_uint8 silk_shell_code_table2[ 152 ]; /* 152 */ extern const opus_uint8 silk_shell_code_table3[ 152 ]; /* 152 */ -extern const opus_uint8 silk_shell_code_table_offsets[ MAX_PULSES + 1 ]; /* 17 */ +extern const opus_uint8 silk_shell_code_table_offsets[ SILK_MAX_PULSES + 1 ]; /* 17 */ extern const opus_uint8 silk_lsb_iCDF[ 2 ]; /* 2 */ @@ -76,8 +76,8 @@ extern const opus_uint8 silk_NLSF_EXT_iCDF[ 7 ]; extern const opus_uint8 silk_LTP_per_index_iCDF[ 3 ]; /* 3 */ extern const opus_uint8 * const silk_LTP_gain_iCDF_ptrs[ NB_LTP_CBKS ]; /* 3 */ extern const opus_uint8 * const silk_LTP_gain_BITS_Q5_ptrs[ NB_LTP_CBKS ]; /* 3 */ -extern const opus_int16 silk_LTP_gain_middle_avg_RD_Q14; extern const opus_int8 * const silk_LTP_vq_ptrs_Q7[ NB_LTP_CBKS ]; /* 168 */ +extern const opus_uint8 * const silk_LTP_vq_gain_ptrs_Q7[NB_LTP_CBKS]; extern const opus_int8 silk_LTP_vq_sizes[ NB_LTP_CBKS ]; /* 3 */ extern const opus_uint8 silk_LTPscale_iCDF[ 3 ]; /* 4 */ @@ -97,12 +97,6 @@ extern const opus_uint8 silk_NLSF_interpolation_factor_iCDF[ 5 ]; extern const silk_NLSF_CB_struct silk_NLSF_CB_WB; /* 1040 */ extern const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB; /* 728 */ -/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */ -extern const opus_int32 silk_TargetRate_table_NB[ TARGET_RATE_TAB_SZ ]; /* 32 */ -extern const opus_int32 silk_TargetRate_table_MB[ TARGET_RATE_TAB_SZ ]; /* 32 */ -extern const opus_int32 silk_TargetRate_table_WB[ TARGET_RATE_TAB_SZ ]; /* 32 */ -extern const opus_int16 silk_SNR_table_Q1[ TARGET_RATE_TAB_SZ ]; /* 32 */ - /* Quantization offsets */ extern const opus_int16 silk_Quantization_Offsets_Q10[ 2 ][ 2 ]; /* 8 */ diff --git a/external/opus-1.0.3/silk/tables_LTP.c b/external/opus-1.3.1/silk/tables_LTP.c similarity index 87% rename from external/opus-1.0.3/silk/tables_LTP.c rename to external/opus-1.3.1/silk/tables_LTP.c index dd1fb556..5e12c864 100644 --- a/external/opus-1.0.3/silk/tables_LTP.c +++ b/external/opus-1.3.1/silk/tables_LTP.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -51,8 +51,6 @@ static const opus_uint8 silk_LTP_gain_iCDF_2[32] = { 24, 20, 16, 12, 9, 5, 2, 0 }; -const opus_int16 silk_LTP_gain_middle_avg_RD_Q14 = 12304; - static const opus_uint8 silk_LTP_gain_BITS_Q5_0[8] = { 15, 131, 138, 138, 155, 155, 173, 173 }; @@ -267,6 +265,30 @@ const opus_int8 * const silk_LTP_vq_ptrs_Q7[NB_LTP_CBKS] = { (opus_int8 *)&silk_LTP_gain_vq_2[0][0] }; +/* Maximum frequency-dependent response of the pitch taps above, + computed as max(abs(freqz(taps))) */ +static const opus_uint8 silk_LTP_gain_vq_0_gain[8] = { + 46, 2, 90, 87, 93, 91, 82, 98 +}; + +static const opus_uint8 silk_LTP_gain_vq_1_gain[16] = { + 109, 120, 118, 12, 113, 115, 117, 119, + 99, 59, 87, 111, 63, 111, 112, 80 +}; + +static const opus_uint8 silk_LTP_gain_vq_2_gain[32] = { + 126, 124, 125, 124, 129, 121, 126, 23, + 132, 127, 127, 127, 126, 127, 122, 133, + 130, 134, 101, 118, 119, 145, 126, 86, + 124, 120, 123, 119, 170, 173, 107, 109 +}; + +const opus_uint8 * const silk_LTP_vq_gain_ptrs_Q7[NB_LTP_CBKS] = { + &silk_LTP_gain_vq_0_gain[0], + &silk_LTP_gain_vq_1_gain[0], + &silk_LTP_gain_vq_2_gain[0] +}; + const opus_int8 silk_LTP_vq_sizes[NB_LTP_CBKS] = { 8, 16, 32 }; diff --git a/external/opus-1.0.3/silk/tables_NLSF_CB_NB_MB.c b/external/opus-1.3.1/silk/tables_NLSF_CB_NB_MB.c similarity index 79% rename from external/opus-1.0.3/silk/tables_NLSF_CB_NB_MB.c rename to external/opus-1.3.1/silk/tables_NLSF_CB_NB_MB.c index 75480526..195d5b95 100644 --- a/external/opus-1.0.3/silk/tables_NLSF_CB_NB_MB.c +++ b/external/opus-1.3.1/silk/tables_NLSF_CB_NB_MB.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -74,6 +74,41 @@ static const opus_uint8 silk_NLSF_CB1_NB_MB_Q8[ 320 ] = { 64, 84, 104, 118, 156, 177, 201, 230 }; +static const opus_int16 silk_NLSF_CB1_Wght_Q9[ 320 ] = { + 2897, 2314, 2314, 2314, 2287, 2287, 2314, 2300, 2327, 2287, + 2888, 2580, 2394, 2367, 2314, 2274, 2274, 2274, 2274, 2194, + 2487, 2340, 2340, 2314, 2314, 2314, 2340, 2340, 2367, 2354, + 3216, 2766, 2340, 2340, 2314, 2274, 2221, 2207, 2261, 2194, + 2460, 2474, 2367, 2394, 2394, 2394, 2394, 2367, 2407, 2314, + 3479, 3056, 2127, 2207, 2274, 2274, 2274, 2287, 2314, 2261, + 3282, 3141, 2580, 2394, 2247, 2221, 2207, 2194, 2194, 2114, + 4096, 3845, 2221, 2620, 2620, 2407, 2314, 2394, 2367, 2074, + 3178, 3244, 2367, 2221, 2553, 2434, 2340, 2314, 2167, 2221, + 3338, 3488, 2726, 2194, 2261, 2460, 2354, 2367, 2207, 2101, + 2354, 2420, 2327, 2367, 2394, 2420, 2420, 2420, 2460, 2367, + 3779, 3629, 2434, 2527, 2367, 2274, 2274, 2300, 2207, 2048, + 3254, 3225, 2713, 2846, 2447, 2327, 2300, 2300, 2274, 2127, + 3263, 3300, 2753, 2806, 2447, 2261, 2261, 2247, 2127, 2101, + 2873, 2981, 2633, 2367, 2407, 2354, 2194, 2247, 2247, 2114, + 3225, 3197, 2633, 2580, 2274, 2181, 2247, 2221, 2221, 2141, + 3178, 3310, 2740, 2407, 2274, 2274, 2274, 2287, 2194, 2114, + 3141, 3272, 2460, 2061, 2287, 2500, 2367, 2487, 2434, 2181, + 3507, 3282, 2314, 2700, 2647, 2474, 2367, 2394, 2340, 2127, + 3423, 3535, 3038, 3056, 2300, 1950, 2221, 2274, 2274, 2274, + 3404, 3366, 2087, 2687, 2873, 2354, 2420, 2274, 2474, 2540, + 3760, 3488, 1950, 2660, 2897, 2527, 2394, 2367, 2460, 2261, + 3028, 3272, 2740, 2888, 2740, 2154, 2127, 2287, 2234, 2247, + 3695, 3657, 2025, 1969, 2660, 2700, 2580, 2500, 2327, 2367, + 3207, 3413, 2354, 2074, 2888, 2888, 2340, 2487, 2247, 2167, + 3338, 3366, 2846, 2780, 2327, 2154, 2274, 2287, 2114, 2061, + 2327, 2300, 2181, 2167, 2181, 2367, 2633, 2700, 2700, 2553, + 2407, 2434, 2221, 2261, 2221, 2221, 2340, 2420, 2607, 2700, + 3038, 3244, 2806, 2888, 2474, 2074, 2300, 2314, 2354, 2380, + 2221, 2154, 2127, 2287, 2500, 2793, 2793, 2620, 2580, 2367, + 3676, 3713, 2234, 1838, 2181, 2753, 2726, 2673, 2513, 2207, + 2793, 3160, 2726, 2553, 2846, 2513, 2181, 2394, 2221, 2181 +}; + static const opus_uint8 silk_NLSF_CB1_iCDF_NB_MB[ 64 ] = { 212, 178, 148, 129, 108, 96, 85, 82, 79, 77, 61, 59, 57, 56, 51, 49, @@ -150,6 +185,7 @@ const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB = SILK_FIX_CONST( 0.18, 16 ), SILK_FIX_CONST( 1.0 / 0.18, 6 ), silk_NLSF_CB1_NB_MB_Q8, + silk_NLSF_CB1_Wght_Q9, silk_NLSF_CB1_iCDF_NB_MB, silk_NLSF_PRED_NB_MB_Q8, silk_NLSF_CB2_SELECT_NB_MB, diff --git a/external/opus-1.0.3/silk/tables_NLSF_CB_WB.c b/external/opus-1.3.1/silk/tables_NLSF_CB_WB.c similarity index 76% rename from external/opus-1.0.3/silk/tables_NLSF_CB_WB.c rename to external/opus-1.3.1/silk/tables_NLSF_CB_WB.c index 3d6052e4..5cc9f57b 100644 --- a/external/opus-1.0.3/silk/tables_NLSF_CB_WB.c +++ b/external/opus-1.3.1/silk/tables_NLSF_CB_WB.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -98,6 +98,41 @@ static const opus_uint8 silk_NLSF_CB1_WB_Q8[ 512 ] = { 110, 119, 129, 141, 175, 198, 218, 237 }; +static const opus_int16 silk_NLSF_CB1_WB_Wght_Q9[ 512 ] = { + 3657, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2963, 2963, 2925, 2846, + 3216, 3085, 2972, 3056, 3056, 3010, 3010, 3010, 2963, 2963, 3010, 2972, 2888, 2846, 2846, 2726, + 3920, 4014, 2981, 3207, 3207, 2934, 3056, 2846, 3122, 3244, 2925, 2846, 2620, 2553, 2780, 2925, + 3516, 3197, 3010, 3103, 3019, 2888, 2925, 2925, 2925, 2925, 2888, 2888, 2888, 2888, 2888, 2753, + 5054, 5054, 2934, 3573, 3385, 3056, 3085, 2793, 3160, 3160, 2972, 2846, 2513, 2540, 2753, 2888, + 4428, 4149, 2700, 2753, 2972, 3010, 2925, 2846, 2981, 3019, 2925, 2925, 2925, 2925, 2888, 2726, + 3620, 3019, 2972, 3056, 3056, 2873, 2806, 3056, 3216, 3047, 2981, 3291, 3291, 2981, 3310, 2991, + 5227, 5014, 2540, 3338, 3526, 3385, 3197, 3094, 3376, 2981, 2700, 2647, 2687, 2793, 2846, 2673, + 5081, 5174, 4615, 4428, 2460, 2897, 3047, 3207, 3169, 2687, 2740, 2888, 2846, 2793, 2846, 2700, + 3122, 2888, 2963, 2925, 2925, 2925, 2925, 2963, 2963, 2963, 2963, 2925, 2925, 2963, 2963, 2963, + 4202, 3207, 2981, 3103, 3010, 2888, 2888, 2925, 2972, 2873, 2916, 3019, 2972, 3010, 3197, 2873, + 3760, 3760, 3244, 3103, 2981, 2888, 2925, 2888, 2972, 2934, 2793, 2793, 2846, 2888, 2888, 2660, + 3854, 4014, 3207, 3122, 3244, 2934, 3047, 2963, 2963, 3085, 2846, 2793, 2793, 2793, 2793, 2580, + 3845, 4080, 3357, 3516, 3094, 2740, 3010, 2934, 3122, 3085, 2846, 2846, 2647, 2647, 2846, 2806, + 5147, 4894, 3225, 3845, 3441, 3169, 2897, 3413, 3451, 2700, 2580, 2673, 2740, 2846, 2806, 2753, + 4109, 3789, 3291, 3160, 2925, 2888, 2888, 2925, 2793, 2740, 2793, 2740, 2793, 2846, 2888, 2806, + 5081, 5054, 3047, 3545, 3244, 3056, 3085, 2944, 3103, 2897, 2740, 2740, 2740, 2846, 2793, 2620, + 4309, 4309, 2860, 2527, 3207, 3376, 3376, 3075, 3075, 3376, 3056, 2846, 2647, 2580, 2726, 2753, + 3056, 2916, 2806, 2888, 2740, 2687, 2897, 3103, 3150, 3150, 3216, 3169, 3056, 3010, 2963, 2846, + 4375, 3882, 2925, 2888, 2846, 2888, 2846, 2846, 2888, 2888, 2888, 2846, 2888, 2925, 2888, 2846, + 2981, 2916, 2916, 2981, 2981, 3056, 3122, 3216, 3150, 3056, 3010, 2972, 2972, 2972, 2925, 2740, + 4229, 4149, 3310, 3347, 2925, 2963, 2888, 2981, 2981, 2846, 2793, 2740, 2846, 2846, 2846, 2793, + 4080, 4014, 3103, 3010, 2925, 2925, 2925, 2888, 2925, 2925, 2846, 2846, 2846, 2793, 2888, 2780, + 4615, 4575, 3169, 3441, 3207, 2981, 2897, 3038, 3122, 2740, 2687, 2687, 2687, 2740, 2793, 2700, + 4149, 4269, 3789, 3657, 2726, 2780, 2888, 2888, 3010, 2972, 2925, 2846, 2687, 2687, 2793, 2888, + 4215, 3554, 2753, 2846, 2846, 2888, 2888, 2888, 2925, 2925, 2888, 2925, 2925, 2925, 2963, 2888, + 5174, 4921, 2261, 3432, 3789, 3479, 3347, 2846, 3310, 3479, 3150, 2897, 2460, 2487, 2753, 2925, + 3451, 3685, 3122, 3197, 3357, 3047, 3207, 3207, 2981, 3216, 3085, 2925, 2925, 2687, 2540, 2434, + 2981, 3010, 2793, 2793, 2740, 2793, 2846, 2972, 3056, 3103, 3150, 3150, 3150, 3103, 3010, 3010, + 2944, 2873, 2687, 2726, 2780, 3010, 3432, 3545, 3357, 3244, 3056, 3010, 2963, 2925, 2888, 2846, + 3019, 2944, 2897, 3010, 3010, 2972, 3019, 3103, 3056, 3056, 3010, 2888, 2846, 2925, 2925, 2888, + 3920, 3967, 3010, 3197, 3357, 3216, 3291, 3291, 3479, 3704, 3441, 2726, 2181, 2460, 2580, 2607 +}; + static const opus_uint8 silk_NLSF_CB1_iCDF_WB[ 64 ] = { 225, 204, 201, 184, 183, 175, 158, 154, 153, 135, 119, 115, 113, 110, 109, 99, @@ -188,6 +223,7 @@ const silk_NLSF_CB_struct silk_NLSF_CB_WB = SILK_FIX_CONST( 0.15, 16 ), SILK_FIX_CONST( 1.0 / 0.15, 6 ), silk_NLSF_CB1_WB_Q8, + silk_NLSF_CB1_WB_Wght_Q9, silk_NLSF_CB1_iCDF_WB, silk_NLSF_PRED_WB_Q8, silk_NLSF_CB2_SELECT_WB, diff --git a/external/opus-1.0.3/silk/tables_gain.c b/external/opus-1.3.1/silk/tables_gain.c similarity index 99% rename from external/opus-1.0.3/silk/tables_gain.c rename to external/opus-1.3.1/silk/tables_gain.c index fccef821..37e41d89 100644 --- a/external/opus-1.0.3/silk/tables_gain.c +++ b/external/opus-1.3.1/silk/tables_gain.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/tables_other.c b/external/opus-1.3.1/silk/tables_other.c similarity index 87% rename from external/opus-1.0.3/silk/tables_other.c rename to external/opus-1.3.1/silk/tables_other.c index 3dc68d47..e34d9077 100644 --- a/external/opus-1.0.3/silk/tables_other.c +++ b/external/opus-1.3.1/silk/tables_other.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -38,20 +38,6 @@ extern "C" { #endif -/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */ -const opus_int32 silk_TargetRate_table_NB[ TARGET_RATE_TAB_SZ ] = { - 0, 8000, 9400, 11500, 13500, 17500, 25000, MAX_TARGET_RATE_BPS -}; -const opus_int32 silk_TargetRate_table_MB[ TARGET_RATE_TAB_SZ ] = { - 0, 9000, 12000, 14500, 18500, 24500, 35500, MAX_TARGET_RATE_BPS -}; -const opus_int32 silk_TargetRate_table_WB[ TARGET_RATE_TAB_SZ ] = { - 0, 10500, 14000, 17000, 21500, 28500, 42000, MAX_TARGET_RATE_BPS -}; -const opus_int16 silk_SNR_table_Q1[ TARGET_RATE_TAB_SZ ] = { - 18, 29, 38, 40, 46, 52, 62, 84 -}; - /* Tables for stereo predictor coding */ const opus_int16 silk_stereo_pred_quant_Q13[ STEREO_QUANT_TAB_SIZE ] = { -13732, -10050, -8266, -7526, -6500, -5000, -2950, -820, diff --git a/external/opus-1.0.3/silk/tables_pitch_lag.c b/external/opus-1.3.1/silk/tables_pitch_lag.c similarity index 99% rename from external/opus-1.0.3/silk/tables_pitch_lag.c rename to external/opus-1.3.1/silk/tables_pitch_lag.c index 819b0ab3..e80cc59a 100644 --- a/external/opus-1.0.3/silk/tables_pitch_lag.c +++ b/external/opus-1.3.1/silk/tables_pitch_lag.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.0.3/silk/tables_pulses_per_block.c b/external/opus-1.3.1/silk/tables_pulses_per_block.c similarity index 99% rename from external/opus-1.0.3/silk/tables_pulses_per_block.c rename to external/opus-1.3.1/silk/tables_pulses_per_block.c index 521e6ff6..c7c01c88 100644 --- a/external/opus-1.0.3/silk/tables_pulses_per_block.c +++ b/external/opus-1.3.1/silk/tables_pulses_per_block.c @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE diff --git a/external/opus-1.3.1/silk/tests/test_unit_LPC_inv_pred_gain.c b/external/opus-1.3.1/silk/tests/test_unit_LPC_inv_pred_gain.c new file mode 100644 index 00000000..67067cea --- /dev/null +++ b/external/opus-1.3.1/silk/tests/test_unit_LPC_inv_pred_gain.c @@ -0,0 +1,129 @@ +/*********************************************************************** +Copyright (c) 2017 Google Inc., Jean-Marc Valin +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "celt/stack_alloc.h" +#include "cpu_support.h" +#include "SigProc_FIX.h" + +/* Computes the impulse response of the filter so we + can catch filters that are definitely unstable. Some + unstable filters may be classified as stable, but not + the other way around. */ +int check_stability(opus_int16 *A_Q12, int order) { + int i; + int j; + int sum_a, sum_abs_a; + sum_a = sum_abs_a = 0; + for( j = 0; j < order; j++ ) { + sum_a += A_Q12[ j ]; + sum_abs_a += silk_abs( A_Q12[ j ] ); + } + /* Check DC stability. */ + if( sum_a >= 4096 ) { + return 0; + } + /* If the sum of absolute values is less than 1, the filter + has to be stable. */ + if( sum_abs_a < 4096 ) { + return 1; + } + double y[SILK_MAX_ORDER_LPC] = {0}; + y[0] = 1; + for( i = 0; i < 10000; i++ ) { + double sum = 0; + for( j = 0; j < order; j++ ) { + sum += y[ j ]*A_Q12[ j ]; + } + for( j = order - 1; j > 0; j-- ) { + y[ j ] = y[ j - 1 ]; + } + y[ 0 ] = sum*(1./4096); + /* If impulse response reaches +/- 10000, the filter + is definitely unstable. */ + if( !(y[ 0 ] < 10000 && y[ 0 ] > -10000) ) { + return 0; + } + /* Test every 8 sample for low amplitude. */ + if( ( i & 0x7 ) == 0 ) { + double amp = 0; + for( j = 0; j < order; j++ ) { + amp += fabs(y[j]); + } + if( amp < 0.00001 ) { + return 1; + } + } + } + return 1; +} + +int main(void) { + const int arch = opus_select_arch(); + /* Set to 10000 so all branches in C function are triggered */ + const int loop_num = 10000; + int count = 0; + ALLOC_STACK; + + /* FIXME: Make the seed random (with option to set it explicitly) + so we get wider coverage. */ + srand(0); + + printf("Testing silk_LPC_inverse_pred_gain() optimization ...\n"); + for( count = 0; count < loop_num; count++ ) { + unsigned int i; + opus_int order; + unsigned int shift; + opus_int16 A_Q12[ SILK_MAX_ORDER_LPC ]; + opus_int32 gain; + + for( order = 2; order <= SILK_MAX_ORDER_LPC; order += 2 ) { /* order must be even. */ + for( shift = 0; shift < 16; shift++ ) { /* Different dynamic range. */ + for( i = 0; i < SILK_MAX_ORDER_LPC; i++ ) { + A_Q12[i] = ((opus_int16)rand()) >> shift; + } + gain = silk_LPC_inverse_pred_gain(A_Q12, order, arch); + /* Look for filters that silk_LPC_inverse_pred_gain() thinks are + stable but definitely aren't. */ + if( gain != 0 && !check_stability(A_Q12, order) ) { + fprintf(stderr, "**Loop %4d failed!**\n", count); + return 1; + } + } + } + if( !(count % 500) ) { + printf("Loop %4d passed\n", count); + } + } + printf("silk_LPC_inverse_pred_gain() optimization passed\n"); + return 0; +} diff --git a/external/opus-1.0.3/silk/tuning_parameters.h b/external/opus-1.3.1/silk/tuning_parameters.h similarity index 84% rename from external/opus-1.0.3/silk/tuning_parameters.h rename to external/opus-1.3.1/silk/tuning_parameters.h index a26de4d2..d70275fd 100644 --- a/external/opus-1.0.3/silk/tuning_parameters.h +++ b/external/opus-1.3.1/silk/tuning_parameters.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -50,18 +50,14 @@ extern "C" /* Linear prediction */ /*********************/ -/* LPC analysis defines: regularization and bandwidth expansion */ +/* LPC analysis regularization */ #define FIND_LPC_COND_FAC 1e-5f -/* LTP analysis defines */ -#define FIND_LTP_COND_FAC 1e-5f -#define LTP_DAMPING 0.05f -#define LTP_SMOOTHING 0.1f +/* Max cumulative LTP gain */ +#define MAX_SUM_LOG_GAIN_DB 250.0f -/* LTP quantization settings */ -#define MU_LTP_QUANT_NB 0.03f -#define MU_LTP_QUANT_MB 0.025f -#define MU_LTP_QUANT_WB 0.02f +/* LTP analysis defines */ +#define LTP_CORR_INV_MAX 0.03f /***********************/ /* High pass filtering */ @@ -100,25 +96,16 @@ extern "C" #define SPARSE_SNR_INCR_dB 2.0f /* threshold for sparseness measure above which to use lower quantization offset during unvoiced */ -#define SPARSENESS_THRESHOLD_QNT_OFFSET 0.75f +#define ENERGY_VARIATION_THRESHOLD_QNT_OFFSET 0.6f /* warping control */ #define WARPING_MULTIPLIER 0.015f /* fraction added to first autocorrelation value */ -#define SHAPE_WHITE_NOISE_FRACTION 5e-5f +#define SHAPE_WHITE_NOISE_FRACTION 3e-5f /* noise shaping filter chirp factor */ -#define BANDWIDTH_EXPANSION 0.95f - -/* difference between chirp factors for analysis and synthesis noise shaping filters at low bitrates */ -#define LOW_RATE_BANDWIDTH_EXPANSION_DELTA 0.01f - -/* extra harmonic boosting (signal shaping) at low bitrates */ -#define LOW_RATE_HARMONIC_BOOST 0.1f - -/* extra harmonic boosting (signal shaping) for noisy input signals */ -#define LOW_INPUT_QUALITY_HARMONIC_BOOST 0.1f +#define BANDWIDTH_EXPANSION 0.94f /* harmonic noise shaping */ #define HARMONIC_SHAPING 0.3f diff --git a/external/opus-1.0.3/silk/typedef.h b/external/opus-1.3.1/silk/typedef.h similarity index 96% rename from external/opus-1.0.3/silk/typedef.h rename to external/opus-1.3.1/silk/typedef.h index da981237..97b7e709 100644 --- a/external/opus-1.0.3/silk/typedef.h +++ b/external/opus-1.3.1/silk/typedef.h @@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the +- Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE @@ -29,6 +29,7 @@ POSSIBILITY OF SUCH DAMAGE. #define SILK_TYPEDEF_H #include "opus_types.h" +#include "opus_defines.h" #ifndef FIXED_POINT # include @@ -63,7 +64,7 @@ POSSIBILITY OF SUCH DAMAGE. #ifdef __GNUC__ __attribute__((noreturn)) #endif -static inline void _silk_fatal(const char *str, const char *file, int line) +static OPUS_INLINE void _silk_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); abort(); diff --git a/external/opus-1.3.1/silk/x86/NSQ_del_dec_sse4_1.c b/external/opus-1.3.1/silk/x86/NSQ_del_dec_sse4_1.c new file mode 100644 index 00000000..2c75ede2 --- /dev/null +++ b/external/opus-1.3.1/silk/x86/NSQ_del_dec_sse4_1.c @@ -0,0 +1,859 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include "main.h" +#include "celt/x86/x86cpu.h" + +#include "stack_alloc.h" + +typedef struct { + opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; + opus_int32 RandState[ DECISION_DELAY ]; + opus_int32 Q_Q10[ DECISION_DELAY ]; + opus_int32 Xq_Q14[ DECISION_DELAY ]; + opus_int32 Pred_Q15[ DECISION_DELAY ]; + opus_int32 Shape_Q14[ DECISION_DELAY ]; + opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; + opus_int32 LF_AR_Q14; + opus_int32 Seed; + opus_int32 SeedInit; + opus_int32 RD_Q10; +} NSQ_del_dec_struct; + +typedef struct { + opus_int32 Q_Q10; + opus_int32 RD_Q10; + opus_int32 xq_Q14; + opus_int32 LF_AR_Q14; + opus_int32 sLTP_shp_Q14; + opus_int32 LPC_exc_Q14; +} NSQ_sample_struct; + +typedef NSQ_sample_struct NSQ_sample_pair[ 2 ]; + +static OPUS_INLINE void silk_nsq_del_dec_scale_states_sse4_1( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ + const opus_int32 x_Q3[], /* I Input in Q3 */ + opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ + const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ + opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ + opus_int subfr, /* I Subframe number */ + opus_int nStatesDelayedDecision, /* I Number of del dec states */ + const opus_int LTP_scale_Q14, /* I LTP state scaling */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ + const opus_int signal_type, /* I Signal type */ + const opus_int decisionDelay /* I Decision delay */ +); + +/******************************************/ +/* Noise shape quantizer for one subframe */ +/******************************************/ +static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1( + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ + opus_int signalType, /* I Signal type */ + const opus_int32 x_Q10[], /* I */ + opus_int8 pulses[], /* O */ + opus_int16 xq[], /* O */ + opus_int32 sLTP_Q15[], /* I/O LTP filter state */ + opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ + const opus_int16 a_Q12[], /* I Short term prediction coefs */ + const opus_int16 b_Q14[], /* I Long term prediction coefs */ + const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ + opus_int lag, /* I Pitch lag */ + opus_int32 HarmShapeFIRPacked_Q14, /* I */ + opus_int Tilt_Q14, /* I Spectral tilt */ + opus_int32 LF_shp_Q14, /* I */ + opus_int32 Gain_Q16, /* I */ + opus_int Lambda_Q10, /* I */ + opus_int offset_Q10, /* I */ + opus_int length, /* I Input length */ + opus_int subfr, /* I Subframe number */ + opus_int shapingLPCOrder, /* I Shaping LPC filter order */ + opus_int predictLPCOrder, /* I Prediction filter order */ + opus_int warping_Q16, /* I */ + opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ + opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int decisionDelay /* I */ +); + +void silk_NSQ_del_dec_sse4_1( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +) +{ + opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr; + opus_int last_smple_idx, smpl_buf_idx, decisionDelay; + const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; + opus_int16 *pxq; + VARDECL( opus_int32, sLTP_Q15 ); + VARDECL( opus_int16, sLTP ); + opus_int32 HarmShapeFIRPacked_Q14; + opus_int offset_Q10; + opus_int32 RDmin_Q10, Gain_Q10; + VARDECL( opus_int32, x_sc_Q10 ); + VARDECL( opus_int32, delayedGain_Q10 ); + VARDECL( NSQ_del_dec_struct, psDelDec ); + NSQ_del_dec_struct *psDD; + SAVE_STACK; + + /* Set unvoiced lag to the previous one, overwrite later for voiced */ + lag = NSQ->lagPrev; + + silk_assert( NSQ->prev_gain_Q16 != 0 ); + + /* Initialize delayed decision states */ + ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct ); + silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) ); + for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { + psDD = &psDelDec[ k ]; + psDD->Seed = ( k + psIndices->Seed ) & 3; + psDD->SeedInit = psDD->Seed; + psDD->RD_Q10 = 0; + psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14; + psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ]; + silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); + silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) ); + } + + offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; + smpl_buf_idx = 0; /* index of oldest samples */ + + decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length ); + + /* For voiced frames limit the decision delay to lower than the pitch lag */ + if( psIndices->signalType == TYPE_VOICED ) { + for( k = 0; k < psEncC->nb_subfr; k++ ) { + decisionDelay = silk_min_int( decisionDelay, pitchL[ k ] - LTP_ORDER / 2 - 1 ); + } + } else { + if( lag > 0 ) { + decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 ); + } + } + + if( psIndices->NLSFInterpCoef_Q2 == 4 ) { + LSF_interpolation_flag = 0; + } else { + LSF_interpolation_flag = 1; + } + + ALLOC( sLTP_Q15, + psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); + ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); + ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); + ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); + /* Set up pointers to start of sub frame */ + pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; + NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; + NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; + subfr = 0; + for( k = 0; k < psEncC->nb_subfr; k++ ) { + A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; + B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; + AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; + + /* Noise shape parameters */ + silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); + HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); + HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); + + NSQ->rewhite_flag = 0; + if( psIndices->signalType == TYPE_VOICED ) { + /* Voiced */ + lag = pitchL[ k ]; + + /* Re-whitening */ + if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { + if( k == 2 ) { + /* RESET DELAYED DECISIONS */ + /* Find winner */ + RDmin_Q10 = psDelDec[ 0 ].RD_Q10; + Winner_ind = 0; + for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) { + if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) { + RDmin_Q10 = psDelDec[ i ].RD_Q10; + Winner_ind = i; + } + } + for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) { + if( i != Winner_ind ) { + psDelDec[ i ].RD_Q10 += ( silk_int32_MAX >> 4 ); + silk_assert( psDelDec[ i ].RD_Q10 >= 0 ); + } + } + + /* Copy final part of signals from winner state to output and long-term filter states */ + psDD = &psDelDec[ Winner_ind ]; + last_smple_idx = smpl_buf_idx + decisionDelay; + for( i = 0; i < decisionDelay; i++ ) { + last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; + if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; + pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); + pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( + silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) ); + NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ]; + } + + subfr = 0; + } + + /* Rewhiten with new A coefs */ + start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; + celt_assert( start_idx > 0 ); + + silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], + A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); + + NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; + NSQ->rewhite_flag = 1; + } + } + + silk_nsq_del_dec_scale_states_sse4_1( psEncC, NSQ, psDelDec, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, + psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay ); + + silk_noise_shape_quantizer_del_dec_sse4_1( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, + delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], + Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, + psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay ); + + x_Q3 += psEncC->subfr_length; + pulses += psEncC->subfr_length; + pxq += psEncC->subfr_length; + } + + /* Find winner */ + RDmin_Q10 = psDelDec[ 0 ].RD_Q10; + Winner_ind = 0; + for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { + if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) { + RDmin_Q10 = psDelDec[ k ].RD_Q10; + Winner_ind = k; + } + } + + /* Copy final part of signals from winner state to output and long-term filter states */ + psDD = &psDelDec[ Winner_ind ]; + psIndices->Seed = psDD->SeedInit; + last_smple_idx = smpl_buf_idx + decisionDelay; + Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); + for( i = 0; i < decisionDelay; i++ ) { + last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; + if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; + pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); + pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( + silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) ); + NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ]; + } + silk_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); + silk_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) ); + + /* Update states */ + NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14; + NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; + + /* Save quantized speech signal */ + silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); + silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); + RESTORE_STACK; +} + +/******************************************/ +/* Noise shape quantizer for one subframe */ +/******************************************/ +static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1( + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ + opus_int signalType, /* I Signal type */ + const opus_int32 x_Q10[], /* I */ + opus_int8 pulses[], /* O */ + opus_int16 xq[], /* O */ + opus_int32 sLTP_Q15[], /* I/O LTP filter state */ + opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ + const opus_int16 a_Q12[], /* I Short term prediction coefs */ + const opus_int16 b_Q14[], /* I Long term prediction coefs */ + const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ + opus_int lag, /* I Pitch lag */ + opus_int32 HarmShapeFIRPacked_Q14, /* I */ + opus_int Tilt_Q14, /* I Spectral tilt */ + opus_int32 LF_shp_Q14, /* I */ + opus_int32 Gain_Q16, /* I */ + opus_int Lambda_Q10, /* I */ + opus_int offset_Q10, /* I */ + opus_int length, /* I Input length */ + opus_int subfr, /* I Subframe number */ + opus_int shapingLPCOrder, /* I Shaping LPC filter order */ + opus_int predictLPCOrder, /* I Prediction filter order */ + opus_int warping_Q16, /* I */ + opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ + opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int decisionDelay /* I */ +) +{ + opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; + opus_int32 Winner_rand_state; + opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14; + opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10; + opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; + opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; + opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14; + VARDECL( NSQ_sample_pair, psSampleState ); + NSQ_del_dec_struct *psDD; + NSQ_sample_struct *psSS; + + __m128i a_Q12_0123, a_Q12_4567, a_Q12_89AB, a_Q12_CDEF; + __m128i b_Q12_0123, b_sr_Q12_0123; + SAVE_STACK; + + celt_assert( nStatesDelayedDecision > 0 ); + ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair ); + + shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; + pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; + Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); + + a_Q12_0123 = OP_CVTEPI16_EPI32_M64( a_Q12 ); + a_Q12_4567 = OP_CVTEPI16_EPI32_M64( a_Q12 + 4 ); + + if( opus_likely( predictLPCOrder == 16 ) ) { + a_Q12_89AB = OP_CVTEPI16_EPI32_M64( a_Q12 + 8 ); + a_Q12_CDEF = OP_CVTEPI16_EPI32_M64( a_Q12 + 12 ); + } + + if( signalType == TYPE_VOICED ){ + b_Q12_0123 = OP_CVTEPI16_EPI32_M64( b_Q14 ); + b_sr_Q12_0123 = _mm_shuffle_epi32( b_Q12_0123, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ + } + for( i = 0; i < length; i++ ) { + /* Perform common calculations used in all states */ + + /* Long-term prediction */ + if( signalType == TYPE_VOICED ) { + /* Unrolled loop */ + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LTP_pred_Q14 = 2; + { + __m128i tmpa, tmpb, pred_lag_ptr_tmp; + pred_lag_ptr_tmp = _mm_loadu_si128( (__m128i *)(&pred_lag_ptr[ -3 ] ) ); + pred_lag_ptr_tmp = _mm_shuffle_epi32( pred_lag_ptr_tmp, 0x1B ); + tmpa = _mm_mul_epi32( pred_lag_ptr_tmp, b_Q12_0123 ); + tmpa = _mm_srli_si128( tmpa, 2 ); + + pred_lag_ptr_tmp = _mm_shuffle_epi32( pred_lag_ptr_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) );/* equal shift right 4 bytes */ + pred_lag_ptr_tmp = _mm_mul_epi32( pred_lag_ptr_tmp, b_sr_Q12_0123 ); + pred_lag_ptr_tmp = _mm_srli_si128( pred_lag_ptr_tmp, 2 ); + pred_lag_ptr_tmp = _mm_add_epi32( pred_lag_ptr_tmp, tmpa ); + + tmpb = _mm_shuffle_epi32( pred_lag_ptr_tmp, _MM_SHUFFLE( 0, 0, 3, 2 ) );/* equal shift right 8 bytes */ + pred_lag_ptr_tmp = _mm_add_epi32( pred_lag_ptr_tmp, tmpb ); + LTP_pred_Q14 += _mm_cvtsi128_si32( pred_lag_ptr_tmp ); + + LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); + LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */ + pred_lag_ptr++; + } + } else { + LTP_pred_Q14 = 0; + } + + /* Long-term shaping */ + if( lag > 0 ) { + /* Symmetric, packed FIR coefficients */ + n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); + n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); + n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */ + shp_lag_ptr++; + } else { + n_LTP_Q14 = 0; + } + { + __m128i tmpa, tmpb, psLPC_Q14_tmp, a_Q12_tmp; + + for( k = 0; k < nStatesDelayedDecision; k++ ) { + /* Delayed decision state */ + psDD = &psDelDec[ k ]; + + /* Sample state */ + psSS = psSampleState[ k ]; + + /* Generate dither */ + psDD->Seed = silk_RAND( psDD->Seed ); + + /* Pointer used in short term prediction and shaping */ + psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; + /* Short-term prediction */ + silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 ); + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LPC_pred_Q14 = silk_RSHIFT( predictLPCOrder, 1 ); + + tmpb = _mm_setzero_si128(); + + /* step 1 */ + psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -3 ] ) ); /* -3, -2 , -1, 0 */ + psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); /* 0, -1, -2, -3 */ + tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_0123 ); /* 0, -1, -2, -3 * 0123 -> 0*0, 2*-2 */ + + tmpa = _mm_srli_epi64( tmpa, 16 ); + tmpb = _mm_add_epi32( tmpb, tmpa ); + + psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ + a_Q12_tmp = _mm_shuffle_epi32( a_Q12_0123, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ + psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); /* 1*-1, 3*-3 */ + psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 ); + tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp ); + + /* step 2 */ + psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -7 ] ) ); + psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); + tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_4567 ); + tmpa = _mm_srli_epi64( tmpa, 16 ); + tmpb = _mm_add_epi32( tmpb, tmpa ); + + psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ + a_Q12_tmp = _mm_shuffle_epi32( a_Q12_4567, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ + psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); + psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 ); + tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp ); + + if ( opus_likely( predictLPCOrder == 16 ) ) + { + /* step 3 */ + psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -11 ] ) ); + psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); + tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_89AB ); + tmpa = _mm_srli_epi64( tmpa, 16 ); + tmpb = _mm_add_epi32( tmpb, tmpa ); + + psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ + a_Q12_tmp = _mm_shuffle_epi32( a_Q12_89AB, _MM_SHUFFLE(0, 3, 2, 1 ) );/* equal shift right 4 bytes */ + psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); + psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 ); + tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp ); + + /* setp 4 */ + psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -15 ] ) ); + psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); + tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_CDEF ); + tmpa = _mm_srli_epi64( tmpa, 16 ); + tmpb = _mm_add_epi32( tmpb, tmpa ); + + psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ + a_Q12_tmp = _mm_shuffle_epi32( a_Q12_CDEF, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ + psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); + psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 ); + tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp ); + + /* add at last */ + /* equal shift right 8 bytes*/ + tmpa = _mm_shuffle_epi32( tmpb, _MM_SHUFFLE( 0, 0, 3, 2 ) ); + tmpb = _mm_add_epi32( tmpb, tmpa ); + LPC_pred_Q14 += _mm_cvtsi128_si32( tmpb ); + } + else + { + /* add at last */ + tmpa = _mm_shuffle_epi32( tmpb, _MM_SHUFFLE( 0, 0, 3, 2 ) ); /* equal shift right 8 bytes*/ + tmpb = _mm_add_epi32( tmpb, tmpa ); + LPC_pred_Q14 += _mm_cvtsi128_si32( tmpb ); + + LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -8 ], a_Q12[ 8 ] ); + LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -9 ], a_Q12[ 9 ] ); + } + + LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */ + + /* Noise shape feedback */ + silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ + /* Output of lowpass section */ + tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 ); + psDD->sAR2_Q14[ 0 ] = tmp2; + n_AR_Q14 = silk_RSHIFT( shapingLPCOrder, 1 ); + n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ 0 ] ); + /* Loop over allpass sections */ + for( j = 2; j < shapingLPCOrder; j += 2 ) { + /* Output of allpass section */ + tmp2 = silk_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j + 0 ] - tmp1, warping_Q16 ); + psDD->sAR2_Q14[ j - 1 ] = tmp1; + n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ j - 1 ] ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ j + 0 ], psDD->sAR2_Q14[ j + 1 ] - tmp2, warping_Q16 ); + psDD->sAR2_Q14[ j + 0 ] = tmp2; + n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ j ] ); + } + psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1; + n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] ); + + n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 ); /* Q11 -> Q12 */ + n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 ); /* Q12 */ + n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 ); /* Q12 -> Q14 */ + + n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 ); /* Q12 */ + n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 ); /* Q12 */ + n_LF_Q14 = silk_LSHIFT( n_LF_Q14, 2 ); /* Q12 -> Q14 */ + + /* Input minus prediction plus noise feedback */ + /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ + tmp1 = silk_ADD32( n_AR_Q14, n_LF_Q14 ); /* Q14 */ + tmp2 = silk_ADD32( n_LTP_Q14, LPC_pred_Q14 ); /* Q13 */ + tmp1 = silk_SUB32( tmp2, tmp1 ); /* Q13 */ + tmp1 = silk_RSHIFT_ROUND( tmp1, 4 ); /* Q10 */ + + r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */ + + /* Flip sign depending on dither */ + if ( psDD->Seed < 0 ) { + r_Q10 = -r_Q10; + } + r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); + + /* Find two quantization level candidates and measure their rate-distortion */ + q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); + q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); + if( q1_Q0 > 0 ) { + q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); + q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); + q2_Q10 = silk_ADD32( q1_Q10, 1024 ); + rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); + rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); + } else if( q1_Q0 == 0 ) { + q1_Q10 = offset_Q10; + q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); + rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); + rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); + } else if( q1_Q0 == -1 ) { + q2_Q10 = offset_Q10; + q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); + rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); + rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); + } else { /* q1_Q0 < -1 */ + q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); + q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); + q2_Q10 = silk_ADD32( q1_Q10, 1024 ); + rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); + rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 ); + } + rr_Q10 = silk_SUB32( r_Q10, q1_Q10 ); + rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 ); + rr_Q10 = silk_SUB32( r_Q10, q2_Q10 ); + rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 ); + + if( rd1_Q10 < rd2_Q10 ) { + psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); + psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); + psSS[ 0 ].Q_Q10 = q1_Q10; + psSS[ 1 ].Q_Q10 = q2_Q10; + } else { + psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); + psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); + psSS[ 0 ].Q_Q10 = q2_Q10; + psSS[ 1 ].Q_Q10 = q1_Q10; + } + + /* Update states for best quantization */ + + /* Quantized excitation */ + exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 ); + if ( psDD->Seed < 0 ) { + exc_Q14 = -exc_Q14; + } + + /* Add predictions */ + LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); + xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); + + /* Update states */ + sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); + psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); + psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; + psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; + psSS[ 0 ].xq_Q14 = xq_Q14; + + /* Update states for second best quantization */ + + /* Quantized excitation */ + exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 ); + if ( psDD->Seed < 0 ) { + exc_Q14 = -exc_Q14; + } + + + /* Add predictions */ + LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); + xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); + + /* Update states */ + sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); + psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); + psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; + psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; + psSS[ 1 ].xq_Q14 = xq_Q14; + } + } + *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; + if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; + last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; + + /* Find winner */ + RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; + Winner_ind = 0; + for( k = 1; k < nStatesDelayedDecision; k++ ) { + if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) { + RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10; + Winner_ind = k; + } + } + + /* Increase RD values of expired states */ + Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ]; + for( k = 0; k < nStatesDelayedDecision; k++ ) { + if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) { + psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 ); + psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 ); + silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 ); + } + } + + /* Find worst in first set and best in second set */ + RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; + RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10; + RDmax_ind = 0; + RDmin_ind = 0; + for( k = 1; k < nStatesDelayedDecision; k++ ) { + /* find worst in first set */ + if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) { + RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10; + RDmax_ind = k; + } + /* find best in second set */ + if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) { + RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10; + RDmin_ind = k; + } + } + + /* Replace a state if best from second set outperforms worst in first set */ + if( RDmin_Q10 < RDmax_Q10 ) { + silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i, + ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) ); + silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) ); + } + + /* Write samples from winner to output and long-term filter states */ + psDD = &psDelDec[ Winner_ind ]; + if( subfr > 0 || i >= decisionDelay ) { + pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); + xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( + silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) ); + NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ]; + sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ]; + } + NSQ->sLTP_shp_buf_idx++; + NSQ->sLTP_buf_idx++; + + /* Update states */ + for( k = 0; k < nStatesDelayedDecision; k++ ) { + psDD = &psDelDec[ k ]; + psSS = &psSampleState[ k ][ 0 ]; + psDD->LF_AR_Q14 = psSS->LF_AR_Q14; + psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; + psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; + psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; + psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 ); + psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14; + psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) ); + psDD->RandState[ *smpl_buf_idx ] = psDD->Seed; + psDD->RD_Q10 = psSS->RD_Q10; + } + delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; + } + /* Update LPC states */ + for( k = 0; k < nStatesDelayedDecision; k++ ) { + psDD = &psDelDec[ k ]; + silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); + } + RESTORE_STACK; +} + +static OPUS_INLINE void silk_nsq_del_dec_scale_states_sse4_1( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ + const opus_int32 x_Q3[], /* I Input in Q3 */ + opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ + const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ + opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ + opus_int subfr, /* I Subframe number */ + opus_int nStatesDelayedDecision, /* I Number of del dec states */ + const opus_int LTP_scale_Q14, /* I LTP state scaling */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ + const opus_int signal_type, /* I Signal type */ + const opus_int decisionDelay /* I Decision delay */ +) +{ + opus_int i, k, lag; + opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; + NSQ_del_dec_struct *psDD; + __m128i xmm_inv_gain_Q23, xmm_x_Q3_x2x0, xmm_x_Q3_x3x1; + + lag = pitchL[ subfr ]; + inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); + + silk_assert( inv_gain_Q31 != 0 ); + + /* Calculate gain adjustment factor */ + if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { + gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); + } else { + gain_adj_Q16 = (opus_int32)1 << 16; + } + + /* Scale input */ + inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); + + /* prepare inv_gain_Q23 in packed 4 32-bits */ + xmm_inv_gain_Q23 = _mm_set1_epi32(inv_gain_Q23); + + for( i = 0; i < psEncC->subfr_length - 3; i += 4 ) { + xmm_x_Q3_x2x0 = _mm_loadu_si128( (__m128i *)(&(x_Q3[ i ] ) ) ); + /* equal shift right 4 bytes*/ + xmm_x_Q3_x3x1 = _mm_shuffle_epi32( xmm_x_Q3_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); + + xmm_x_Q3_x2x0 = _mm_mul_epi32( xmm_x_Q3_x2x0, xmm_inv_gain_Q23 ); + xmm_x_Q3_x3x1 = _mm_mul_epi32( xmm_x_Q3_x3x1, xmm_inv_gain_Q23 ); + + xmm_x_Q3_x2x0 = _mm_srli_epi64( xmm_x_Q3_x2x0, 16 ); + xmm_x_Q3_x3x1 = _mm_slli_epi64( xmm_x_Q3_x3x1, 16 ); + + xmm_x_Q3_x2x0 = _mm_blend_epi16( xmm_x_Q3_x2x0, xmm_x_Q3_x3x1, 0xCC ); + + _mm_storeu_si128( (__m128i *)(&(x_sc_Q10[ i ])), xmm_x_Q3_x2x0 ); + } + + for( ; i < psEncC->subfr_length; i++ ) { + x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); + } + + /* Save inverse gain */ + NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; + + /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ + if( NSQ->rewhite_flag ) { + if( subfr == 0 ) { + /* Do LTP downscaling */ + inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); + } + for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { + silk_assert( i < MAX_FRAME_LENGTH ); + sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); + } + } + + /* Adjust for changing gain */ + if( gain_adj_Q16 != (opus_int32)1 << 16 ) { + /* Scale long-term shaping state */ + { + __m128i xmm_gain_adj_Q16, xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1; + + /* prepare gain_adj_Q16 in packed 4 32-bits */ + xmm_gain_adj_Q16 = _mm_set1_epi32( gain_adj_Q16 ); + + for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 3; i += 4 ) + { + xmm_sLTP_shp_Q14_x2x0 = _mm_loadu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ) ); + /* equal shift right 4 bytes*/ + xmm_sLTP_shp_Q14_x3x1 = _mm_shuffle_epi32( xmm_sLTP_shp_Q14_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); + + xmm_sLTP_shp_Q14_x2x0 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x2x0, xmm_gain_adj_Q16 ); + xmm_sLTP_shp_Q14_x3x1 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x3x1, xmm_gain_adj_Q16 ); + + xmm_sLTP_shp_Q14_x2x0 = _mm_srli_epi64( xmm_sLTP_shp_Q14_x2x0, 16 ); + xmm_sLTP_shp_Q14_x3x1 = _mm_slli_epi64( xmm_sLTP_shp_Q14_x3x1, 16 ); + + xmm_sLTP_shp_Q14_x2x0 = _mm_blend_epi16( xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1, 0xCC ); + + _mm_storeu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ), xmm_sLTP_shp_Q14_x2x0 ); + } + + for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { + NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); + } + + /* Scale long-term prediction state */ + if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { + for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { + sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); + } + } + + for( k = 0; k < nStatesDelayedDecision; k++ ) { + psDD = &psDelDec[ k ]; + + /* Scale scalar states */ + psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 ); + + /* Scale short-term prediction and shaping states */ + for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { + psDD->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ i ] ); + } + for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { + psDD->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[ i ] ); + } + for( i = 0; i < DECISION_DELAY; i++ ) { + psDD->Pred_Q15[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Pred_Q15[ i ] ); + psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q14[ i ] ); + } + } + } + } +} diff --git a/external/opus-1.3.1/silk/x86/NSQ_sse4_1.c b/external/opus-1.3.1/silk/x86/NSQ_sse4_1.c new file mode 100644 index 00000000..b0315e35 --- /dev/null +++ b/external/opus-1.3.1/silk/x86/NSQ_sse4_1.c @@ -0,0 +1,719 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include "main.h" +#include "celt/x86/x86cpu.h" +#include "stack_alloc.h" + +static OPUS_INLINE void silk_nsq_scale_states_sse4_1( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + const opus_int32 x_Q3[], /* I input in Q3 */ + opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ + const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ + opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ + opus_int subfr, /* I subframe number */ + const opus_int LTP_scale_Q14, /* I */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ + const opus_int signal_type /* I Signal type */ +); + +static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1( + silk_nsq_state *NSQ, /* I/O NSQ state */ + opus_int signalType, /* I Signal type */ + const opus_int32 x_sc_Q10[], /* I */ + opus_int8 pulses[], /* O */ + opus_int16 xq[], /* O */ + opus_int32 sLTP_Q15[], /* I/O LTP state */ + const opus_int16 a_Q12[], /* I Short term prediction coefs */ + const opus_int16 b_Q14[], /* I Long term prediction coefs */ + const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ + opus_int lag, /* I Pitch lag */ + opus_int32 HarmShapeFIRPacked_Q14, /* I */ + opus_int Tilt_Q14, /* I Spectral tilt */ + opus_int32 LF_shp_Q14, /* I */ + opus_int32 Gain_Q16, /* I */ + opus_int offset_Q10, /* I */ + opus_int length, /* I Input length */ + opus_int32 table[][4] /* I */ +); + +void silk_NSQ_sse4_1( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +) +{ + opus_int k, lag, start_idx, LSF_interpolation_flag; + const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; + opus_int16 *pxq; + VARDECL( opus_int32, sLTP_Q15 ); + VARDECL( opus_int16, sLTP ); + opus_int32 HarmShapeFIRPacked_Q14; + opus_int offset_Q10; + VARDECL( opus_int32, x_sc_Q10 ); + + opus_int32 table[ 64 ][ 4 ]; + opus_int32 tmp1; + opus_int32 q1_Q10, q2_Q10, rd1_Q20, rd2_Q20; + + SAVE_STACK; + + NSQ->rand_seed = psIndices->Seed; + + /* Set unvoiced lag to the previous one, overwrite later for voiced */ + lag = NSQ->lagPrev; + + silk_assert( NSQ->prev_gain_Q16 != 0 ); + + offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; + + /* 0 */ + q1_Q10 = offset_Q10; + q2_Q10 = offset_Q10 + ( 1024 - QUANT_LEVEL_ADJUST_Q10 ); + rd1_Q20 = q1_Q10 * Lambda_Q10; + rd2_Q20 = q2_Q10 * Lambda_Q10; + + table[ 32 ][ 0 ] = q1_Q10; + table[ 32 ][ 1 ] = q2_Q10; + table[ 32 ][ 2 ] = 2 * (q1_Q10 - q2_Q10); + table[ 32 ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10); + + /* -1 */ + q1_Q10 = offset_Q10 - ( 1024 - QUANT_LEVEL_ADJUST_Q10 ); + q2_Q10 = offset_Q10; + rd1_Q20 = - q1_Q10 * Lambda_Q10; + rd2_Q20 = q2_Q10 * Lambda_Q10; + + table[ 31 ][ 0 ] = q1_Q10; + table[ 31 ][ 1 ] = q2_Q10; + table[ 31 ][ 2 ] = 2 * (q1_Q10 - q2_Q10); + table[ 31 ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10); + + /* > 0 */ + for (k = 1; k <= 31; k++) + { + tmp1 = offset_Q10 + silk_LSHIFT( k, 10 ); + + q1_Q10 = tmp1 - QUANT_LEVEL_ADJUST_Q10; + q2_Q10 = tmp1 - QUANT_LEVEL_ADJUST_Q10 + 1024; + rd1_Q20 = q1_Q10 * Lambda_Q10; + rd2_Q20 = q2_Q10 * Lambda_Q10; + + table[ 32 + k ][ 0 ] = q1_Q10; + table[ 32 + k ][ 1 ] = q2_Q10; + table[ 32 + k ][ 2 ] = 2 * (q1_Q10 - q2_Q10); + table[ 32 + k ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10); + } + + /* < -1 */ + for (k = -32; k <= -2; k++) + { + tmp1 = offset_Q10 + silk_LSHIFT( k, 10 ); + + q1_Q10 = tmp1 + QUANT_LEVEL_ADJUST_Q10; + q2_Q10 = tmp1 + QUANT_LEVEL_ADJUST_Q10 + 1024; + rd1_Q20 = - q1_Q10 * Lambda_Q10; + rd2_Q20 = - q2_Q10 * Lambda_Q10; + + table[ 32 + k ][ 0 ] = q1_Q10; + table[ 32 + k ][ 1 ] = q2_Q10; + table[ 32 + k ][ 2 ] = 2 * (q1_Q10 - q2_Q10); + table[ 32 + k ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10); + } + + if( psIndices->NLSFInterpCoef_Q2 == 4 ) { + LSF_interpolation_flag = 0; + } else { + LSF_interpolation_flag = 1; + } + + ALLOC( sLTP_Q15, + psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); + ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); + ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); + /* Set up pointers to start of sub frame */ + NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; + NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; + pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; + for( k = 0; k < psEncC->nb_subfr; k++ ) { + A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ]; + B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; + AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; + + /* Noise shape parameters */ + silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); + HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); + HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); + + NSQ->rewhite_flag = 0; + if( psIndices->signalType == TYPE_VOICED ) { + /* Voiced */ + lag = pitchL[ k ]; + + /* Re-whitening */ + if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { + /* Rewhiten with new A coefs */ + start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; + celt_assert( start_idx > 0 ); + + silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], + A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); + + NSQ->rewhite_flag = 1; + NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; + } + } + + silk_nsq_scale_states_sse4_1( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); + + if ( opus_likely( ( 10 == psEncC->shapingLPCOrder ) && ( 16 == psEncC->predictLPCOrder) ) ) + { + silk_noise_shape_quantizer_10_16_sse4_1( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14, + AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], + offset_Q10, psEncC->subfr_length, &(table[32]) ); + } + else + { + silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14, + AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, + offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->arch ); + } + + x_Q3 += psEncC->subfr_length; + pulses += psEncC->subfr_length; + pxq += psEncC->subfr_length; + } + + /* Update lagPrev for next frame */ + NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; + + /* Save quantized speech and noise shaping signals */ + silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); + silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); + RESTORE_STACK; +} + +/***********************************/ +/* silk_noise_shape_quantizer_10_16 */ +/***********************************/ +static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1( + silk_nsq_state *NSQ, /* I/O NSQ state */ + opus_int signalType, /* I Signal type */ + const opus_int32 x_sc_Q10[], /* I */ + opus_int8 pulses[], /* O */ + opus_int16 xq[], /* O */ + opus_int32 sLTP_Q15[], /* I/O LTP state */ + const opus_int16 a_Q12[], /* I Short term prediction coefs */ + const opus_int16 b_Q14[], /* I Long term prediction coefs */ + const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ + opus_int lag, /* I Pitch lag */ + opus_int32 HarmShapeFIRPacked_Q14, /* I */ + opus_int Tilt_Q14, /* I Spectral tilt */ + opus_int32 LF_shp_Q14, /* I */ + opus_int32 Gain_Q16, /* I */ + opus_int offset_Q10, /* I */ + opus_int length, /* I Input length */ + opus_int32 table[][4] /* I */ +) +{ + opus_int i; + opus_int32 LTP_pred_Q13, LPC_pred_Q10, n_AR_Q12, n_LTP_Q13; + opus_int32 n_LF_Q12, r_Q10, q1_Q0, q1_Q10, q2_Q10; + opus_int32 exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; + opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; + opus_int32 *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr; + + __m128i xmm_tempa, xmm_tempb; + + __m128i xmm_one; + + __m128i psLPC_Q14_hi_01234567, psLPC_Q14_hi_89ABCDEF; + __m128i psLPC_Q14_lo_01234567, psLPC_Q14_lo_89ABCDEF; + __m128i a_Q12_01234567, a_Q12_89ABCDEF; + + __m128i sAR2_Q14_hi_76543210, sAR2_Q14_lo_76543210; + __m128i AR_shp_Q13_76543210; + + shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; + pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; + Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); + + /* Set up short term AR state */ + psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 ]; + + sLF_AR_shp_Q14 = NSQ->sLF_AR_shp_Q14; + xq_Q14 = psLPC_Q14[ 0 ]; + LTP_pred_Q13 = 0; + + /* load a_Q12 */ + xmm_one = _mm_set_epi8( 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 ); + + /* load a_Q12[0] - a_Q12[7] */ + a_Q12_01234567 = _mm_loadu_si128( (__m128i *)(&a_Q12[ 0 ] ) ); + /* load a_Q12[ 8 ] - a_Q12[ 15 ] */ + a_Q12_89ABCDEF = _mm_loadu_si128( (__m128i *)(&a_Q12[ 8 ] ) ); + + a_Q12_01234567 = _mm_shuffle_epi8( a_Q12_01234567, xmm_one ); + a_Q12_89ABCDEF = _mm_shuffle_epi8( a_Q12_89ABCDEF, xmm_one ); + + /* load AR_shp_Q13 */ + AR_shp_Q13_76543210 = _mm_loadu_si128( (__m128i *)(&AR_shp_Q13[0] ) ); + + /* load psLPC_Q14 */ + xmm_one = _mm_set_epi8(15, 14, 11, 10, 7, 6, 3, 2, 13, 12, 9, 8, 5, 4, 1, 0 ); + + xmm_tempa = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[-16]) ); + xmm_tempb = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[-12]) ); + + xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one ); + xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one ); + + psLPC_Q14_hi_89ABCDEF = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb ); + psLPC_Q14_lo_89ABCDEF = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb ); + + xmm_tempa = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -8 ]) ); + xmm_tempb = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -4 ]) ); + + xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one ); + xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one ); + + psLPC_Q14_hi_01234567 = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb ); + psLPC_Q14_lo_01234567 = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb ); + + /* load sAR2_Q14 */ + xmm_tempa = _mm_loadu_si128( (__m128i *)(&(NSQ->sAR2_Q14[ 0 ]) ) ); + xmm_tempb = _mm_loadu_si128( (__m128i *)(&(NSQ->sAR2_Q14[ 4 ]) ) ); + + xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one ); + xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one ); + + sAR2_Q14_hi_76543210 = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb ); + sAR2_Q14_lo_76543210 = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb ); + + /* prepare 1 in 8 * 16bit */ + xmm_one = _mm_set1_epi16(1); + + for( i = 0; i < length; i++ ) + { + /* Short-term prediction */ + __m128i xmm_hi_07, xmm_hi_8F, xmm_lo_07, xmm_lo_8F; + + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LPC_pred_Q10 = 8; /* silk_RSHIFT( predictLPCOrder, 1 ); */ + + /* shift psLPC_Q14 */ + psLPC_Q14_hi_89ABCDEF = _mm_alignr_epi8( psLPC_Q14_hi_01234567, psLPC_Q14_hi_89ABCDEF, 2 ); + psLPC_Q14_lo_89ABCDEF = _mm_alignr_epi8( psLPC_Q14_lo_01234567, psLPC_Q14_lo_89ABCDEF, 2 ); + + psLPC_Q14_hi_01234567 = _mm_srli_si128( psLPC_Q14_hi_01234567, 2 ); + psLPC_Q14_lo_01234567 = _mm_srli_si128( psLPC_Q14_lo_01234567, 2 ); + + psLPC_Q14_hi_01234567 = _mm_insert_epi16( psLPC_Q14_hi_01234567, (xq_Q14 >> 16), 7 ); + psLPC_Q14_lo_01234567 = _mm_insert_epi16( psLPC_Q14_lo_01234567, (xq_Q14), 7 ); + + /* high part, use pmaddwd, results in 4 32-bit */ + xmm_hi_07 = _mm_madd_epi16( psLPC_Q14_hi_01234567, a_Q12_01234567 ); + xmm_hi_8F = _mm_madd_epi16( psLPC_Q14_hi_89ABCDEF, a_Q12_89ABCDEF ); + + /* low part, use pmulhw, results in 8 16-bit, note we need simulate unsigned * signed, _mm_srai_epi16(psLPC_Q14_lo_01234567, 15) */ + xmm_tempa = _mm_cmpgt_epi16( _mm_setzero_si128(), psLPC_Q14_lo_01234567 ); + xmm_tempb = _mm_cmpgt_epi16( _mm_setzero_si128(), psLPC_Q14_lo_89ABCDEF ); + + xmm_tempa = _mm_and_si128( xmm_tempa, a_Q12_01234567 ); + xmm_tempb = _mm_and_si128( xmm_tempb, a_Q12_89ABCDEF ); + + xmm_lo_07 = _mm_mulhi_epi16( psLPC_Q14_lo_01234567, a_Q12_01234567 ); + xmm_lo_8F = _mm_mulhi_epi16( psLPC_Q14_lo_89ABCDEF, a_Q12_89ABCDEF ); + + xmm_lo_07 = _mm_add_epi16( xmm_lo_07, xmm_tempa ); + xmm_lo_8F = _mm_add_epi16( xmm_lo_8F, xmm_tempb ); + + xmm_lo_07 = _mm_madd_epi16( xmm_lo_07, xmm_one ); + xmm_lo_8F = _mm_madd_epi16( xmm_lo_8F, xmm_one ); + + /* accumulate */ + xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_hi_8F ); + xmm_lo_07 = _mm_add_epi32( xmm_lo_07, xmm_lo_8F ); + + xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_lo_07 ); + + xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_unpackhi_epi64(xmm_hi_07, xmm_hi_07 ) ); + xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_shufflelo_epi16(xmm_hi_07, 0x0E ) ); + + LPC_pred_Q10 += _mm_cvtsi128_si32( xmm_hi_07 ); + + /* Long-term prediction */ + if ( opus_likely( signalType == TYPE_VOICED ) ) { + /* Unrolled loop */ + /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ + LTP_pred_Q13 = 2; + { + __m128i b_Q14_3210, b_Q14_0123, pred_lag_ptr_0123; + + b_Q14_3210 = OP_CVTEPI16_EPI32_M64( b_Q14 ); + b_Q14_0123 = _mm_shuffle_epi32( b_Q14_3210, 0x1B ); + + /* loaded: [0] [-1] [-2] [-3] */ + pred_lag_ptr_0123 = _mm_loadu_si128( (__m128i *)(&pred_lag_ptr[ -3 ] ) ); + /* shuffle to [-3] [-2] [-1] [0] and to new xmm */ + xmm_tempa = _mm_shuffle_epi32( pred_lag_ptr_0123, 0x1B ); + /*64-bit multiply, a[2] * b[-2], a[0] * b[0] */ + xmm_tempa = _mm_mul_epi32( xmm_tempa, b_Q14_3210 ); + /* right shift 2 bytes (16 bits), zero extended */ + xmm_tempa = _mm_srli_si128( xmm_tempa, 2 ); + + /* a[1] * b[-1], a[3] * b[-3] */ + pred_lag_ptr_0123 = _mm_mul_epi32( pred_lag_ptr_0123, b_Q14_0123 ); + pred_lag_ptr_0123 = _mm_srli_si128( pred_lag_ptr_0123, 2 ); + + pred_lag_ptr_0123 = _mm_add_epi32( pred_lag_ptr_0123, xmm_tempa ); + /* equal shift right 8 bytes*/ + xmm_tempa = _mm_shuffle_epi32( pred_lag_ptr_0123, _MM_SHUFFLE( 0, 0, 3, 2 ) ); + xmm_tempa = _mm_add_epi32( xmm_tempa, pred_lag_ptr_0123 ); + + LTP_pred_Q13 += _mm_cvtsi128_si32( xmm_tempa ); + + LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); + pred_lag_ptr++; + } + } + + /* Noise shape feedback */ + NSQ->sAR2_Q14[ 9 ] = NSQ->sAR2_Q14[ 8 ]; + NSQ->sAR2_Q14[ 8 ] = _mm_cvtsi128_si32( _mm_srli_si128(_mm_unpackhi_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 ), 12 ) ); + + sAR2_Q14_hi_76543210 = _mm_slli_si128( sAR2_Q14_hi_76543210, 2 ); + sAR2_Q14_lo_76543210 = _mm_slli_si128( sAR2_Q14_lo_76543210, 2 ); + + sAR2_Q14_hi_76543210 = _mm_insert_epi16( sAR2_Q14_hi_76543210, (xq_Q14 >> 16), 0 ); + sAR2_Q14_lo_76543210 = _mm_insert_epi16( sAR2_Q14_lo_76543210, (xq_Q14), 0 ); + + /* high part, use pmaddwd, results in 4 32-bit */ + xmm_hi_07 = _mm_madd_epi16( sAR2_Q14_hi_76543210, AR_shp_Q13_76543210 ); + + /* low part, use pmulhw, results in 8 16-bit, note we need simulate unsigned * signed,_mm_srai_epi16(sAR2_Q14_lo_76543210, 15) */ + xmm_tempa = _mm_cmpgt_epi16( _mm_setzero_si128(), sAR2_Q14_lo_76543210 ); + xmm_tempa = _mm_and_si128( xmm_tempa, AR_shp_Q13_76543210 ); + + xmm_lo_07 = _mm_mulhi_epi16( sAR2_Q14_lo_76543210, AR_shp_Q13_76543210 ); + xmm_lo_07 = _mm_add_epi16( xmm_lo_07, xmm_tempa ); + + xmm_lo_07 = _mm_madd_epi16( xmm_lo_07, xmm_one ); + + /* accumulate */ + xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_lo_07 ); + + xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_unpackhi_epi64(xmm_hi_07, xmm_hi_07 ) ); + xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_shufflelo_epi16(xmm_hi_07, 0x0E ) ); + + n_AR_Q12 = 5 + _mm_cvtsi128_si32( xmm_hi_07 ); + + n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sAR2_Q14[ 8 ], AR_shp_Q13[ 8 ] ); + n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sAR2_Q14[ 9 ], AR_shp_Q13[ 9 ] ); + + n_AR_Q12 = silk_LSHIFT32( n_AR_Q12, 1 ); /* Q11 -> Q12 */ + n_AR_Q12 = silk_SMLAWB( n_AR_Q12, sLF_AR_shp_Q14, Tilt_Q14 ); + + n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 ); + n_LF_Q12 = silk_SMLAWT( n_LF_Q12, sLF_AR_shp_Q14, LF_shp_Q14 ); + + silk_assert( lag > 0 || signalType != TYPE_VOICED ); + + /* Combine prediction and noise shaping signals */ + tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 ); /* Q12 */ + tmp1 = silk_SUB32( tmp1, n_LF_Q12 ); /* Q12 */ + if( lag > 0 ) { + /* Symmetric, packed FIR coefficients */ + n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); + n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); + n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 ); + shp_lag_ptr++; + + tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 ); /* Q13 */ + tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 ); /* Q13 */ + tmp1 = silk_RSHIFT_ROUND( tmp1, 3 ); /* Q10 */ + } else { + tmp1 = silk_RSHIFT_ROUND( tmp1, 2 ); /* Q10 */ + } + + r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 ); /* residual error Q10 */ + + /* Generate dither */ + NSQ->rand_seed = silk_RAND( NSQ->rand_seed ); + + /* Flip sign depending on dither */ + tmp2 = -r_Q10; + if ( NSQ->rand_seed < 0 ) r_Q10 = tmp2; + + r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); + + /* Find two quantization level candidates and measure their rate-distortion */ + q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); + q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); + + q1_Q10 = table[q1_Q0][0]; + q2_Q10 = table[q1_Q0][1]; + + if (r_Q10 * table[q1_Q0][2] - table[q1_Q0][3] < 0) + { + q1_Q10 = q2_Q10; + } + + pulses[ i ] = (opus_int8)silk_RSHIFT_ROUND( q1_Q10, 10 ); + + /* Excitation */ + exc_Q14 = silk_LSHIFT( q1_Q10, 4 ); + + tmp2 = -exc_Q14; + if ( NSQ->rand_seed < 0 ) exc_Q14 = tmp2; + + /* Add predictions */ + LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 ); + xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 ); + + /* Update states */ + psLPC_Q14++; + *psLPC_Q14 = xq_Q14; + sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 ); + + NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_shp_Q14, n_LF_Q12, 2 ); + sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 ); + NSQ->sLTP_shp_buf_idx++; + NSQ->sLTP_buf_idx++; + + /* Make dither dependent on quantized signal */ + NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] ); + } + + NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; + + /* Scale XQ back to normal level before saving */ + psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH ]; + + /* write back sAR2_Q14 */ + xmm_tempa = _mm_unpackhi_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 ); + xmm_tempb = _mm_unpacklo_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 ); + _mm_storeu_si128( (__m128i *)(&NSQ->sAR2_Q14[ 4 ]), xmm_tempa ); + _mm_storeu_si128( (__m128i *)(&NSQ->sAR2_Q14[ 0 ]), xmm_tempb ); + + /* xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psLPC_Q14[ i ], Gain_Q10 ), 8 ) ); */ + { + __m128i xmm_Gain_Q10; + __m128i xmm_xq_Q14_3210, xmm_xq_Q14_x3x1, xmm_xq_Q14_7654, xmm_xq_Q14_x7x5; + + /* prepare (1 << 7) in packed 4 32-bits */ + xmm_tempa = _mm_set1_epi32( (1 << 7) ); + + /* prepare Gain_Q10 in packed 4 32-bits */ + xmm_Gain_Q10 = _mm_set1_epi32( Gain_Q10 ); + + /* process xq */ + for (i = 0; i < length - 7; i += 8) + { + xmm_xq_Q14_3210 = _mm_loadu_si128( (__m128i *)(&(psLPC_Q14[ i + 0 ] ) ) ); + xmm_xq_Q14_7654 = _mm_loadu_si128( (__m128i *)(&(psLPC_Q14[ i + 4 ] ) ) ); + + /* equal shift right 4 bytes*/ + xmm_xq_Q14_x3x1 = _mm_shuffle_epi32( xmm_xq_Q14_3210, _MM_SHUFFLE( 0, 3, 2, 1 ) ); + /* equal shift right 4 bytes*/ + xmm_xq_Q14_x7x5 = _mm_shuffle_epi32( xmm_xq_Q14_7654, _MM_SHUFFLE( 0, 3, 2, 1 ) ); + + xmm_xq_Q14_3210 = _mm_mul_epi32( xmm_xq_Q14_3210, xmm_Gain_Q10 ); + xmm_xq_Q14_x3x1 = _mm_mul_epi32( xmm_xq_Q14_x3x1, xmm_Gain_Q10 ); + xmm_xq_Q14_7654 = _mm_mul_epi32( xmm_xq_Q14_7654, xmm_Gain_Q10 ); + xmm_xq_Q14_x7x5 = _mm_mul_epi32( xmm_xq_Q14_x7x5, xmm_Gain_Q10 ); + + xmm_xq_Q14_3210 = _mm_srli_epi64( xmm_xq_Q14_3210, 16 ); + xmm_xq_Q14_x3x1 = _mm_slli_epi64( xmm_xq_Q14_x3x1, 16 ); + xmm_xq_Q14_7654 = _mm_srli_epi64( xmm_xq_Q14_7654, 16 ); + xmm_xq_Q14_x7x5 = _mm_slli_epi64( xmm_xq_Q14_x7x5, 16 ); + + xmm_xq_Q14_3210 = _mm_blend_epi16( xmm_xq_Q14_3210, xmm_xq_Q14_x3x1, 0xCC ); + xmm_xq_Q14_7654 = _mm_blend_epi16( xmm_xq_Q14_7654, xmm_xq_Q14_x7x5, 0xCC ); + + /* silk_RSHIFT_ROUND(xq, 8) */ + xmm_xq_Q14_3210 = _mm_add_epi32( xmm_xq_Q14_3210, xmm_tempa ); + xmm_xq_Q14_7654 = _mm_add_epi32( xmm_xq_Q14_7654, xmm_tempa ); + + xmm_xq_Q14_3210 = _mm_srai_epi32( xmm_xq_Q14_3210, 8 ); + xmm_xq_Q14_7654 = _mm_srai_epi32( xmm_xq_Q14_7654, 8 ); + + /* silk_SAT16 */ + xmm_xq_Q14_3210 = _mm_packs_epi32( xmm_xq_Q14_3210, xmm_xq_Q14_7654 ); + + /* save to xq */ + _mm_storeu_si128( (__m128i *)(&xq[ i ] ), xmm_xq_Q14_3210 ); + } + } + for ( ; i < length; i++) + { + xq[i] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psLPC_Q14[ i ], Gain_Q10 ), 8 ) ); + } + + /* Update LPC synth buffer */ + silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); +} + +static OPUS_INLINE void silk_nsq_scale_states_sse4_1( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + const opus_int32 x_Q3[], /* I input in Q3 */ + opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ + const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ + opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ + opus_int subfr, /* I subframe number */ + const opus_int LTP_scale_Q14, /* I */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ + const opus_int signal_type /* I Signal type */ +) +{ + opus_int i, lag; + opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; + __m128i xmm_inv_gain_Q23, xmm_x_Q3_x2x0, xmm_x_Q3_x3x1; + + lag = pitchL[ subfr ]; + inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); + silk_assert( inv_gain_Q31 != 0 ); + + /* Calculate gain adjustment factor */ + if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { + gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); + } else { + gain_adj_Q16 = (opus_int32)1 << 16; + } + + /* Scale input */ + inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); + + /* prepare inv_gain_Q23 in packed 4 32-bits */ + xmm_inv_gain_Q23 = _mm_set1_epi32(inv_gain_Q23); + + for( i = 0; i < psEncC->subfr_length - 3; i += 4 ) { + xmm_x_Q3_x2x0 = _mm_loadu_si128( (__m128i *)(&(x_Q3[ i ] ) ) ); + + /* equal shift right 4 bytes*/ + xmm_x_Q3_x3x1 = _mm_shuffle_epi32( xmm_x_Q3_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); + + xmm_x_Q3_x2x0 = _mm_mul_epi32( xmm_x_Q3_x2x0, xmm_inv_gain_Q23 ); + xmm_x_Q3_x3x1 = _mm_mul_epi32( xmm_x_Q3_x3x1, xmm_inv_gain_Q23 ); + + xmm_x_Q3_x2x0 = _mm_srli_epi64( xmm_x_Q3_x2x0, 16 ); + xmm_x_Q3_x3x1 = _mm_slli_epi64( xmm_x_Q3_x3x1, 16 ); + + xmm_x_Q3_x2x0 = _mm_blend_epi16( xmm_x_Q3_x2x0, xmm_x_Q3_x3x1, 0xCC ); + + _mm_storeu_si128( (__m128i *)(&(x_sc_Q10[ i ] ) ), xmm_x_Q3_x2x0 ); + } + + for( ; i < psEncC->subfr_length; i++ ) { + x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); + } + + /* Save inverse gain */ + NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; + + /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ + if( NSQ->rewhite_flag ) { + if( subfr == 0 ) { + /* Do LTP downscaling */ + inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); + } + for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { + silk_assert( i < MAX_FRAME_LENGTH ); + sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); + } + } + + /* Adjust for changing gain */ + if( gain_adj_Q16 != (opus_int32)1 << 16 ) { + /* Scale long-term shaping state */ + __m128i xmm_gain_adj_Q16, xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1; + + /* prepare gain_adj_Q16 in packed 4 32-bits */ + xmm_gain_adj_Q16 = _mm_set1_epi32(gain_adj_Q16); + + for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 3; i += 4 ) + { + xmm_sLTP_shp_Q14_x2x0 = _mm_loadu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ) ); + /* equal shift right 4 bytes*/ + xmm_sLTP_shp_Q14_x3x1 = _mm_shuffle_epi32( xmm_sLTP_shp_Q14_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); + + xmm_sLTP_shp_Q14_x2x0 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x2x0, xmm_gain_adj_Q16 ); + xmm_sLTP_shp_Q14_x3x1 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x3x1, xmm_gain_adj_Q16 ); + + xmm_sLTP_shp_Q14_x2x0 = _mm_srli_epi64( xmm_sLTP_shp_Q14_x2x0, 16 ); + xmm_sLTP_shp_Q14_x3x1 = _mm_slli_epi64( xmm_sLTP_shp_Q14_x3x1, 16 ); + + xmm_sLTP_shp_Q14_x2x0 = _mm_blend_epi16( xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1, 0xCC ); + + _mm_storeu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ), xmm_sLTP_shp_Q14_x2x0 ); + } + + for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { + NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); + } + + /* Scale long-term prediction state */ + if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { + for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { + sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); + } + } + + NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); + + /* Scale short-term prediction and shaping states */ + for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { + NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] ); + } + for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { + NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] ); + } + } +} diff --git a/external/opus-1.3.1/silk/x86/SigProc_FIX_sse.h b/external/opus-1.3.1/silk/x86/SigProc_FIX_sse.h new file mode 100644 index 00000000..61efa8da --- /dev/null +++ b/external/opus-1.3.1/silk/x86/SigProc_FIX_sse.h @@ -0,0 +1,94 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef SIGPROC_FIX_SSE_H +#define SIGPROC_FIX_SSE_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#if defined(OPUS_X86_MAY_HAVE_SSE4_1) +void silk_burg_modified_sse4_1( + opus_int32 *res_nrg, /* O Residual energy */ + opus_int *res_nrg_Q, /* O Residual energy Q value */ + opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ + const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ + const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ + const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ + const opus_int nb_subfr, /* I Number of subframes stacked in x */ + const opus_int D, /* I Order */ + int arch /* I Run-time architecture */ +); + +#if defined(OPUS_X86_PRESUME_SSE4_1) +#define silk_burg_modified(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch) \ + ((void)(arch), silk_burg_modified_sse4_1(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch)) + +#else + +extern void (*const SILK_BURG_MODIFIED_IMPL[OPUS_ARCHMASK + 1])( + opus_int32 *res_nrg, /* O Residual energy */ + opus_int *res_nrg_Q, /* O Residual energy Q value */ + opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ + const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ + const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ + const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ + const opus_int nb_subfr, /* I Number of subframes stacked in x */ + const opus_int D, /* I Order */ + int arch /* I Run-time architecture */); + +# define silk_burg_modified(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch) \ + ((*SILK_BURG_MODIFIED_IMPL[(arch) & OPUS_ARCHMASK])(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch)) + +#endif + +opus_int64 silk_inner_prod16_aligned_64_sse4_1( + const opus_int16 *inVec1, + const opus_int16 *inVec2, + const opus_int len +); + + +#if defined(OPUS_X86_PRESUME_SSE4_1) + +#define silk_inner_prod16_aligned_64(inVec1, inVec2, len, arch) \ + ((void)(arch),silk_inner_prod16_aligned_64_sse4_1(inVec1, inVec2, len)) + +#else + +extern opus_int64 (*const SILK_INNER_PROD16_ALIGNED_64_IMPL[OPUS_ARCHMASK + 1])( + const opus_int16 *inVec1, + const opus_int16 *inVec2, + const opus_int len); + +# define silk_inner_prod16_aligned_64(inVec1, inVec2, len, arch) \ + ((*SILK_INNER_PROD16_ALIGNED_64_IMPL[(arch) & OPUS_ARCHMASK])(inVec1, inVec2, len)) + +#endif +#endif +#endif diff --git a/external/opus-1.3.1/silk/x86/VAD_sse4_1.c b/external/opus-1.3.1/silk/x86/VAD_sse4_1.c new file mode 100644 index 00000000..d02ddf4a --- /dev/null +++ b/external/opus-1.3.1/silk/x86/VAD_sse4_1.c @@ -0,0 +1,277 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "main.h" +#include "stack_alloc.h" + +/* Weighting factors for tilt measure */ +static const opus_int32 tiltWeights[ VAD_N_BANDS ] = { 30000, 6000, -12000, -12000 }; + +/***************************************/ +/* Get the speech activity level in Q8 */ +/***************************************/ +opus_int silk_VAD_GetSA_Q8_sse4_1( /* O Return value, 0 if success */ + silk_encoder_state *psEncC, /* I/O Encoder state */ + const opus_int16 pIn[] /* I PCM input */ +) +{ + opus_int SA_Q15, pSNR_dB_Q7, input_tilt; + opus_int decimated_framelength1, decimated_framelength2; + opus_int decimated_framelength; + opus_int dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s; + opus_int32 sumSquared, smooth_coef_Q16; + opus_int16 HPstateTmp; + VARDECL( opus_int16, X ); + opus_int32 Xnrg[ VAD_N_BANDS ]; + opus_int32 NrgToNoiseRatio_Q8[ VAD_N_BANDS ]; + opus_int32 speech_nrg, x_tmp; + opus_int X_offset[ VAD_N_BANDS ]; + opus_int ret = 0; + silk_VAD_state *psSilk_VAD = &psEncC->sVAD; + + SAVE_STACK; + + /* Safety checks */ + silk_assert( VAD_N_BANDS == 4 ); + celt_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); + celt_assert( psEncC->frame_length <= 512 ); + celt_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); + + /***********************/ + /* Filter and Decimate */ + /***********************/ + decimated_framelength1 = silk_RSHIFT( psEncC->frame_length, 1 ); + decimated_framelength2 = silk_RSHIFT( psEncC->frame_length, 2 ); + decimated_framelength = silk_RSHIFT( psEncC->frame_length, 3 ); + /* Decimate into 4 bands: + 0 L 3L L 3L 5L + - -- - -- -- + 8 8 2 4 4 + + [0-1 kHz| temp. |1-2 kHz| 2-4 kHz | 4-8 kHz | + + They're arranged to allow the minimal ( frame_length / 4 ) extra + scratch space during the downsampling process */ + X_offset[ 0 ] = 0; + X_offset[ 1 ] = decimated_framelength + decimated_framelength2; + X_offset[ 2 ] = X_offset[ 1 ] + decimated_framelength; + X_offset[ 3 ] = X_offset[ 2 ] + decimated_framelength2; + ALLOC( X, X_offset[ 3 ] + decimated_framelength1, opus_int16 ); + + /* 0-8 kHz to 0-4 kHz and 4-8 kHz */ + silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ], + X, &X[ X_offset[ 3 ] ], psEncC->frame_length ); + + /* 0-4 kHz to 0-2 kHz and 2-4 kHz */ + silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState1[ 0 ], + X, &X[ X_offset[ 2 ] ], decimated_framelength1 ); + + /* 0-2 kHz to 0-1 kHz and 1-2 kHz */ + silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState2[ 0 ], + X, &X[ X_offset[ 1 ] ], decimated_framelength2 ); + + /*********************************************/ + /* HP filter on lowest band (differentiator) */ + /*********************************************/ + X[ decimated_framelength - 1 ] = silk_RSHIFT( X[ decimated_framelength - 1 ], 1 ); + HPstateTmp = X[ decimated_framelength - 1 ]; + for( i = decimated_framelength - 1; i > 0; i-- ) { + X[ i - 1 ] = silk_RSHIFT( X[ i - 1 ], 1 ); + X[ i ] -= X[ i - 1 ]; + } + X[ 0 ] -= psSilk_VAD->HPstate; + psSilk_VAD->HPstate = HPstateTmp; + + /*************************************/ + /* Calculate the energy in each band */ + /*************************************/ + for( b = 0; b < VAD_N_BANDS; b++ ) { + /* Find the decimated framelength in the non-uniformly divided bands */ + decimated_framelength = silk_RSHIFT( psEncC->frame_length, silk_min_int( VAD_N_BANDS - b, VAD_N_BANDS - 1 ) ); + + /* Split length into subframe lengths */ + dec_subframe_length = silk_RSHIFT( decimated_framelength, VAD_INTERNAL_SUBFRAMES_LOG2 ); + dec_subframe_offset = 0; + + /* Compute energy per sub-frame */ + /* initialize with summed energy of last subframe */ + Xnrg[ b ] = psSilk_VAD->XnrgSubfr[ b ]; + for( s = 0; s < VAD_INTERNAL_SUBFRAMES; s++ ) { + __m128i xmm_X, xmm_acc; + sumSquared = 0; + + xmm_acc = _mm_setzero_si128(); + + for( i = 0; i < dec_subframe_length - 7; i += 8 ) + { + xmm_X = _mm_loadu_si128( (__m128i *)&(X[ X_offset[ b ] + i + dec_subframe_offset ] ) ); + xmm_X = _mm_srai_epi16( xmm_X, 3 ); + xmm_X = _mm_madd_epi16( xmm_X, xmm_X ); + xmm_acc = _mm_add_epi32( xmm_acc, xmm_X ); + } + + xmm_acc = _mm_add_epi32( xmm_acc, _mm_unpackhi_epi64( xmm_acc, xmm_acc ) ); + xmm_acc = _mm_add_epi32( xmm_acc, _mm_shufflelo_epi16( xmm_acc, 0x0E ) ); + + sumSquared += _mm_cvtsi128_si32( xmm_acc ); + + for( ; i < dec_subframe_length; i++ ) { + /* The energy will be less than dec_subframe_length * ( silk_int16_MIN / 8 ) ^ 2. */ + /* Therefore we can accumulate with no risk of overflow (unless dec_subframe_length > 128) */ + x_tmp = silk_RSHIFT( + X[ X_offset[ b ] + i + dec_subframe_offset ], 3 ); + sumSquared = silk_SMLABB( sumSquared, x_tmp, x_tmp ); + + /* Safety check */ + silk_assert( sumSquared >= 0 ); + } + + /* Add/saturate summed energy of current subframe */ + if( s < VAD_INTERNAL_SUBFRAMES - 1 ) { + Xnrg[ b ] = silk_ADD_POS_SAT32( Xnrg[ b ], sumSquared ); + } else { + /* Look-ahead subframe */ + Xnrg[ b ] = silk_ADD_POS_SAT32( Xnrg[ b ], silk_RSHIFT( sumSquared, 1 ) ); + } + + dec_subframe_offset += dec_subframe_length; + } + psSilk_VAD->XnrgSubfr[ b ] = sumSquared; + } + + /********************/ + /* Noise estimation */ + /********************/ + silk_VAD_GetNoiseLevels( &Xnrg[ 0 ], psSilk_VAD ); + + /***********************************************/ + /* Signal-plus-noise to noise ratio estimation */ + /***********************************************/ + sumSquared = 0; + input_tilt = 0; + for( b = 0; b < VAD_N_BANDS; b++ ) { + speech_nrg = Xnrg[ b ] - psSilk_VAD->NL[ b ]; + if( speech_nrg > 0 ) { + /* Divide, with sufficient resolution */ + if( ( Xnrg[ b ] & 0xFF800000 ) == 0 ) { + NrgToNoiseRatio_Q8[ b ] = silk_DIV32( silk_LSHIFT( Xnrg[ b ], 8 ), psSilk_VAD->NL[ b ] + 1 ); + } else { + NrgToNoiseRatio_Q8[ b ] = silk_DIV32( Xnrg[ b ], silk_RSHIFT( psSilk_VAD->NL[ b ], 8 ) + 1 ); + } + + /* Convert to log domain */ + SNR_Q7 = silk_lin2log( NrgToNoiseRatio_Q8[ b ] ) - 8 * 128; + + /* Sum-of-squares */ + sumSquared = silk_SMLABB( sumSquared, SNR_Q7, SNR_Q7 ); /* Q14 */ + + /* Tilt measure */ + if( speech_nrg < ( (opus_int32)1 << 20 ) ) { + /* Scale down SNR value for small subband speech energies */ + SNR_Q7 = silk_SMULWB( silk_LSHIFT( silk_SQRT_APPROX( speech_nrg ), 6 ), SNR_Q7 ); + } + input_tilt = silk_SMLAWB( input_tilt, tiltWeights[ b ], SNR_Q7 ); + } else { + NrgToNoiseRatio_Q8[ b ] = 256; + } + } + + /* Mean-of-squares */ + sumSquared = silk_DIV32_16( sumSquared, VAD_N_BANDS ); /* Q14 */ + + /* Root-mean-square approximation, scale to dBs, and write to output pointer */ + pSNR_dB_Q7 = (opus_int16)( 3 * silk_SQRT_APPROX( sumSquared ) ); /* Q7 */ + + /*********************************/ + /* Speech Probability Estimation */ + /*********************************/ + SA_Q15 = silk_sigm_Q15( silk_SMULWB( VAD_SNR_FACTOR_Q16, pSNR_dB_Q7 ) - VAD_NEGATIVE_OFFSET_Q5 ); + + /**************************/ + /* Frequency Tilt Measure */ + /**************************/ + psEncC->input_tilt_Q15 = silk_LSHIFT( silk_sigm_Q15( input_tilt ) - 16384, 1 ); + + /**************************************************/ + /* Scale the sigmoid output based on power levels */ + /**************************************************/ + speech_nrg = 0; + for( b = 0; b < VAD_N_BANDS; b++ ) { + /* Accumulate signal-without-noise energies, higher frequency bands have more weight */ + speech_nrg += ( b + 1 ) * silk_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 ); + } + + /* Power scaling */ + if( speech_nrg <= 0 ) { + SA_Q15 = silk_RSHIFT( SA_Q15, 1 ); + } else if( speech_nrg < 32768 ) { + if( psEncC->frame_length == 10 * psEncC->fs_kHz ) { + speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 16 ); + } else { + speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 15 ); + } + + /* square-root */ + speech_nrg = silk_SQRT_APPROX( speech_nrg ); + SA_Q15 = silk_SMULWB( 32768 + speech_nrg, SA_Q15 ); + } + + /* Copy the resulting speech activity in Q8 */ + psEncC->speech_activity_Q8 = silk_min_int( silk_RSHIFT( SA_Q15, 7 ), silk_uint8_MAX ); + + /***********************************/ + /* Energy Level and SNR estimation */ + /***********************************/ + /* Smoothing coefficient */ + smooth_coef_Q16 = silk_SMULWB( VAD_SNR_SMOOTH_COEF_Q18, silk_SMULWB( (opus_int32)SA_Q15, SA_Q15 ) ); + + if( psEncC->frame_length == 10 * psEncC->fs_kHz ) { + smooth_coef_Q16 >>= 1; + } + + for( b = 0; b < VAD_N_BANDS; b++ ) { + /* compute smoothed energy-to-noise ratio per band */ + psSilk_VAD->NrgRatioSmth_Q8[ b ] = silk_SMLAWB( psSilk_VAD->NrgRatioSmth_Q8[ b ], + NrgToNoiseRatio_Q8[ b ] - psSilk_VAD->NrgRatioSmth_Q8[ b ], smooth_coef_Q16 ); + + /* signal to noise ratio in dB per band */ + SNR_Q7 = 3 * ( silk_lin2log( psSilk_VAD->NrgRatioSmth_Q8[b] ) - 8 * 128 ); + /* quality = sigmoid( 0.25 * ( SNR_dB - 16 ) ); */ + psEncC->input_quality_bands_Q15[ b ] = silk_sigm_Q15( silk_RSHIFT( SNR_Q7 - 16 * 128, 4 ) ); + } + + RESTORE_STACK; + return( ret ); +} diff --git a/external/opus-1.3.1/silk/x86/VQ_WMat_EC_sse4_1.c b/external/opus-1.3.1/silk/x86/VQ_WMat_EC_sse4_1.c new file mode 100644 index 00000000..74d6c6d0 --- /dev/null +++ b/external/opus-1.3.1/silk/x86/VQ_WMat_EC_sse4_1.c @@ -0,0 +1,142 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include "main.h" +#include "celt/x86/x86cpu.h" + +/* Entropy constrained matrix-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */ +void silk_VQ_WMat_EC_sse4_1( + opus_int8 *ind, /* O index of best codebook vector */ + opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ + opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ + const opus_int16 *in_Q14, /* I input vector to be quantized */ + const opus_int32 *W_Q18, /* I weighting matrix */ + const opus_int8 *cb_Q7, /* I codebook */ + const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ + const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ + const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ + const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + opus_int L /* I number of vectors in codebook */ +) +{ + opus_int k, gain_tmp_Q7; + const opus_int8 *cb_row_Q7; + opus_int16 diff_Q14[ 5 ]; + opus_int32 sum1_Q14, sum2_Q16; + + __m128i C_tmp1, C_tmp2, C_tmp3, C_tmp4, C_tmp5; + /* Loop over codebook */ + *rate_dist_Q14 = silk_int32_MAX; + cb_row_Q7 = cb_Q7; + for( k = 0; k < L; k++ ) { + gain_tmp_Q7 = cb_gain_Q7[k]; + + diff_Q14[ 0 ] = in_Q14[ 0 ] - silk_LSHIFT( cb_row_Q7[ 0 ], 7 ); + + C_tmp1 = OP_CVTEPI16_EPI32_M64( &in_Q14[ 1 ] ); + C_tmp2 = OP_CVTEPI8_EPI32_M32( &cb_row_Q7[ 1 ] ); + C_tmp2 = _mm_slli_epi32( C_tmp2, 7 ); + C_tmp1 = _mm_sub_epi32( C_tmp1, C_tmp2 ); + + diff_Q14[ 1 ] = _mm_extract_epi16( C_tmp1, 0 ); + diff_Q14[ 2 ] = _mm_extract_epi16( C_tmp1, 2 ); + diff_Q14[ 3 ] = _mm_extract_epi16( C_tmp1, 4 ); + diff_Q14[ 4 ] = _mm_extract_epi16( C_tmp1, 6 ); + + /* Weighted rate */ + sum1_Q14 = silk_SMULBB( mu_Q9, cl_Q5[ k ] ); + + /* Penalty for too large gain */ + sum1_Q14 = silk_ADD_LSHIFT32( sum1_Q14, silk_max( silk_SUB32( gain_tmp_Q7, max_gain_Q7 ), 0 ), 10 ); + + silk_assert( sum1_Q14 >= 0 ); + + /* first row of W_Q18 */ + C_tmp3 = _mm_loadu_si128( (__m128i *)(&W_Q18[ 1 ] ) ); + C_tmp4 = _mm_mul_epi32( C_tmp3, C_tmp1 ); + C_tmp4 = _mm_srli_si128( C_tmp4, 2 ); + + C_tmp1 = _mm_shuffle_epi32( C_tmp1, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* shift right 4 bytes */ + C_tmp3 = _mm_shuffle_epi32( C_tmp3, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* shift right 4 bytes */ + + C_tmp5 = _mm_mul_epi32( C_tmp3, C_tmp1 ); + C_tmp5 = _mm_srli_si128( C_tmp5, 2 ); + + C_tmp5 = _mm_add_epi32( C_tmp4, C_tmp5 ); + C_tmp5 = _mm_slli_epi32( C_tmp5, 1 ); + + C_tmp5 = _mm_add_epi32( C_tmp5, _mm_shuffle_epi32( C_tmp5, _MM_SHUFFLE( 0, 0, 0, 2 ) ) ); + sum2_Q16 = _mm_cvtsi128_si32( C_tmp5 ); + + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 0 ], diff_Q14[ 0 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 0 ] ); + + /* second row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 7 ], diff_Q14[ 2 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 8 ], diff_Q14[ 3 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 9 ], diff_Q14[ 4 ] ); + sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 6 ], diff_Q14[ 1 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 1 ] ); + + /* third row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 13 ], diff_Q14[ 3 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 14 ], diff_Q14[ 4 ] ); + sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 12 ], diff_Q14[ 2 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 2 ] ); + + /* fourth row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 19 ], diff_Q14[ 4 ] ); + sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 18 ], diff_Q14[ 3 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 3 ] ); + + /* last row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 24 ], diff_Q14[ 4 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 4 ] ); + + silk_assert( sum1_Q14 >= 0 ); + + /* find best */ + if( sum1_Q14 < *rate_dist_Q14 ) { + *rate_dist_Q14 = sum1_Q14; + *ind = (opus_int8)k; + *gain_Q7 = gain_tmp_Q7; + } + + /* Go to next cbk vector */ + cb_row_Q7 += LTP_ORDER; + } +} diff --git a/external/opus-1.3.1/silk/x86/main_sse.h b/external/opus-1.3.1/silk/x86/main_sse.h new file mode 100644 index 00000000..2f15d448 --- /dev/null +++ b/external/opus-1.3.1/silk/x86/main_sse.h @@ -0,0 +1,248 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef MAIN_SSE_H +#define MAIN_SSE_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +# if defined(OPUS_X86_MAY_HAVE_SSE4_1) + +#if 0 /* FIXME: SSE disabled until silk_VQ_WMat_EC_sse4_1() gets updated. */ +# define OVERRIDE_silk_VQ_WMat_EC + +void silk_VQ_WMat_EC_sse4_1( + opus_int8 *ind, /* O index of best codebook vector */ + opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ + opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ + const opus_int16 *in_Q14, /* I input vector to be quantized */ + const opus_int32 *W_Q18, /* I weighting matrix */ + const opus_int8 *cb_Q7, /* I codebook */ + const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ + const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ + const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ + const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + opus_int L /* I number of vectors in codebook */ +); + +#if defined OPUS_X86_PRESUME_SSE4_1 + +#define silk_VQ_WMat_EC(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ + mu_Q9, max_gain_Q7, L, arch) \ + ((void)(arch),silk_VQ_WMat_EC_sse4_1(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ + mu_Q9, max_gain_Q7, L)) + +#else + +extern void (*const SILK_VQ_WMAT_EC_IMPL[OPUS_ARCHMASK + 1])( + opus_int8 *ind, /* O index of best codebook vector */ + opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ + opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ + const opus_int16 *in_Q14, /* I input vector to be quantized */ + const opus_int32 *W_Q18, /* I weighting matrix */ + const opus_int8 *cb_Q7, /* I codebook */ + const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ + const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ + const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ + const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + opus_int L /* I number of vectors in codebook */ +); + +# define silk_VQ_WMat_EC(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ + mu_Q9, max_gain_Q7, L, arch) \ + ((*SILK_VQ_WMAT_EC_IMPL[(arch) & OPUS_ARCHMASK])(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ + mu_Q9, max_gain_Q7, L)) + +#endif +#endif + +#if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ +# define OVERRIDE_silk_NSQ + +void silk_NSQ_sse4_1( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +); + +#if defined OPUS_X86_PRESUME_SSE4_1 + +#define silk_NSQ(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ + ((void)(arch),silk_NSQ_sse4_1(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) + +#else + +extern void (*const SILK_NSQ_IMPL[OPUS_ARCHMASK + 1])( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +); + +# define silk_NSQ(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ + ((*SILK_NSQ_IMPL[(arch) & OPUS_ARCHMASK])(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) + +#endif + +# define OVERRIDE_silk_NSQ_del_dec + +void silk_NSQ_del_dec_sse4_1( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +); + +#if defined OPUS_X86_PRESUME_SSE4_1 + +#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ + ((void)(arch),silk_NSQ_del_dec_sse4_1(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) + +#else + +extern void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +); + +# define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ + ((*SILK_NSQ_DEL_DEC_IMPL[(arch) & OPUS_ARCHMASK])(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ + HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) + +#endif +#endif + +void silk_noise_shape_quantizer( + silk_nsq_state *NSQ, /* I/O NSQ state */ + opus_int signalType, /* I Signal type */ + const opus_int32 x_sc_Q10[], /* I */ + opus_int8 pulses[], /* O */ + opus_int16 xq[], /* O */ + opus_int32 sLTP_Q15[], /* I/O LTP state */ + const opus_int16 a_Q12[], /* I Short term prediction coefs */ + const opus_int16 b_Q14[], /* I Long term prediction coefs */ + const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ + opus_int lag, /* I Pitch lag */ + opus_int32 HarmShapeFIRPacked_Q14, /* I */ + opus_int Tilt_Q14, /* I Spectral tilt */ + opus_int32 LF_shp_Q14, /* I */ + opus_int32 Gain_Q16, /* I */ + opus_int Lambda_Q10, /* I */ + opus_int offset_Q10, /* I */ + opus_int length, /* I Input length */ + opus_int shapingLPCOrder, /* I Noise shaping AR filter order */ + opus_int predictLPCOrder, /* I Prediction filter order */ + int arch /* I Architecture */ +); + +/**************************/ +/* Noise level estimation */ +/**************************/ +void silk_VAD_GetNoiseLevels( + const opus_int32 pX[ VAD_N_BANDS ], /* I subband energies */ + silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ +); + +# define OVERRIDE_silk_VAD_GetSA_Q8 + +opus_int silk_VAD_GetSA_Q8_sse4_1( + silk_encoder_state *psEnC, + const opus_int16 pIn[] +); + +#if defined(OPUS_X86_PRESUME_SSE4_1) +#define silk_VAD_GetSA_Q8(psEnC, pIn, arch) ((void)(arch),silk_VAD_GetSA_Q8_sse4_1(psEnC, pIn)) + +#else + +# define silk_VAD_GetSA_Q8(psEnC, pIn, arch) \ + ((*SILK_VAD_GETSA_Q8_IMPL[(arch) & OPUS_ARCHMASK])(psEnC, pIn)) + +extern opus_int (*const SILK_VAD_GETSA_Q8_IMPL[OPUS_ARCHMASK + 1])( + silk_encoder_state *psEnC, + const opus_int16 pIn[]); + +#endif + +# endif +#endif diff --git a/external/opus-1.3.1/silk/x86/x86_silk_map.c b/external/opus-1.3.1/silk/x86/x86_silk_map.c new file mode 100644 index 00000000..32dcc3ca --- /dev/null +++ b/external/opus-1.3.1/silk/x86/x86_silk_map.c @@ -0,0 +1,164 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if defined(HAVE_CONFIG_H) +#include "config.h" +#endif + +#include "celt/x86/x86cpu.h" +#include "structs.h" +#include "SigProc_FIX.h" +#include "pitch.h" +#include "main.h" + +#if !defined(OPUS_X86_PRESUME_SSE4_1) + +#if defined(FIXED_POINT) + +#include "fixed/main_FIX.h" + +opus_int64 (*const SILK_INNER_PROD16_ALIGNED_64_IMPL[ OPUS_ARCHMASK + 1 ] )( + const opus_int16 *inVec1, + const opus_int16 *inVec2, + const opus_int len +) = { + silk_inner_prod16_aligned_64_c, /* non-sse */ + silk_inner_prod16_aligned_64_c, + silk_inner_prod16_aligned_64_c, + MAY_HAVE_SSE4_1( silk_inner_prod16_aligned_64 ), /* sse4.1 */ + MAY_HAVE_SSE4_1( silk_inner_prod16_aligned_64 ) /* avx */ +}; + +#endif + +opus_int (*const SILK_VAD_GETSA_Q8_IMPL[ OPUS_ARCHMASK + 1 ] )( + silk_encoder_state *psEncC, + const opus_int16 pIn[] +) = { + silk_VAD_GetSA_Q8_c, /* non-sse */ + silk_VAD_GetSA_Q8_c, + silk_VAD_GetSA_Q8_c, + MAY_HAVE_SSE4_1( silk_VAD_GetSA_Q8 ), /* sse4.1 */ + MAY_HAVE_SSE4_1( silk_VAD_GetSA_Q8 ) /* avx */ +}; + +#if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ +void (*const SILK_NSQ_IMPL[ OPUS_ARCHMASK + 1 ] )( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +) = { + silk_NSQ_c, /* non-sse */ + silk_NSQ_c, + silk_NSQ_c, + MAY_HAVE_SSE4_1( silk_NSQ ), /* sse4.1 */ + MAY_HAVE_SSE4_1( silk_NSQ ) /* avx */ +}; +#endif + +#if 0 /* FIXME: SSE disabled until silk_VQ_WMat_EC_sse4_1() gets updated. */ +void (*const SILK_VQ_WMAT_EC_IMPL[ OPUS_ARCHMASK + 1 ] )( + opus_int8 *ind, /* O index of best codebook vector */ + opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ + opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ + const opus_int16 *in_Q14, /* I input vector to be quantized */ + const opus_int32 *W_Q18, /* I weighting matrix */ + const opus_int8 *cb_Q7, /* I codebook */ + const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ + const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ + const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ + const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ + opus_int L /* I number of vectors in codebook */ +) = { + silk_VQ_WMat_EC_c, /* non-sse */ + silk_VQ_WMat_EC_c, + silk_VQ_WMat_EC_c, + MAY_HAVE_SSE4_1( silk_VQ_WMat_EC ), /* sse4.1 */ + MAY_HAVE_SSE4_1( silk_VQ_WMat_EC ) /* avx */ +}; +#endif + +#if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ +void (*const SILK_NSQ_DEL_DEC_IMPL[ OPUS_ARCHMASK + 1 ] )( + const silk_encoder_state *psEncC, /* I Encoder State */ + silk_nsq_state *NSQ, /* I/O NSQ state */ + SideInfoIndices *psIndices, /* I/O Quantization Indices */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ + opus_int8 pulses[], /* O Quantized pulse signal */ + const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ + const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ + const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ + const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ + const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ + const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ + const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ + const opus_int LTP_scale_Q14 /* I LTP state scaling */ +) = { + silk_NSQ_del_dec_c, /* non-sse */ + silk_NSQ_del_dec_c, + silk_NSQ_del_dec_c, + MAY_HAVE_SSE4_1( silk_NSQ_del_dec ), /* sse4.1 */ + MAY_HAVE_SSE4_1( silk_NSQ_del_dec ) /* avx */ +}; +#endif + +#if defined(FIXED_POINT) + +void (*const SILK_BURG_MODIFIED_IMPL[ OPUS_ARCHMASK + 1 ] )( + opus_int32 *res_nrg, /* O Residual energy */ + opus_int *res_nrg_Q, /* O Residual energy Q value */ + opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ + const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ + const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ + const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ + const opus_int nb_subfr, /* I Number of subframes stacked in x */ + const opus_int D, /* I Order */ + int arch /* I Run-time architecture */ +) = { + silk_burg_modified_c, /* non-sse */ + silk_burg_modified_c, + silk_burg_modified_c, + MAY_HAVE_SSE4_1( silk_burg_modified ), /* sse4.1 */ + MAY_HAVE_SSE4_1( silk_burg_modified ) /* avx */ +}; + +#endif +#endif diff --git a/external/opus-1.3.1/silk_headers.mk b/external/opus-1.3.1/silk_headers.mk new file mode 100644 index 00000000..2588067c --- /dev/null +++ b/external/opus-1.3.1/silk_headers.mk @@ -0,0 +1,44 @@ +SILK_HEAD = \ +silk/debug.h \ +silk/control.h \ +silk/errors.h \ +silk/API.h \ +silk/typedef.h \ +silk/define.h \ +silk/main.h \ +silk/x86/main_sse.h \ +silk/PLC.h \ +silk/structs.h \ +silk/tables.h \ +silk/tuning_parameters.h \ +silk/Inlines.h \ +silk/MacroCount.h \ +silk/MacroDebug.h \ +silk/macros.h \ +silk/NSQ.h \ +silk/pitch_est_defines.h \ +silk/resampler_private.h \ +silk/resampler_rom.h \ +silk/resampler_structs.h \ +silk/SigProc_FIX.h \ +silk/x86/SigProc_FIX_sse.h \ +silk/arm/biquad_alt_arm.h \ +silk/arm/LPC_inv_pred_gain_arm.h \ +silk/arm/macros_armv4.h \ +silk/arm/macros_armv5e.h \ +silk/arm/macros_arm64.h \ +silk/arm/SigProc_FIX_armv4.h \ +silk/arm/SigProc_FIX_armv5e.h \ +silk/arm/NSQ_del_dec_arm.h \ +silk/arm/NSQ_neon.h \ +silk/fixed/main_FIX.h \ +silk/fixed/structs_FIX.h \ +silk/fixed/arm/warped_autocorrelation_FIX_arm.h \ +silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h \ +silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h \ +silk/float/main_FLP.h \ +silk/float/structs_FLP.h \ +silk/float/SigProc_FLP.h \ +silk/mips/macros_mipsr1.h \ +silk/mips/NSQ_del_dec_mipsr1.h \ +silk/mips/sigproc_fix_mipsr1.h diff --git a/external/opus-1.0.3/silk_sources.mk b/external/opus-1.3.1/silk_sources.mk similarity index 84% rename from external/opus-1.0.3/silk_sources.mk rename to external/opus-1.3.1/silk_sources.mk index 62290295..d2666e66 100644 --- a/external/opus-1.0.3/silk_sources.mk +++ b/external/opus-1.3.1/silk_sources.mk @@ -9,8 +9,15 @@ silk/decode_indices.c \ silk/decode_pulses.c \ silk/decoder_set_fs.c \ silk/dec_API.c \ +silk/enc_API.c \ +silk/encode_indices.c \ +silk/encode_pulses.c \ silk/gain_quant.c \ +silk/interpolate.c \ +silk/LP_variable_cutoff.c \ silk/NLSF_decode.c \ +silk/NSQ.c \ +silk/NSQ_del_dec.c \ silk/PLC.c \ silk/shell_coder.c \ silk/tables_gain.c \ @@ -20,8 +27,25 @@ silk/tables_NLSF_CB_WB.c \ silk/tables_other.c \ silk/tables_pitch_lag.c \ silk/tables_pulses_per_block.c \ +silk/VAD.c \ +silk/control_audio_bandwidth.c \ +silk/quant_LTP_gains.c \ +silk/VQ_WMat_EC.c \ +silk/HP_variable_cutoff.c \ +silk/NLSF_encode.c \ +silk/NLSF_VQ.c \ silk/NLSF_unpack.c \ +silk/NLSF_del_dec_quant.c \ +silk/process_NLSFs.c \ +silk/stereo_LR_to_MS.c \ silk/stereo_MS_to_LR.c \ +silk/check_control_input.c \ +silk/control_SNR.c \ +silk/init_encoder.c \ +silk/control_codec.c \ +silk/A2NLSF.c \ +silk/ana_filt_bank_1.c \ +silk/biquad_alt.c \ silk/bwexpander_32.c \ silk/bwexpander.c \ silk/debug.c \ @@ -37,46 +61,35 @@ silk/NLSF_stabilize.c \ silk/NLSF_VQ_weights_laroia.c \ silk/pitch_est_tables.c \ silk/resampler.c \ +silk/resampler_down2_3.c \ +silk/resampler_down2.c \ silk/resampler_private_AR2.c \ silk/resampler_private_down_FIR.c \ silk/resampler_private_IIR_FIR.c \ silk/resampler_private_up2_HQ.c \ silk/resampler_rom.c \ +silk/sigm_Q15.c \ silk/sort.c \ silk/sum_sqr_shift.c \ -silk/stereo_decode_pred.c - -SILK_SOURCES_ENC = \ -silk/enc_API.c \ -silk/encode_indices.c \ -silk/encode_pulses.c \ -silk/interpolate.c \ -silk/LP_variable_cutoff.c \ -silk/NSQ.c \ -silk/NSQ_del_dec.c \ -silk/VAD.c \ -silk/control_audio_bandwidth.c \ -silk/quant_LTP_gains.c \ -silk/VQ_WMat_EC.c \ -silk/HP_variable_cutoff.c \ -silk/NLSF_encode.c \ -silk/NLSF_VQ.c \ -silk/NLSF_del_dec_quant.c \ -silk/process_NLSFs.c \ -silk/stereo_LR_to_MS.c \ -silk/check_control_input.c \ -silk/control_SNR.c \ -silk/init_encoder.c \ -silk/control_codec.c \ -silk/A2NLSF.c \ -silk/ana_filt_bank_1.c \ -silk/biquad_alt.c \ -silk/resampler_down2_3.c \ -silk/resampler_down2.c \ -silk/sigm_Q15.c \ +silk/stereo_decode_pred.c \ silk/stereo_encode_pred.c \ silk/stereo_find_predictor.c \ -silk/stereo_quant_pred.c +silk/stereo_quant_pred.c \ +silk/LPC_fit.c + +SILK_SOURCES_SSE4_1 = \ +silk/x86/NSQ_sse4_1.c \ +silk/x86/NSQ_del_dec_sse4_1.c \ +silk/x86/x86_silk_map.c \ +silk/x86/VAD_sse4_1.c \ +silk/x86/VQ_WMat_EC_sse4_1.c + +SILK_SOURCES_ARM_NEON_INTR = \ +silk/arm/arm_silk_map.c \ +silk/arm/biquad_alt_neon_intr.c \ +silk/arm/LPC_inv_pred_gain_neon_intr.c \ +silk/arm/NSQ_del_dec_neon_intr.c \ +silk/arm/NSQ_neon.c SILK_SOURCES_FIXED = \ silk/fixed/LTP_analysis_filter_FIX.c \ @@ -88,12 +101,10 @@ silk/fixed/find_LTP_FIX.c \ silk/fixed/find_pitch_lags_FIX.c \ silk/fixed/find_pred_coefs_FIX.c \ silk/fixed/noise_shape_analysis_FIX.c \ -silk/fixed/prefilter_FIX.c \ silk/fixed/process_gains_FIX.c \ silk/fixed/regularize_correlations_FIX.c \ silk/fixed/residual_energy16_FIX.c \ silk/fixed/residual_energy_FIX.c \ -silk/fixed/solve_LS_FIX.c \ silk/fixed/warped_autocorrelation_FIX.c \ silk/fixed/apply_sine_window_FIX.c \ silk/fixed/autocorr_FIX.c \ @@ -105,6 +116,13 @@ silk/fixed/vector_ops_FIX.c \ silk/fixed/schur64_FIX.c \ silk/fixed/schur_FIX.c +SILK_SOURCES_FIXED_SSE4_1 = \ +silk/fixed/x86/vector_ops_FIX_sse4_1.c \ +silk/fixed/x86/burg_modified_FIX_sse4_1.c + +SILK_SOURCES_FIXED_ARM_NEON_INTR = \ +silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c + SILK_SOURCES_FLOAT = \ silk/float/apply_sine_window_FLP.c \ silk/float/corrMatrix_FLP.c \ @@ -117,11 +135,9 @@ silk/float/LPC_analysis_filter_FLP.c \ silk/float/LTP_analysis_filter_FLP.c \ silk/float/LTP_scale_ctrl_FLP.c \ silk/float/noise_shape_analysis_FLP.c \ -silk/float/prefilter_FLP.c \ silk/float/process_gains_FLP.c \ silk/float/regularize_correlations_FLP.c \ silk/float/residual_energy_FLP.c \ -silk/float/solve_LS_FLP.c \ silk/float/warped_autocorrelation_FLP.c \ silk/float/wrappers_FLP.c \ silk/float/autocorrelation_FLP.c \ @@ -130,7 +146,6 @@ silk/float/bwexpander_FLP.c \ silk/float/energy_FLP.c \ silk/float/inner_product_FLP.c \ silk/float/k2a_FLP.c \ -silk/float/levinsondurbin_FLP.c \ silk/float/LPC_inv_pred_gain_FLP.c \ silk/float/pitch_analysis_core_FLP.c \ silk/float/scale_copy_vector_FLP.c \ diff --git a/external/opus-1.3.1/src/analysis.c b/external/opus-1.3.1/src/analysis.c new file mode 100644 index 00000000..cb46dec5 --- /dev/null +++ b/external/opus-1.3.1/src/analysis.c @@ -0,0 +1,981 @@ +/* Copyright (c) 2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define ANALYSIS_C + +#include + +#include "mathops.h" +#include "kiss_fft.h" +#include "celt.h" +#include "modes.h" +#include "arch.h" +#include "quant_bands.h" +#include "analysis.h" +#include "mlp.h" +#include "stack_alloc.h" +#include "float_cast.h" + +#ifndef M_PI +#define M_PI 3.141592653 +#endif + +#ifndef DISABLE_FLOAT_API + +#define TRANSITION_PENALTY 10 + +static const float dct_table[128] = { + 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, + 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, + 0.351851f, 0.338330f, 0.311806f, 0.273300f, 0.224292f, 0.166664f, 0.102631f, 0.034654f, + -0.034654f,-0.102631f,-0.166664f,-0.224292f,-0.273300f,-0.311806f,-0.338330f,-0.351851f, + 0.346760f, 0.293969f, 0.196424f, 0.068975f,-0.068975f,-0.196424f,-0.293969f,-0.346760f, + -0.346760f,-0.293969f,-0.196424f,-0.068975f, 0.068975f, 0.196424f, 0.293969f, 0.346760f, + 0.338330f, 0.224292f, 0.034654f,-0.166664f,-0.311806f,-0.351851f,-0.273300f,-0.102631f, + 0.102631f, 0.273300f, 0.351851f, 0.311806f, 0.166664f,-0.034654f,-0.224292f,-0.338330f, + 0.326641f, 0.135299f,-0.135299f,-0.326641f,-0.326641f,-0.135299f, 0.135299f, 0.326641f, + 0.326641f, 0.135299f,-0.135299f,-0.326641f,-0.326641f,-0.135299f, 0.135299f, 0.326641f, + 0.311806f, 0.034654f,-0.273300f,-0.338330f,-0.102631f, 0.224292f, 0.351851f, 0.166664f, + -0.166664f,-0.351851f,-0.224292f, 0.102631f, 0.338330f, 0.273300f,-0.034654f,-0.311806f, + 0.293969f,-0.068975f,-0.346760f,-0.196424f, 0.196424f, 0.346760f, 0.068975f,-0.293969f, + -0.293969f, 0.068975f, 0.346760f, 0.196424f,-0.196424f,-0.346760f,-0.068975f, 0.293969f, + 0.273300f,-0.166664f,-0.338330f, 0.034654f, 0.351851f, 0.102631f,-0.311806f,-0.224292f, + 0.224292f, 0.311806f,-0.102631f,-0.351851f,-0.034654f, 0.338330f, 0.166664f,-0.273300f, +}; + +static const float analysis_window[240] = { + 0.000043f, 0.000171f, 0.000385f, 0.000685f, 0.001071f, 0.001541f, 0.002098f, 0.002739f, + 0.003466f, 0.004278f, 0.005174f, 0.006156f, 0.007222f, 0.008373f, 0.009607f, 0.010926f, + 0.012329f, 0.013815f, 0.015385f, 0.017037f, 0.018772f, 0.020590f, 0.022490f, 0.024472f, + 0.026535f, 0.028679f, 0.030904f, 0.033210f, 0.035595f, 0.038060f, 0.040604f, 0.043227f, + 0.045928f, 0.048707f, 0.051564f, 0.054497f, 0.057506f, 0.060591f, 0.063752f, 0.066987f, + 0.070297f, 0.073680f, 0.077136f, 0.080665f, 0.084265f, 0.087937f, 0.091679f, 0.095492f, + 0.099373f, 0.103323f, 0.107342f, 0.111427f, 0.115579f, 0.119797f, 0.124080f, 0.128428f, + 0.132839f, 0.137313f, 0.141849f, 0.146447f, 0.151105f, 0.155823f, 0.160600f, 0.165435f, + 0.170327f, 0.175276f, 0.180280f, 0.185340f, 0.190453f, 0.195619f, 0.200838f, 0.206107f, + 0.211427f, 0.216797f, 0.222215f, 0.227680f, 0.233193f, 0.238751f, 0.244353f, 0.250000f, + 0.255689f, 0.261421f, 0.267193f, 0.273005f, 0.278856f, 0.284744f, 0.290670f, 0.296632f, + 0.302628f, 0.308658f, 0.314721f, 0.320816f, 0.326941f, 0.333097f, 0.339280f, 0.345492f, + 0.351729f, 0.357992f, 0.364280f, 0.370590f, 0.376923f, 0.383277f, 0.389651f, 0.396044f, + 0.402455f, 0.408882f, 0.415325f, 0.421783f, 0.428254f, 0.434737f, 0.441231f, 0.447736f, + 0.454249f, 0.460770f, 0.467298f, 0.473832f, 0.480370f, 0.486912f, 0.493455f, 0.500000f, + 0.506545f, 0.513088f, 0.519630f, 0.526168f, 0.532702f, 0.539230f, 0.545751f, 0.552264f, + 0.558769f, 0.565263f, 0.571746f, 0.578217f, 0.584675f, 0.591118f, 0.597545f, 0.603956f, + 0.610349f, 0.616723f, 0.623077f, 0.629410f, 0.635720f, 0.642008f, 0.648271f, 0.654508f, + 0.660720f, 0.666903f, 0.673059f, 0.679184f, 0.685279f, 0.691342f, 0.697372f, 0.703368f, + 0.709330f, 0.715256f, 0.721144f, 0.726995f, 0.732807f, 0.738579f, 0.744311f, 0.750000f, + 0.755647f, 0.761249f, 0.766807f, 0.772320f, 0.777785f, 0.783203f, 0.788573f, 0.793893f, + 0.799162f, 0.804381f, 0.809547f, 0.814660f, 0.819720f, 0.824724f, 0.829673f, 0.834565f, + 0.839400f, 0.844177f, 0.848895f, 0.853553f, 0.858151f, 0.862687f, 0.867161f, 0.871572f, + 0.875920f, 0.880203f, 0.884421f, 0.888573f, 0.892658f, 0.896677f, 0.900627f, 0.904508f, + 0.908321f, 0.912063f, 0.915735f, 0.919335f, 0.922864f, 0.926320f, 0.929703f, 0.933013f, + 0.936248f, 0.939409f, 0.942494f, 0.945503f, 0.948436f, 0.951293f, 0.954072f, 0.956773f, + 0.959396f, 0.961940f, 0.964405f, 0.966790f, 0.969096f, 0.971321f, 0.973465f, 0.975528f, + 0.977510f, 0.979410f, 0.981228f, 0.982963f, 0.984615f, 0.986185f, 0.987671f, 0.989074f, + 0.990393f, 0.991627f, 0.992778f, 0.993844f, 0.994826f, 0.995722f, 0.996534f, 0.997261f, + 0.997902f, 0.998459f, 0.998929f, 0.999315f, 0.999615f, 0.999829f, 0.999957f, 1.000000f, +}; + +static const int tbands[NB_TBANDS+1] = { + 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 136, 160, 192, 240 +}; + +#define NB_TONAL_SKIP_BANDS 9 + +static opus_val32 silk_resampler_down2_hp( + opus_val32 *S, /* I/O State vector [ 2 ] */ + opus_val32 *out, /* O Output signal [ floor(len/2) ] */ + const opus_val32 *in, /* I Input signal [ len ] */ + int inLen /* I Number of input samples */ +) +{ + int k, len2 = inLen/2; + opus_val32 in32, out32, out32_hp, Y, X; + opus_val64 hp_ener = 0; + /* Internal variables and state are in Q10 format */ + for( k = 0; k < len2; k++ ) { + /* Convert to Q10 */ + in32 = in[ 2 * k ]; + + /* All-pass section for even input sample */ + Y = SUB32( in32, S[ 0 ] ); + X = MULT16_32_Q15(QCONST16(0.6074371f, 15), Y); + out32 = ADD32( S[ 0 ], X ); + S[ 0 ] = ADD32( in32, X ); + out32_hp = out32; + /* Convert to Q10 */ + in32 = in[ 2 * k + 1 ]; + + /* All-pass section for odd input sample, and add to output of previous section */ + Y = SUB32( in32, S[ 1 ] ); + X = MULT16_32_Q15(QCONST16(0.15063f, 15), Y); + out32 = ADD32( out32, S[ 1 ] ); + out32 = ADD32( out32, X ); + S[ 1 ] = ADD32( in32, X ); + + Y = SUB32( -in32, S[ 2 ] ); + X = MULT16_32_Q15(QCONST16(0.15063f, 15), Y); + out32_hp = ADD32( out32_hp, S[ 2 ] ); + out32_hp = ADD32( out32_hp, X ); + S[ 2 ] = ADD32( -in32, X ); + + hp_ener += out32_hp*(opus_val64)out32_hp; + /* Add, convert back to int16 and store to output */ + out[ k ] = HALF32(out32); + } +#ifdef FIXED_POINT + /* len2 can be up to 480, so we shift by 8 more to make it fit. */ + hp_ener = hp_ener >> (2*SIG_SHIFT + 8); +#endif + return (opus_val32)hp_ener; +} + +static opus_val32 downmix_and_resample(downmix_func downmix, const void *_x, opus_val32 *y, opus_val32 S[3], int subframe, int offset, int c1, int c2, int C, int Fs) +{ + VARDECL(opus_val32, tmp); + opus_val32 scale; + int j; + opus_val32 ret = 0; + SAVE_STACK; + + if (subframe==0) return 0; + if (Fs == 48000) + { + subframe *= 2; + offset *= 2; + } else if (Fs == 16000) { + subframe = subframe*2/3; + offset = offset*2/3; + } + ALLOC(tmp, subframe, opus_val32); + + downmix(_x, tmp, subframe, offset, c1, c2, C); +#ifdef FIXED_POINT + scale = (1<-1) + scale /= 2; + for (j=0;jarch = opus_select_arch(); + tonal->Fs = Fs; + /* Clear remaining fields. */ + tonality_analysis_reset(tonal); +} + +void tonality_analysis_reset(TonalityAnalysisState *tonal) +{ + /* Clear non-reusable fields. */ + char *start = (char*)&tonal->TONALITY_ANALYSIS_RESET_START; + OPUS_CLEAR(start, sizeof(TonalityAnalysisState) - (start - (char*)tonal)); +} + +void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int len) +{ + int pos; + int curr_lookahead; + float tonality_max; + float tonality_avg; + int tonality_count; + int i; + int pos0; + float prob_avg; + float prob_count; + float prob_min, prob_max; + float vad_prob; + int mpos, vpos; + int bandwidth_span; + + pos = tonal->read_pos; + curr_lookahead = tonal->write_pos-tonal->read_pos; + if (curr_lookahead<0) + curr_lookahead += DETECT_SIZE; + + tonal->read_subframe += len/(tonal->Fs/400); + while (tonal->read_subframe>=8) + { + tonal->read_subframe -= 8; + tonal->read_pos++; + } + if (tonal->read_pos>=DETECT_SIZE) + tonal->read_pos-=DETECT_SIZE; + + /* On long frames, look at the second analysis window rather than the first. */ + if (len > tonal->Fs/50 && pos != tonal->write_pos) + { + pos++; + if (pos==DETECT_SIZE) + pos=0; + } + if (pos == tonal->write_pos) + pos--; + if (pos<0) + pos = DETECT_SIZE-1; + pos0 = pos; + OPUS_COPY(info_out, &tonal->info[pos], 1); + if (!info_out->valid) + return; + tonality_max = tonality_avg = info_out->tonality; + tonality_count = 1; + /* Look at the neighbouring frames and pick largest bandwidth found (to be safe). */ + bandwidth_span = 6; + /* If possible, look ahead for a tone to compensate for the delay in the tone detector. */ + for (i=0;i<3;i++) + { + pos++; + if (pos==DETECT_SIZE) + pos = 0; + if (pos == tonal->write_pos) + break; + tonality_max = MAX32(tonality_max, tonal->info[pos].tonality); + tonality_avg += tonal->info[pos].tonality; + tonality_count++; + info_out->bandwidth = IMAX(info_out->bandwidth, tonal->info[pos].bandwidth); + bandwidth_span--; + } + pos = pos0; + /* Look back in time to see if any has a wider bandwidth than the current frame. */ + for (i=0;iwrite_pos) + break; + info_out->bandwidth = IMAX(info_out->bandwidth, tonal->info[pos].bandwidth); + } + info_out->tonality = MAX32(tonality_avg/tonality_count, tonality_max-.2f); + + mpos = vpos = pos0; + /* If we have enough look-ahead, compensate for the ~5-frame delay in the music prob and + ~1 frame delay in the VAD prob. */ + if (curr_lookahead > 15) + { + mpos += 5; + if (mpos>=DETECT_SIZE) + mpos -= DETECT_SIZE; + vpos += 1; + if (vpos>=DETECT_SIZE) + vpos -= DETECT_SIZE; + } + + /* The following calculations attempt to minimize a "badness function" + for the transition. When switching from speech to music, the badness + of switching at frame k is + b_k = S*v_k + \sum_{i=0}^{k-1} v_i*(p_i - T) + where + v_i is the activity probability (VAD) at frame i, + p_i is the music probability at frame i + T is the probability threshold for switching + S is the penalty for switching during active audio rather than silence + the current frame has index i=0 + + Rather than apply badness to directly decide when to switch, what we compute + instead is the threshold for which the optimal switching point is now. When + considering whether to switch now (frame 0) or at frame k, we have: + S*v_0 = S*v_k + \sum_{i=0}^{k-1} v_i*(p_i - T) + which gives us: + T = ( \sum_{i=0}^{k-1} v_i*p_i + S*(v_k-v_0) ) / ( \sum_{i=0}^{k-1} v_i ) + We take the min threshold across all positive values of k (up to the maximum + amount of lookahead we have) to give us the threshold for which the current + frame is the optimal switch point. + + The last step is that we need to consider whether we want to switch at all. + For that we use the average of the music probability over the entire window. + If the threshold is higher than that average we're not going to + switch, so we compute a min with the average as well. The result of all these + min operations is music_prob_min, which gives the threshold for switching to music + if we're currently encoding for speech. + + We do the exact opposite to compute music_prob_max which is used for switching + from music to speech. + */ + prob_min = 1.f; + prob_max = 0.f; + vad_prob = tonal->info[vpos].activity_probability; + prob_count = MAX16(.1f, vad_prob); + prob_avg = MAX16(.1f, vad_prob)*tonal->info[mpos].music_prob; + while (1) + { + float pos_vad; + mpos++; + if (mpos==DETECT_SIZE) + mpos = 0; + if (mpos == tonal->write_pos) + break; + vpos++; + if (vpos==DETECT_SIZE) + vpos = 0; + if (vpos == tonal->write_pos) + break; + pos_vad = tonal->info[vpos].activity_probability; + prob_min = MIN16((prob_avg - TRANSITION_PENALTY*(vad_prob - pos_vad))/prob_count, prob_min); + prob_max = MAX16((prob_avg + TRANSITION_PENALTY*(vad_prob - pos_vad))/prob_count, prob_max); + prob_count += MAX16(.1f, pos_vad); + prob_avg += MAX16(.1f, pos_vad)*tonal->info[mpos].music_prob; + } + info_out->music_prob = prob_avg/prob_count; + prob_min = MIN16(prob_avg/prob_count, prob_min); + prob_max = MAX16(prob_avg/prob_count, prob_max); + prob_min = MAX16(prob_min, 0.f); + prob_max = MIN16(prob_max, 1.f); + + /* If we don't have enough look-ahead, do our best to make a decent decision. */ + if (curr_lookahead < 10) + { + float pmin, pmax; + pmin = prob_min; + pmax = prob_max; + pos = pos0; + /* Look for min/max in the past. */ + for (i=0;icount-1, 15);i++) + { + pos--; + if (pos < 0) + pos = DETECT_SIZE-1; + pmin = MIN16(pmin, tonal->info[pos].music_prob); + pmax = MAX16(pmax, tonal->info[pos].music_prob); + } + /* Bias against switching on active audio. */ + pmin = MAX16(0.f, pmin - .1f*vad_prob); + pmax = MIN16(1.f, pmax + .1f*vad_prob); + prob_min += (1.f-.1f*curr_lookahead)*(pmin - prob_min); + prob_max += (1.f-.1f*curr_lookahead)*(pmax - prob_max); + } + info_out->music_prob_min = prob_min; + info_out->music_prob_max = prob_max; + + /* printf("%f %f %f %f %f\n", prob_min, prob_max, prob_avg/prob_count, vad_prob, info_out->music_prob); */ +} + +static const float std_feature_bias[9] = { + 5.684947f, 3.475288f, 1.770634f, 1.599784f, 3.773215f, + 2.163313f, 1.260756f, 1.116868f, 1.918795f +}; + +#define LEAKAGE_OFFSET 2.5f +#define LEAKAGE_SLOPE 2.f + +#ifdef FIXED_POINT +/* For fixed-point, the input is +/-2^15 shifted up by SIG_SHIFT, so we need to + compensate for that in the energy. */ +#define SCALE_COMPENS (1.f/((opus_int32)1<<(15+SIG_SHIFT))) +#define SCALE_ENER(e) ((SCALE_COMPENS*SCALE_COMPENS)*(e)) +#else +#define SCALE_ENER(e) (e) +#endif + +#ifdef FIXED_POINT +static int is_digital_silence32(const opus_val32* pcm, int frame_size, int channels, int lsb_depth) +{ + int silence = 0; + opus_val32 sample_max = 0; +#ifdef MLP_TRAINING + return 0; +#endif + sample_max = celt_maxabs32(pcm, frame_size*channels); + + silence = (sample_max == 0); + (void)lsb_depth; + return silence; +} +#else +#define is_digital_silence32(pcm, frame_size, channels, lsb_depth) is_digital_silence(pcm, frame_size, channels, lsb_depth) +#endif + +static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt_mode, const void *x, int len, int offset, int c1, int c2, int C, int lsb_depth, downmix_func downmix) +{ + int i, b; + const kiss_fft_state *kfft; + VARDECL(kiss_fft_cpx, in); + VARDECL(kiss_fft_cpx, out); + int N = 480, N2=240; + float * OPUS_RESTRICT A = tonal->angle; + float * OPUS_RESTRICT dA = tonal->d_angle; + float * OPUS_RESTRICT d2A = tonal->d2_angle; + VARDECL(float, tonality); + VARDECL(float, noisiness); + float band_tonality[NB_TBANDS]; + float logE[NB_TBANDS]; + float BFCC[8]; + float features[25]; + float frame_tonality; + float max_frame_tonality; + /*float tw_sum=0;*/ + float frame_noisiness; + const float pi4 = (float)(M_PI*M_PI*M_PI*M_PI); + float slope=0; + float frame_stationarity; + float relativeE; + float frame_probs[2]; + float alpha, alphaE, alphaE2; + float frame_loudness; + float bandwidth_mask; + int is_masked[NB_TBANDS+1]; + int bandwidth=0; + float maxE = 0; + float noise_floor; + int remaining; + AnalysisInfo *info; + float hp_ener; + float tonality2[240]; + float midE[8]; + float spec_variability=0; + float band_log2[NB_TBANDS+1]; + float leakage_from[NB_TBANDS+1]; + float leakage_to[NB_TBANDS+1]; + float layer_out[MAX_NEURONS]; + float below_max_pitch; + float above_max_pitch; + int is_silence; + SAVE_STACK; + + if (!tonal->initialized) + { + tonal->mem_fill = 240; + tonal->initialized = 1; + } + alpha = 1.f/IMIN(10, 1+tonal->count); + alphaE = 1.f/IMIN(25, 1+tonal->count); + /* Noise floor related decay for bandwidth detection: -2.2 dB/second */ + alphaE2 = 1.f/IMIN(100, 1+tonal->count); + if (tonal->count <= 1) alphaE2 = 1; + + if (tonal->Fs == 48000) + { + /* len and offset are now at 24 kHz. */ + len/= 2; + offset /= 2; + } else if (tonal->Fs == 16000) { + len = 3*len/2; + offset = 3*offset/2; + } + + kfft = celt_mode->mdct.kfft[0]; + tonal->hp_ener_accum += (float)downmix_and_resample(downmix, x, + &tonal->inmem[tonal->mem_fill], tonal->downmix_state, + IMIN(len, ANALYSIS_BUF_SIZE-tonal->mem_fill), offset, c1, c2, C, tonal->Fs); + if (tonal->mem_fill+len < ANALYSIS_BUF_SIZE) + { + tonal->mem_fill += len; + /* Don't have enough to update the analysis */ + RESTORE_STACK; + return; + } + hp_ener = tonal->hp_ener_accum; + info = &tonal->info[tonal->write_pos++]; + if (tonal->write_pos>=DETECT_SIZE) + tonal->write_pos-=DETECT_SIZE; + + is_silence = is_digital_silence32(tonal->inmem, ANALYSIS_BUF_SIZE, 1, lsb_depth); + + ALLOC(in, 480, kiss_fft_cpx); + ALLOC(out, 480, kiss_fft_cpx); + ALLOC(tonality, 240, float); + ALLOC(noisiness, 240, float); + for (i=0;iinmem[i]); + in[i].i = (kiss_fft_scalar)(w*tonal->inmem[N2+i]); + in[N-i-1].r = (kiss_fft_scalar)(w*tonal->inmem[N-i-1]); + in[N-i-1].i = (kiss_fft_scalar)(w*tonal->inmem[N+N2-i-1]); + } + OPUS_MOVE(tonal->inmem, tonal->inmem+ANALYSIS_BUF_SIZE-240, 240); + remaining = len - (ANALYSIS_BUF_SIZE-tonal->mem_fill); + tonal->hp_ener_accum = (float)downmix_and_resample(downmix, x, + &tonal->inmem[240], tonal->downmix_state, remaining, + offset+ANALYSIS_BUF_SIZE-tonal->mem_fill, c1, c2, C, tonal->Fs); + tonal->mem_fill = 240 + remaining; + if (is_silence) + { + /* On silence, copy the previous analysis. */ + int prev_pos = tonal->write_pos-2; + if (prev_pos < 0) + prev_pos += DETECT_SIZE; + OPUS_COPY(info, &tonal->info[prev_pos], 1); + RESTORE_STACK; + return; + } + opus_fft(kfft, in, out, tonal->arch); +#ifndef FIXED_POINT + /* If there's any NaN on the input, the entire output will be NaN, so we only need to check one value. */ + if (celt_isnan(out[0].r)) + { + info->valid = 0; + RESTORE_STACK; + return; + } +#endif + + for (i=1;iactivity = 0; + frame_noisiness = 0; + frame_stationarity = 0; + if (!tonal->count) + { + for (b=0;blowE[b] = 1e10; + tonal->highE[b] = -1e10; + } + } + relativeE = 0; + frame_loudness = 0; + /* The energy of the very first band is special because of DC. */ + { + float E = 0; + float X1r, X2r; + X1r = 2*(float)out[0].r; + X2r = 2*(float)out[0].i; + E = X1r*X1r + X2r*X2r; + for (i=1;i<4;i++) + { + float binE = out[i].r*(float)out[i].r + out[N-i].r*(float)out[N-i].r + + out[i].i*(float)out[i].i + out[N-i].i*(float)out[N-i].i; + E += binE; + } + E = SCALE_ENER(E); + band_log2[0] = .5f*1.442695f*(float)log(E+1e-10f); + } + for (b=0;bvalid = 0; + RESTORE_STACK; + return; + } +#endif + + tonal->E[tonal->E_count][b] = E; + frame_noisiness += nE/(1e-15f+E); + + frame_loudness += (float)sqrt(E+1e-10f); + logE[b] = (float)log(E+1e-10f); + band_log2[b+1] = .5f*1.442695f*(float)log(E+1e-10f); + tonal->logE[tonal->E_count][b] = logE[b]; + if (tonal->count==0) + tonal->highE[b] = tonal->lowE[b] = logE[b]; + if (tonal->highE[b] > tonal->lowE[b] + 7.5) + { + if (tonal->highE[b] - logE[b] > logE[b] - tonal->lowE[b]) + tonal->highE[b] -= .01f; + else + tonal->lowE[b] += .01f; + } + if (logE[b] > tonal->highE[b]) + { + tonal->highE[b] = logE[b]; + tonal->lowE[b] = MAX32(tonal->highE[b]-15, tonal->lowE[b]); + } else if (logE[b] < tonal->lowE[b]) + { + tonal->lowE[b] = logE[b]; + tonal->highE[b] = MIN32(tonal->lowE[b]+15, tonal->highE[b]); + } + relativeE += (logE[b]-tonal->lowE[b])/(1e-5f + (tonal->highE[b]-tonal->lowE[b])); + + L1=L2=0; + for (i=0;iE[i][b]); + L2 += tonal->E[i][b]; + } + + stationarity = MIN16(0.99f,L1/(float)sqrt(1e-15+NB_FRAMES*L2)); + stationarity *= stationarity; + stationarity *= stationarity; + frame_stationarity += stationarity; + /*band_tonality[b] = tE/(1e-15+E)*/; + band_tonality[b] = MAX16(tE/(1e-15f+E), stationarity*tonal->prev_band_tonality[b]); +#if 0 + if (b>=NB_TONAL_SKIP_BANDS) + { + frame_tonality += tweight[b]*band_tonality[b]; + tw_sum += tweight[b]; + } +#else + frame_tonality += band_tonality[b]; + if (b>=NB_TBANDS-NB_TONAL_SKIP_BANDS) + frame_tonality -= band_tonality[b-NB_TBANDS+NB_TONAL_SKIP_BANDS]; +#endif + max_frame_tonality = MAX16(max_frame_tonality, (1.f+.03f*(b-NB_TBANDS))*frame_tonality); + slope += band_tonality[b]*(b-8); + /*printf("%f %f ", band_tonality[b], stationarity);*/ + tonal->prev_band_tonality[b] = band_tonality[b]; + } + + leakage_from[0] = band_log2[0]; + leakage_to[0] = band_log2[0] - LEAKAGE_OFFSET; + for (b=1;b=0;b--) + { + float leak_slope = LEAKAGE_SLOPE*(tbands[b+1]-tbands[b])/4; + leakage_from[b] = MIN16(leakage_from[b+1]+leak_slope, leakage_from[b]); + leakage_to[b] = MAX16(leakage_to[b+1]-leak_slope, leakage_to[b]); + } + celt_assert(NB_TBANDS+1 <= LEAK_BANDS); + for (b=0;bleak_boost[b] = IMIN(255, (int)floor(.5 + 64.f*boost)); + } + for (;bleak_boost[b] = 0; + + for (i=0;ilogE[i][k] - tonal->logE[j][k]; + dist += tmp*tmp; + } + if (j!=i) + mindist = MIN32(mindist, dist); + } + spec_variability += mindist; + } + spec_variability = (float)sqrt(spec_variability/NB_FRAMES/NB_TBANDS); + bandwidth_mask = 0; + bandwidth = 0; + maxE = 0; + noise_floor = 5.7e-4f/(1<<(IMAX(0,lsb_depth-8))); + noise_floor *= noise_floor; + below_max_pitch=0; + above_max_pitch=0; + for (b=0;bmeanE[b] = MAX32((1-alphaE2)*tonal->meanE[b], E); + Em = MAX32(E, tonal->meanE[b]); + /* Consider the band "active" only if all these conditions are met: + 1) less than 90 dB below the peak band (maximal masking possible considering + both the ATH and the loudness-dependent slope of the spreading function) + 2) above the PCM quantization noise floor + We use b+1 because the first CELT band isn't included in tbands[] + */ + if (E*1e9f > maxE && (Em > 3*noise_floor*(band_end-band_start) || E > noise_floor*(band_end-band_start))) + bandwidth = b+1; + /* Check if the band is masked (see below). */ + is_masked[b] = E < (tonal->prev_bandwidth >= b+1 ? .01f : .05f)*bandwidth_mask; + /* Use a simple follower with 13 dB/Bark slope for spreading function. */ + bandwidth_mask = MAX32(.05f*bandwidth_mask, E); + } + /* Special case for the last two bands, for which we don't have spectrum but only + the energy above 12 kHz. The difficulty here is that the high-pass we use + leaks some LF energy, so we need to increase the threshold without accidentally cutting + off the band. */ + if (tonal->Fs == 48000) { + float noise_ratio; + float Em; + float E = hp_ener*(1.f/(60*60)); + noise_ratio = tonal->prev_bandwidth==20 ? 10.f : 30.f; + +#ifdef FIXED_POINT + /* silk_resampler_down2_hp() shifted right by an extra 8 bits. */ + E *= 256.f*(1.f/Q15ONE)*(1.f/Q15ONE); +#endif + above_max_pitch += E; + tonal->meanE[b] = MAX32((1-alphaE2)*tonal->meanE[b], E); + Em = MAX32(E, tonal->meanE[b]); + if (Em > 3*noise_ratio*noise_floor*160 || E > noise_ratio*noise_floor*160) + bandwidth = 20; + /* Check if the band is masked (see below). */ + is_masked[b] = E < (tonal->prev_bandwidth == 20 ? .01f : .05f)*bandwidth_mask; + } + if (above_max_pitch > below_max_pitch) + info->max_pitch_ratio = below_max_pitch/above_max_pitch; + else + info->max_pitch_ratio = 1; + /* In some cases, resampling aliasing can create a small amount of energy in the first band + being cut. So if the last band is masked, we don't include it. */ + if (bandwidth == 20 && is_masked[NB_TBANDS]) + bandwidth-=2; + else if (bandwidth > 0 && bandwidth <= NB_TBANDS && is_masked[bandwidth-1]) + bandwidth--; + if (tonal->count<=2) + bandwidth = 20; + frame_loudness = 20*(float)log10(frame_loudness); + tonal->Etracker = MAX32(tonal->Etracker-.003f, frame_loudness); + tonal->lowECount *= (1-alphaE); + if (frame_loudness < tonal->Etracker-30) + tonal->lowECount += alphaE; + + for (i=0;i<8;i++) + { + float sum=0; + for (b=0;b<16;b++) + sum += dct_table[i*16+b]*logE[b]; + BFCC[i] = sum; + } + for (i=0;i<8;i++) + { + float sum=0; + for (b=0;b<16;b++) + sum += dct_table[i*16+b]*.5f*(tonal->highE[b]+tonal->lowE[b]); + midE[i] = sum; + } + + frame_stationarity /= NB_TBANDS; + relativeE /= NB_TBANDS; + if (tonal->count<10) + relativeE = .5f; + frame_noisiness /= NB_TBANDS; +#if 1 + info->activity = frame_noisiness + (1-frame_noisiness)*relativeE; +#else + info->activity = .5*(1+frame_noisiness-frame_stationarity); +#endif + frame_tonality = (max_frame_tonality/(NB_TBANDS-NB_TONAL_SKIP_BANDS)); + frame_tonality = MAX16(frame_tonality, tonal->prev_tonality*.8f); + tonal->prev_tonality = frame_tonality; + + slope /= 8*8; + info->tonality_slope = slope; + + tonal->E_count = (tonal->E_count+1)%NB_FRAMES; + tonal->count = IMIN(tonal->count+1, ANALYSIS_COUNT_MAX); + info->tonality = frame_tonality; + + for (i=0;i<4;i++) + features[i] = -0.12299f*(BFCC[i]+tonal->mem[i+24]) + 0.49195f*(tonal->mem[i]+tonal->mem[i+16]) + 0.69693f*tonal->mem[i+8] - 1.4349f*tonal->cmean[i]; + + for (i=0;i<4;i++) + tonal->cmean[i] = (1-alpha)*tonal->cmean[i] + alpha*BFCC[i]; + + for (i=0;i<4;i++) + features[4+i] = 0.63246f*(BFCC[i]-tonal->mem[i+24]) + 0.31623f*(tonal->mem[i]-tonal->mem[i+16]); + for (i=0;i<3;i++) + features[8+i] = 0.53452f*(BFCC[i]+tonal->mem[i+24]) - 0.26726f*(tonal->mem[i]+tonal->mem[i+16]) -0.53452f*tonal->mem[i+8]; + + if (tonal->count > 5) + { + for (i=0;i<9;i++) + tonal->std[i] = (1-alpha)*tonal->std[i] + alpha*features[i]*features[i]; + } + for (i=0;i<4;i++) + features[i] = BFCC[i]-midE[i]; + + for (i=0;i<8;i++) + { + tonal->mem[i+24] = tonal->mem[i+16]; + tonal->mem[i+16] = tonal->mem[i+8]; + tonal->mem[i+8] = tonal->mem[i]; + tonal->mem[i] = BFCC[i]; + } + for (i=0;i<9;i++) + features[11+i] = (float)sqrt(tonal->std[i]) - std_feature_bias[i]; + features[18] = spec_variability - 0.78f; + features[20] = info->tonality - 0.154723f; + features[21] = info->activity - 0.724643f; + features[22] = frame_stationarity - 0.743717f; + features[23] = info->tonality_slope + 0.069216f; + features[24] = tonal->lowECount - 0.067930f; + + compute_dense(&layer0, layer_out, features); + compute_gru(&layer1, tonal->rnn_state, layer_out); + compute_dense(&layer2, frame_probs, tonal->rnn_state); + + /* Probability of speech or music vs noise */ + info->activity_probability = frame_probs[1]; + info->music_prob = frame_probs[0]; + + /*printf("%f %f %f\n", frame_probs[0], frame_probs[1], info->music_prob);*/ +#ifdef MLP_TRAINING + for (i=0;i<25;i++) + printf("%f ", features[i]); + printf("\n"); +#endif + + info->bandwidth = bandwidth; + tonal->prev_bandwidth = bandwidth; + /*printf("%d %d\n", info->bandwidth, info->opus_bandwidth);*/ + info->noisiness = frame_noisiness; + info->valid = 1; + RESTORE_STACK; +} + +void run_analysis(TonalityAnalysisState *analysis, const CELTMode *celt_mode, const void *analysis_pcm, + int analysis_frame_size, int frame_size, int c1, int c2, int C, opus_int32 Fs, + int lsb_depth, downmix_func downmix, AnalysisInfo *analysis_info) +{ + int offset; + int pcm_len; + + analysis_frame_size -= analysis_frame_size&1; + if (analysis_pcm != NULL) + { + /* Avoid overflow/wrap-around of the analysis buffer */ + analysis_frame_size = IMIN((DETECT_SIZE-5)*Fs/50, analysis_frame_size); + + pcm_len = analysis_frame_size - analysis->analysis_offset; + offset = analysis->analysis_offset; + while (pcm_len>0) { + tonality_analysis(analysis, celt_mode, analysis_pcm, IMIN(Fs/50, pcm_len), offset, c1, c2, C, lsb_depth, downmix); + offset += Fs/50; + pcm_len -= Fs/50; + } + analysis->analysis_offset = analysis_frame_size; + + analysis->analysis_offset -= frame_size; + } + + tonality_get_info(analysis, analysis_info, frame_size); +} + +#endif /* DISABLE_FLOAT_API */ diff --git a/external/opus-1.3.1/src/analysis.h b/external/opus-1.3.1/src/analysis.h new file mode 100644 index 00000000..0b66555f --- /dev/null +++ b/external/opus-1.3.1/src/analysis.h @@ -0,0 +1,103 @@ +/* Copyright (c) 2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef ANALYSIS_H +#define ANALYSIS_H + +#include "celt.h" +#include "opus_private.h" +#include "mlp.h" + +#define NB_FRAMES 8 +#define NB_TBANDS 18 +#define ANALYSIS_BUF_SIZE 720 /* 30 ms at 24 kHz */ + +/* At that point we can stop counting frames because it no longer matters. */ +#define ANALYSIS_COUNT_MAX 10000 + +#define DETECT_SIZE 100 + +/* Uncomment this to print the MLP features on stdout. */ +/*#define MLP_TRAINING*/ + +typedef struct { + int arch; + int application; + opus_int32 Fs; +#define TONALITY_ANALYSIS_RESET_START angle + float angle[240]; + float d_angle[240]; + float d2_angle[240]; + opus_val32 inmem[ANALYSIS_BUF_SIZE]; + int mem_fill; /* number of usable samples in the buffer */ + float prev_band_tonality[NB_TBANDS]; + float prev_tonality; + int prev_bandwidth; + float E[NB_FRAMES][NB_TBANDS]; + float logE[NB_FRAMES][NB_TBANDS]; + float lowE[NB_TBANDS]; + float highE[NB_TBANDS]; + float meanE[NB_TBANDS+1]; + float mem[32]; + float cmean[8]; + float std[9]; + float Etracker; + float lowECount; + int E_count; + int count; + int analysis_offset; + int write_pos; + int read_pos; + int read_subframe; + float hp_ener_accum; + int initialized; + float rnn_state[MAX_NEURONS]; + opus_val32 downmix_state[3]; + AnalysisInfo info[DETECT_SIZE]; +} TonalityAnalysisState; + +/** Initialize a TonalityAnalysisState struct. + * + * This performs some possibly slow initialization steps which should + * not be repeated every analysis step. No allocated memory is retained + * by the state struct, so no cleanup call is required. + */ +void tonality_analysis_init(TonalityAnalysisState *analysis, opus_int32 Fs); + +/** Reset a TonalityAnalysisState stuct. + * + * Call this when there's a discontinuity in the data. + */ +void tonality_analysis_reset(TonalityAnalysisState *analysis); + +void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int len); + +void run_analysis(TonalityAnalysisState *analysis, const CELTMode *celt_mode, const void *analysis_pcm, + int analysis_frame_size, int frame_size, int c1, int c2, int C, opus_int32 Fs, + int lsb_depth, downmix_func downmix, AnalysisInfo *analysis_info); + +#endif diff --git a/external/opus-1.3.1/src/mapping_matrix.c b/external/opus-1.3.1/src/mapping_matrix.c new file mode 100644 index 00000000..31298af0 --- /dev/null +++ b/external/opus-1.3.1/src/mapping_matrix.c @@ -0,0 +1,378 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "arch.h" +#include "float_cast.h" +#include "opus_private.h" +#include "opus_defines.h" +#include "mapping_matrix.h" + +#define MATRIX_INDEX(nb_rows, row, col) (nb_rows * col + row) + +opus_int32 mapping_matrix_get_size(int rows, int cols) +{ + opus_int32 size; + + /* Mapping Matrix must only support up to 255 channels in or out. + * Additionally, the total cell count must be <= 65004 octets in order + * for the matrix to be stored in an OGG header. + */ + if (rows > 255 || cols > 255) + return 0; + size = rows * (opus_int32)cols * sizeof(opus_int16); + if (size > 65004) + return 0; + + return align(sizeof(MappingMatrix)) + align(size); +} + +opus_int16 *mapping_matrix_get_data(const MappingMatrix *matrix) +{ + /* void* cast avoids clang -Wcast-align warning */ + return (opus_int16*)(void*)((char*)matrix + align(sizeof(MappingMatrix))); +} + +void mapping_matrix_init(MappingMatrix * const matrix, + int rows, int cols, int gain, const opus_int16 *data, opus_int32 data_size) +{ + int i; + opus_int16 *ptr; + +#if !defined(ENABLE_ASSERTIONS) + (void)data_size; +#endif + celt_assert(align(data_size) == align(rows * cols * sizeof(opus_int16))); + + matrix->rows = rows; + matrix->cols = cols; + matrix->gain = gain; + ptr = mapping_matrix_get_data(matrix); + for (i = 0; i < rows * cols; i++) + { + ptr[i] = data[i]; + } +} + +#ifndef DISABLE_FLOAT_API +void mapping_matrix_multiply_channel_in_float( + const MappingMatrix *matrix, + const float *input, + int input_rows, + opus_val16 *output, + int output_row, + int output_rows, + int frame_size) +{ + /* Matrix data is ordered col-wise. */ + opus_int16* matrix_data; + int i, col; + + celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows); + + matrix_data = mapping_matrix_get_data(matrix); + + for (i = 0; i < frame_size; i++) + { + float tmp = 0; + for (col = 0; col < input_rows; col++) + { + tmp += + matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] * + input[MATRIX_INDEX(input_rows, col, i)]; + } +#if defined(FIXED_POINT) + output[output_rows * i] = FLOAT2INT16((1/32768.f)*tmp); +#else + output[output_rows * i] = (1/32768.f)*tmp; +#endif + } +} + +void mapping_matrix_multiply_channel_out_float( + const MappingMatrix *matrix, + const opus_val16 *input, + int input_row, + int input_rows, + float *output, + int output_rows, + int frame_size +) +{ + /* Matrix data is ordered col-wise. */ + opus_int16* matrix_data; + int i, row; + float input_sample; + + celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows); + + matrix_data = mapping_matrix_get_data(matrix); + + for (i = 0; i < frame_size; i++) + { +#if defined(FIXED_POINT) + input_sample = (1/32768.f)*input[input_rows * i]; +#else + input_sample = input[input_rows * i]; +#endif + for (row = 0; row < output_rows; row++) + { + float tmp = + (1/32768.f)*matrix_data[MATRIX_INDEX(matrix->rows, row, input_row)] * + input_sample; + output[MATRIX_INDEX(output_rows, row, i)] += tmp; + } + } +} +#endif /* DISABLE_FLOAT_API */ + +void mapping_matrix_multiply_channel_in_short( + const MappingMatrix *matrix, + const opus_int16 *input, + int input_rows, + opus_val16 *output, + int output_row, + int output_rows, + int frame_size) +{ + /* Matrix data is ordered col-wise. */ + opus_int16* matrix_data; + int i, col; + + celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows); + + matrix_data = mapping_matrix_get_data(matrix); + + for (i = 0; i < frame_size; i++) + { + opus_val32 tmp = 0; + for (col = 0; col < input_rows; col++) + { +#if defined(FIXED_POINT) + tmp += + ((opus_int32)matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] * + (opus_int32)input[MATRIX_INDEX(input_rows, col, i)]) >> 8; +#else + tmp += + matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] * + input[MATRIX_INDEX(input_rows, col, i)]; +#endif + } +#if defined(FIXED_POINT) + output[output_rows * i] = (opus_int16)((tmp + 64) >> 7); +#else + output[output_rows * i] = (1/(32768.f*32768.f))*tmp; +#endif + } +} + +void mapping_matrix_multiply_channel_out_short( + const MappingMatrix *matrix, + const opus_val16 *input, + int input_row, + int input_rows, + opus_int16 *output, + int output_rows, + int frame_size) +{ + /* Matrix data is ordered col-wise. */ + opus_int16* matrix_data; + int i, row; + opus_int32 input_sample; + + celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows); + + matrix_data = mapping_matrix_get_data(matrix); + + for (i = 0; i < frame_size; i++) + { +#if defined(FIXED_POINT) + input_sample = (opus_int32)input[input_rows * i]; +#else + input_sample = (opus_int32)FLOAT2INT16(input[input_rows * i]); +#endif + for (row = 0; row < output_rows; row++) + { + opus_int32 tmp = + (opus_int32)matrix_data[MATRIX_INDEX(matrix->rows, row, input_row)] * + input_sample; + output[MATRIX_INDEX(output_rows, row, i)] += (tmp + 16384) >> 15; + } + } +} + +const MappingMatrix mapping_matrix_foa_mixing = { 6, 6, 0 }; +const opus_int16 mapping_matrix_foa_mixing_data[36] = { + 16384, 0, -16384, 23170, 0, 0, 16384, 23170, + 16384, 0, 0, 0, 16384, 0, -16384, -23170, + 0, 0, 16384, -23170, 16384, 0, 0, 0, + 0, 0, 0, 0, 32767, 0, 0, 0, + 0, 0, 0, 32767 +}; + +const MappingMatrix mapping_matrix_soa_mixing = { 11, 11, 0 }; +const opus_int16 mapping_matrix_soa_mixing_data[121] = { + 10923, 7723, 13377, -13377, 11585, 9459, 7723, -16384, + -6689, 0, 0, 10923, 7723, 13377, 13377, -11585, + 9459, 7723, 16384, -6689, 0, 0, 10923, -15447, + 13377, 0, 0, -18919, 7723, 0, 13377, 0, + 0, 10923, 7723, -13377, -13377, 11585, -9459, 7723, + 16384, -6689, 0, 0, 10923, -7723, 0, 13377, + -16384, 0, -15447, 0, 9459, 0, 0, 10923, + -7723, 0, -13377, 16384, 0, -15447, 0, 9459, + 0, 0, 10923, 15447, 0, 0, 0, 0, + -15447, 0, -18919, 0, 0, 10923, 7723, -13377, + 13377, -11585, -9459, 7723, -16384, -6689, 0, 0, + 10923, -15447, -13377, 0, 0, 18919, 7723, 0, + 13377, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32767, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32767 +}; + +const MappingMatrix mapping_matrix_toa_mixing = { 18, 18, 0 }; +const opus_int16 mapping_matrix_toa_mixing_data[324] = { + 8208, 0, -881, 14369, 0, 0, -8192, -4163, + 13218, 0, 0, 0, 11095, -8836, -6218, 14833, + 0, 0, 8208, -10161, 881, 10161, -13218, -2944, + -8192, 2944, 0, -10488, -6218, 6248, -11095, -6248, + 0, -10488, 0, 0, 8208, 10161, 881, -10161, + -13218, 2944, -8192, -2944, 0, 10488, -6218, -6248, + -11095, 6248, 0, 10488, 0, 0, 8176, 5566, + -11552, 5566, 9681, -11205, 8192, -11205, 0, 4920, + -15158, 9756, -3334, 9756, 0, -4920, 0, 0, + 8176, 7871, 11552, 0, 0, 15846, 8192, 0, + -9681, -6958, 0, 13797, 3334, 0, -15158, 0, + 0, 0, 8176, 0, 11552, 7871, 0, 0, + 8192, 15846, 9681, 0, 0, 0, 3334, 13797, + 15158, 6958, 0, 0, 8176, 5566, -11552, -5566, + -9681, -11205, 8192, 11205, 0, 4920, 15158, 9756, + -3334, -9756, 0, 4920, 0, 0, 8208, 14369, + -881, 0, 0, -4163, -8192, 0, -13218, -14833, + 0, -8836, 11095, 0, 6218, 0, 0, 0, + 8208, 10161, 881, 10161, 13218, 2944, -8192, 2944, + 0, 10488, 6218, -6248, -11095, -6248, 0, -10488, + 0, 0, 8208, -14369, -881, 0, 0, 4163, + -8192, 0, -13218, 14833, 0, 8836, 11095, 0, + 6218, 0, 0, 0, 8208, 0, -881, -14369, + 0, 0, -8192, 4163, 13218, 0, 0, 0, + 11095, 8836, -6218, -14833, 0, 0, 8176, -5566, + -11552, 5566, -9681, 11205, 8192, -11205, 0, -4920, + 15158, -9756, -3334, 9756, 0, -4920, 0, 0, + 8176, 0, 11552, -7871, 0, 0, 8192, -15846, + 9681, 0, 0, 0, 3334, -13797, 15158, -6958, + 0, 0, 8176, -7871, 11552, 0, 0, -15846, + 8192, 0, -9681, 6958, 0, -13797, 3334, 0, + -15158, 0, 0, 0, 8176, -5566, -11552, -5566, + 9681, 11205, 8192, 11205, 0, -4920, -15158, -9756, + -3334, -9756, 0, 4920, 0, 0, 8208, -10161, + 881, -10161, 13218, -2944, -8192, -2944, 0, -10488, + 6218, 6248, -11095, 6248, 0, 10488, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32767, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32767 +}; + +const MappingMatrix mapping_matrix_foa_demixing = { 6, 6, 0 }; +const opus_int16 mapping_matrix_foa_demixing_data[36] = { + 16384, 16384, 16384, 16384, 0, 0, 0, 23170, + 0, -23170, 0, 0, -16384, 16384, -16384, 16384, + 0, 0, 23170, 0, -23170, 0, 0, 0, + 0, 0, 0, 0, 32767, 0, 0, 0, + 0, 0, 0, 32767 +}; + +const MappingMatrix mapping_matrix_soa_demixing = { 11, 11, 3050 }; +const opus_int16 mapping_matrix_soa_demixing_data[121] = { + 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771, + 2771, 0, 0, 10033, 10033, -20066, 10033, 14189, + 14189, -28378, 10033, -20066, 0, 0, 3393, 3393, + 3393, -3393, 0, 0, 0, -3393, -3393, 0, + 0, -17378, 17378, 0, -17378, -24576, 24576, 0, + 17378, 0, 0, 0, -14189, 14189, 0, -14189, + -28378, 28378, 0, 14189, 0, 0, 0, 2399, + 2399, -4799, -2399, 0, 0, 0, -2399, 4799, + 0, 0, 1959, 1959, 1959, 1959, -3918, -3918, + -3918, 1959, 1959, 0, 0, -4156, 4156, 0, + 4156, 0, 0, 0, -4156, 0, 0, 0, + 8192, 8192, -16384, 8192, 16384, 16384, -32768, 8192, + -16384, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8312, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 8312 +}; + +const MappingMatrix mapping_matrix_toa_demixing = { 18, 18, 0 }; +const opus_int16 mapping_matrix_toa_demixing_data[324] = { + 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, + 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, + 0, 0, 0, -9779, 9779, 6263, 8857, 0, + 6263, 13829, 9779, -13829, 0, -6263, 0, -8857, + -6263, -9779, 0, 0, -3413, 3413, 3413, -11359, + 11359, 11359, -11359, -3413, 3413, -3413, -3413, -11359, + 11359, 11359, -11359, 3413, 0, 0, 13829, 9779, + -9779, 6263, 0, 8857, -6263, 0, 9779, 0, + -13829, 6263, -8857, 0, -6263, -9779, 0, 0, + 0, -15617, -15617, 6406, 0, 0, -6406, 0, + 15617, 0, 0, -6406, 0, 0, 6406, 15617, + 0, 0, 0, -5003, 5003, -10664, 15081, 0, + -10664, -7075, 5003, 7075, 0, 10664, 0, -15081, + 10664, -5003, 0, 0, -8176, -8176, -8176, 8208, + 8208, 8208, 8208, -8176, -8176, -8176, -8176, 8208, + 8208, 8208, 8208, -8176, 0, 0, -7075, 5003, + -5003, -10664, 0, 15081, 10664, 0, 5003, 0, + 7075, -10664, -15081, 0, 10664, -5003, 0, 0, + 15617, 0, 0, 0, -6406, 6406, 0, -15617, + 0, -15617, 15617, 0, 6406, -6406, 0, 0, + 0, 0, 0, -11393, 11393, 2993, -4233, 0, + 2993, -16112, 11393, 16112, 0, -2993, 0, 4233, + -2993, -11393, 0, 0, 0, -9974, -9974, -13617, + 0, 0, 13617, 0, 9974, 0, 0, 13617, + 0, 0, -13617, 9974, 0, 0, 0, 5579, + -5579, 10185, 14403, 0, 10185, -7890, -5579, 7890, + 0, -10185, 0, -14403, -10185, 5579, 0, 0, + 11826, -11826, -11826, -901, 901, 901, -901, 11826, + -11826, 11826, 11826, -901, 901, 901, -901, -11826, + 0, 0, -7890, -5579, 5579, 10185, 0, 14403, + -10185, 0, -5579, 0, 7890, 10185, -14403, 0, + -10185, 5579, 0, 0, -9974, 0, 0, 0, + -13617, 13617, 0, 9974, 0, 9974, -9974, 0, + 13617, -13617, 0, 0, 0, 0, 16112, -11393, + 11393, -2993, 0, 4233, 2993, 0, -11393, 0, + -16112, -2993, -4233, 0, 2993, 11393, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32767, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32767 +}; + diff --git a/external/opus-1.3.1/src/mapping_matrix.h b/external/opus-1.3.1/src/mapping_matrix.h new file mode 100644 index 00000000..98bc82df --- /dev/null +++ b/external/opus-1.3.1/src/mapping_matrix.h @@ -0,0 +1,133 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * @file mapping_matrix.h + * @brief Opus reference implementation mapping matrix API + */ + +#ifndef MAPPING_MATRIX_H +#define MAPPING_MATRIX_H + +#include "opus_types.h" +#include "opus_projection.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct MappingMatrix +{ + int rows; /* number of channels outputted from matrix. */ + int cols; /* number of channels inputted to matrix. */ + int gain; /* in dB. S7.8-format. */ + /* Matrix cell data goes here using col-wise ordering. */ +} MappingMatrix; + +opus_int32 mapping_matrix_get_size(int rows, int cols); + +opus_int16 *mapping_matrix_get_data(const MappingMatrix *matrix); + +void mapping_matrix_init( + MappingMatrix * const matrix, + int rows, + int cols, + int gain, + const opus_int16 *data, + opus_int32 data_size +); + +#ifndef DISABLE_FLOAT_API +void mapping_matrix_multiply_channel_in_float( + const MappingMatrix *matrix, + const float *input, + int input_rows, + opus_val16 *output, + int output_row, + int output_rows, + int frame_size +); + +void mapping_matrix_multiply_channel_out_float( + const MappingMatrix *matrix, + const opus_val16 *input, + int input_row, + int input_rows, + float *output, + int output_rows, + int frame_size +); +#endif /* DISABLE_FLOAT_API */ + +void mapping_matrix_multiply_channel_in_short( + const MappingMatrix *matrix, + const opus_int16 *input, + int input_rows, + opus_val16 *output, + int output_row, + int output_rows, + int frame_size +); + +void mapping_matrix_multiply_channel_out_short( + const MappingMatrix *matrix, + const opus_val16 *input, + int input_row, + int input_rows, + opus_int16 *output, + int output_rows, + int frame_size +); + +/* Pre-computed mixing and demixing matrices for 1st to 3rd-order ambisonics. + * foa: first-order ambisonics + * soa: second-order ambisonics + * toa: third-order ambisonics + */ +extern const MappingMatrix mapping_matrix_foa_mixing; +extern const opus_int16 mapping_matrix_foa_mixing_data[36]; + +extern const MappingMatrix mapping_matrix_soa_mixing; +extern const opus_int16 mapping_matrix_soa_mixing_data[121]; + +extern const MappingMatrix mapping_matrix_toa_mixing; +extern const opus_int16 mapping_matrix_toa_mixing_data[324]; + +extern const MappingMatrix mapping_matrix_foa_demixing; +extern const opus_int16 mapping_matrix_foa_demixing_data[36]; + +extern const MappingMatrix mapping_matrix_soa_demixing; +extern const opus_int16 mapping_matrix_soa_demixing_data[121]; + +extern const MappingMatrix mapping_matrix_toa_demixing; +extern const opus_int16 mapping_matrix_toa_demixing_data[324]; + +#ifdef __cplusplus +} +#endif + +#endif /* MAPPING_MATRIX_H */ diff --git a/external/opus-1.3.1/src/mlp.c b/external/opus-1.3.1/src/mlp.c new file mode 100644 index 00000000..964c6a98 --- /dev/null +++ b/external/opus-1.3.1/src/mlp.c @@ -0,0 +1,144 @@ +/* Copyright (c) 2008-2011 Octasic Inc. + 2012-2017 Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "opus_types.h" +#include "opus_defines.h" +#include "arch.h" +#include "tansig_table.h" +#include "mlp.h" + +static OPUS_INLINE float tansig_approx(float x) +{ + int i; + float y, dy; + float sign=1; + /* Tests are reversed to catch NaNs */ + if (!(x<8)) + return 1; + if (!(x>-8)) + return -1; +#ifndef FIXED_POINT + /* Another check in case of -ffast-math */ + if (celt_isnan(x)) + return 0; +#endif + if (x<0) + { + x=-x; + sign=-1; + } + i = (int)floor(.5f+25*x); + x -= .04f*i; + y = tansig_table[i]; + dy = 1-y*y; + y = y + x*dy*(1 - y*x); + return sign*y; +} + +static OPUS_INLINE float sigmoid_approx(float x) +{ + return .5f + .5f*tansig_approx(.5f*x); +} + +static void gemm_accum(float *out, const opus_int8 *weights, int rows, int cols, int col_stride, const float *x) +{ + int i, j; + for (i=0;inb_inputs; + N = layer->nb_neurons; + stride = N; + for (i=0;ibias[i]; + gemm_accum(output, layer->input_weights, N, M, stride, input); + for (i=0;isigmoid) { + for (i=0;inb_inputs; + N = gru->nb_neurons; + stride = 3*N; + /* Compute update gate. */ + for (i=0;ibias[i]; + gemm_accum(z, gru->input_weights, N, M, stride, input); + gemm_accum(z, gru->recurrent_weights, N, N, stride, state); + for (i=0;ibias[N + i]; + gemm_accum(r, &gru->input_weights[N], N, M, stride, input); + gemm_accum(r, &gru->recurrent_weights[N], N, N, stride, state); + for (i=0;ibias[2*N + i]; + for (i=0;iinput_weights[2*N], N, M, stride, input); + gemm_accum(h, &gru->recurrent_weights[2*N], N, N, stride, tmp); + for (i=0;i=0) + break; + x[i*C] = x[i*C]+a*x[i*C]*x[i*C]; + } + + curr=0; + x0 = x[0]; + while(1) + { + int start, end; + float maxval; + int special=0; + int peak_pos; + for (i=curr;i1 || x[i*C]<-1) + break; + } + if (i==N) + { + a=0; + break; + } + peak_pos = i; + start=end=i; + maxval=ABS16(x[i*C]); + /* Look for first zero crossing before clipping */ + while (start>0 && x[i*C]*x[(start-1)*C]>=0) + start--; + /* Look for first zero crossing after clipping */ + while (end=0) + { + /* Look for other peaks until the next zero-crossing. */ + if (ABS16(x[end*C])>maxval) + { + maxval = ABS16(x[end*C]); + peak_pos = end; + } + end++; + } + /* Detect the special case where we clip before the first zero crossing */ + special = (start==0 && x[i*C]*x[0]>=0); + + /* Compute a such that maxval + a*maxval^2 = 1 */ + a=(maxval-1)/(maxval*maxval); + /* Slightly boost "a" by 2^-22. This is just enough to ensure -ffast-math + does not cause output values larger than +/-1, but small enough not + to matter even for 24-bit output. */ + a += a*2.4e-7f; + if (x[i*C]>0) + a = -a; + /* Apply soft clipping */ + for (i=start;i=2) + { + /* Add a linear ramp from the first sample to the signal peak. + This avoids a discontinuity at the beginning of the frame. */ + float delta; + float offset = x0-x[0]; + delta = offset / peak_pos; + for (i=curr;i>2; + return 2; + } +} + +static int parse_size(const unsigned char *data, opus_int32 len, opus_int16 *size) +{ + if (len<1) + { + *size = -1; + return -1; + } else if (data[0]<252) + { + *size = data[0]; + return 1; + } else if (len<2) + { + *size = -1; + return -1; + } else { + *size = 4*data[1] + data[0]; + return 2; + } +} + +int opus_packet_get_samples_per_frame(const unsigned char *data, + opus_int32 Fs) +{ + int audiosize; + if (data[0]&0x80) + { + audiosize = ((data[0]>>3)&0x3); + audiosize = (Fs<>3)&0x3); + if (audiosize == 3) + audiosize = Fs*60/1000; + else + audiosize = (Fs< len) + return OPUS_INVALID_PACKET; + data += bytes; + last_size = len-size[0]; + break; + /* Multiple CBR/VBR frames (from 0 to 120 ms) */ + default: /*case 3:*/ + if (len<1) + return OPUS_INVALID_PACKET; + /* Number of frames encoded in bits 0 to 5 */ + ch = *data++; + count = ch&0x3F; + if (count <= 0 || framesize*(opus_int32)count > 5760) + return OPUS_INVALID_PACKET; + len--; + /* Padding flag is bit 6 */ + if (ch&0x40) + { + int p; + do { + int tmp; + if (len<=0) + return OPUS_INVALID_PACKET; + p = *data++; + len--; + tmp = p==255 ? 254: p; + len -= tmp; + pad += tmp; + } while (p==255); + } + if (len<0) + return OPUS_INVALID_PACKET; + /* VBR flag is bit 7 */ + cbr = !(ch&0x80); + if (!cbr) + { + /* VBR case */ + last_size = len; + for (i=0;i len) + return OPUS_INVALID_PACKET; + data += bytes; + last_size -= bytes+size[i]; + } + if (last_size<0) + return OPUS_INVALID_PACKET; + } else if (!self_delimited) + { + /* CBR case */ + last_size = len/count; + if (last_size*count!=len) + return OPUS_INVALID_PACKET; + for (i=0;i len) + return OPUS_INVALID_PACKET; + data += bytes; + /* For CBR packets, apply the size to all the frames. */ + if (cbr) + { + if (size[count-1]*count > len) + return OPUS_INVALID_PACKET; + for (i=0;i last_size) + return OPUS_INVALID_PACKET; + } else + { + /* Because it's not encoded explicitly, it's possible the size of the + last packet (or all the packets, for the CBR case) is larger than + 1275. Reject them here.*/ + if (last_size > 1275) + return OPUS_INVALID_PACKET; + size[count-1] = (opus_int16)last_size; + } + + if (payload_offset) + *payload_offset = (int)(data-data0); + + for (i=0;i= 2) && !defined(__OPTIMIZE__) && !defined(OPUS_WILL_BE_SLOW) +# pragma message "You appear to be compiling without optimization, if so opus will be very slow." #endif #include @@ -46,6 +50,7 @@ #include "structs.h" #include "define.h" #include "mathops.h" +#include "cpu_support.h" struct OpusDecoder { int celt_dec_offset; @@ -54,6 +59,7 @@ struct OpusDecoder { opus_int32 Fs; /** Sampling rate (at the API level) */ silk_DecControlStruct DecControl; int decode_gain; + int arch; /* Everything beyond this point gets cleared on a reset */ #define OPUS_DECODER_RESET_START stream_channels @@ -65,17 +71,34 @@ struct OpusDecoder { int frame_size; int prev_redundancy; int last_packet_duration; +#ifndef FIXED_POINT + opus_val16 softclip_mem[2]; +#endif opus_uint32 rangeFinal; }; -#ifdef FIXED_POINT -static inline opus_int16 SAT16(opus_int32 x) { - return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; +#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) +static void validate_opus_decoder(OpusDecoder *st) +{ + celt_assert(st->channels == 1 || st->channels == 2); + celt_assert(st->Fs == 48000 || st->Fs == 24000 || st->Fs == 16000 || st->Fs == 12000 || st->Fs == 8000); + celt_assert(st->DecControl.API_sampleRate == st->Fs); + celt_assert(st->DecControl.internalSampleRate == 0 || st->DecControl.internalSampleRate == 16000 || st->DecControl.internalSampleRate == 12000 || st->DecControl.internalSampleRate == 8000); + celt_assert(st->DecControl.nChannelsAPI == st->channels); + celt_assert(st->DecControl.nChannelsInternal == 0 || st->DecControl.nChannelsInternal == 1 || st->DecControl.nChannelsInternal == 2); + celt_assert(st->DecControl.payloadSize_ms == 0 || st->DecControl.payloadSize_ms == 10 || st->DecControl.payloadSize_ms == 20 || st->DecControl.payloadSize_ms == 40 || st->DecControl.payloadSize_ms == 60); +#ifdef OPUS_ARCHMASK + celt_assert(st->arch >= 0); + celt_assert(st->arch <= OPUS_ARCHMASK); +#endif + celt_assert(st->stream_channels == 1 || st->stream_channels == 2); } +#define VALIDATE_OPUS_DECODER(st) validate_opus_decoder(st) +#else +#define VALIDATE_OPUS_DECODER(st) #endif - int opus_decoder_get_size(int channels) { int silkDecSizeBytes, celtDecSizeBytes; @@ -101,7 +124,7 @@ int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels) return OPUS_BAD_ARG; OPUS_CLEAR((char*)st, opus_decoder_get_size(channels)); - /* Initialize SILK encoder */ + /* Initialize SILK decoder */ ret = silk_Get_Decoder_Size(&silkDecSizeBytes); if (ret) return OPUS_INTERNAL_ERROR; @@ -129,6 +152,7 @@ int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels) st->prev_mode = 0; st->frame_size = Fs/400; + st->arch = opus_select_arch(); return OPUS_OK; } @@ -201,12 +225,19 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, int i, silk_ret=0, celt_ret=0; ec_dec dec; opus_int32 silk_frame_size; + int pcm_silk_size; VARDECL(opus_int16, pcm_silk); - VARDECL(opus_val16, pcm_transition); + int pcm_transition_silk_size; + VARDECL(opus_val16, pcm_transition_silk); + int pcm_transition_celt_size; + VARDECL(opus_val16, pcm_transition_celt); + opus_val16 *pcm_transition=NULL; + int redundant_audio_size; VARDECL(opus_val16, redundant_audio); int audiosize; int mode; + int bandwidth; int transition=0; int start_band; int redundancy=0; @@ -216,6 +247,7 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, int F2_5, F5, F10, F20; const opus_val16 *window; opus_uint32 redundant_rng = 0; + int celt_accum; ALLOC_STACK; silk_dec = (char*)st+st->silk_dec_offset; @@ -242,36 +274,74 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, { audiosize = st->frame_size; mode = st->mode; + bandwidth = st->bandwidth; ec_dec_init(&dec,(unsigned char*)data,len); } else { audiosize = frame_size; + mode = st->prev_mode; + bandwidth = 0; - if (st->prev_mode == 0) + if (mode == 0) { /* If we haven't got any packet yet, all we can do is return zeros */ for (i=0;ichannels;i++) pcm[i] = 0; RESTORE_STACK; return audiosize; - } else { - mode = st->prev_mode; + } + + /* Avoids trying to run the PLC on sizes other than 2.5 (CELT), 5 (CELT), + 10, or 20 (e.g. 12.5 or 30 ms). */ + if (audiosize > F20) + { + do { + int ret = opus_decode_frame(st, NULL, 0, pcm, IMIN(audiosize, F20), 0); + if (ret<0) + { + RESTORE_STACK; + return ret; + } + pcm += ret*st->channels; + audiosize -= ret; + } while (audiosize > 0); + RESTORE_STACK; + return frame_size; + } else if (audiosize < F20) + { + if (audiosize > F10) + audiosize = F10; + else if (mode != MODE_SILK_ONLY && audiosize > F5 && audiosize < F10) + audiosize = F5; } } - /* For CELT/hybrid PLC of more than 20 ms, opus_decode_native() will do - multiple calls */ - if (data==NULL && mode != MODE_SILK_ONLY) - frame_size = IMIN(frame_size, F20); - ALLOC(pcm_transition, F5*st->channels, opus_val16); + /* In fixed-point, we can tell CELT to do the accumulation on top of the + SILK PCM buffer. This saves some stack space. */ +#ifdef FIXED_POINT + celt_accum = (mode != MODE_CELT_ONLY) && (frame_size >= F10); +#else + celt_accum = 0; +#endif + pcm_transition_silk_size = ALLOC_NONE; + pcm_transition_celt_size = ALLOC_NONE; if (data!=NULL && st->prev_mode > 0 && ( (mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY && !st->prev_redundancy) || (mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) ) ) { transition = 1; + /* Decide where to allocate the stack memory for pcm_transition */ if (mode == MODE_CELT_ONLY) - opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); + pcm_transition_celt_size = F5*st->channels; + else + pcm_transition_silk_size = F5*st->channels; + } + ALLOC(pcm_transition_celt, pcm_transition_celt_size, opus_val16); + if (transition && mode == MODE_CELT_ONLY) + { + pcm_transition = pcm_transition_celt; + opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); } if (audiosize > frame_size) { @@ -282,14 +352,21 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, frame_size = audiosize; } - ALLOC(pcm_silk, IMAX(F10, frame_size)*st->channels, opus_int16); - ALLOC(redundant_audio, F5*st->channels, opus_val16); + /* Don't allocate any memory when in CELT-only mode */ + pcm_silk_size = (mode != MODE_CELT_ONLY && !celt_accum) ? IMAX(F10, frame_size)*st->channels : ALLOC_NONE; + ALLOC(pcm_silk, pcm_silk_size, opus_int16); /* SILK processing */ if (mode != MODE_CELT_ONLY) { int lost_flag, decoded_samples; - opus_int16 *pcm_ptr = pcm_silk; + opus_int16 *pcm_ptr; +#ifdef FIXED_POINT + if (celt_accum) + pcm_ptr = pcm; + else +#endif + pcm_ptr = pcm_silk; if (st->prev_mode==MODE_CELT_ONLY) silk_InitDecoder( silk_dec ); @@ -301,15 +378,15 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, { st->DecControl.nChannelsInternal = st->stream_channels; if( mode == MODE_SILK_ONLY ) { - if( st->bandwidth == OPUS_BANDWIDTH_NARROWBAND ) { + if( bandwidth == OPUS_BANDWIDTH_NARROWBAND ) { st->DecControl.internalSampleRate = 8000; - } else if( st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND ) { + } else if( bandwidth == OPUS_BANDWIDTH_MEDIUMBAND ) { st->DecControl.internalSampleRate = 12000; - } else if( st->bandwidth == OPUS_BANDWIDTH_WIDEBAND ) { + } else if( bandwidth == OPUS_BANDWIDTH_WIDEBAND ) { st->DecControl.internalSampleRate = 16000; } else { st->DecControl.internalSampleRate = 16000; - silk_assert( 0 ); + celt_assert( 0 ); } } else { /* Hybrid mode */ @@ -323,7 +400,7 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, /* Call SILK decoder */ int first_frame = decoded_samples == 0; silk_ret = silk_Decode( silk_dec, &st->DecControl, - lost_flag, first_frame, &dec, pcm_ptr, &silk_frame_size ); + lost_flag, first_frame, &dec, pcm_ptr, &silk_frame_size, st->arch ); if( silk_ret ) { if (lost_flag) { /* PLC failure should not be fatal */ @@ -332,7 +409,7 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, pcm_ptr[i] = 0; } else { RESTORE_STACK; - return OPUS_INVALID_PACKET; + return OPUS_INTERNAL_ERROR; } } pcm_ptr += silk_frame_size * st->channels; @@ -373,10 +450,26 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, if (mode != MODE_CELT_ONLY) start_band = 17; + if (redundancy) + { + transition = 0; + pcm_transition_silk_size=ALLOC_NONE; + } + + ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16); + + if (transition && mode != MODE_CELT_ONLY) + { + pcm_transition = pcm_transition_silk; + opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); + } + + + if (bandwidth) { int endband=21; - switch(st->bandwidth) + switch(bandwidth) { case OPUS_BANDWIDTH_NARROWBAND: endband = 13; @@ -391,56 +484,60 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, case OPUS_BANDWIDTH_FULLBAND: endband = 21; break; + default: + celt_assert(0); + break; } - celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband)); - celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels)); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband))); } + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels))); - if (redundancy) - transition = 0; - - if (transition && mode != MODE_CELT_ONLY) - opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); + /* Only allocation memory for redundancy if/when needed */ + redundant_audio_size = redundancy ? F5*st->channels : ALLOC_NONE; + ALLOC(redundant_audio, redundant_audio_size, opus_val16); /* 5 ms redundant frame for CELT->SILK*/ if (redundancy && celt_to_silk) { - celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, - redundant_audio, F5, NULL); - celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng)); + redundant_audio, F5, NULL, 0); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng))); } /* MUST be after PLC */ - celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(start_band)); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(start_band))); if (mode != MODE_SILK_ONLY) { int celt_frame_size = IMIN(F20, frame_size); /* Make sure to discard any previous CELT state */ if (mode != st->prev_mode && st->prev_mode > 0 && !st->prev_redundancy) - celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_RESET_STATE)); /* Decode CELT */ celt_ret = celt_decode_with_ec(celt_dec, decode_fec ? NULL : data, - len, pcm, celt_frame_size, &dec); + len, pcm, celt_frame_size, &dec, celt_accum); } else { unsigned char silence[2] = {0xFF, 0xFF}; - for (i=0;ichannels;i++) - pcm[i] = 0; + if (!celt_accum) + { + for (i=0;ichannels;i++) + pcm[i] = 0; + } /* For hybrid -> SILK transitions, we let the CELT MDCT do a fade-out by decoding a silence frame */ if (st->prev_mode == MODE_HYBRID && !(redundancy && celt_to_silk && st->prev_redundancy) ) { - celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); - celt_decode_with_ec(celt_dec, silence, 2, pcm, F2_5, NULL); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); + celt_decode_with_ec(celt_dec, silence, 2, pcm, F2_5, NULL, celt_accum); } } - if (mode != MODE_CELT_ONLY) + if (mode != MODE_CELT_ONLY && !celt_accum) { #ifdef FIXED_POINT for (i=0;ichannels;i++) - pcm[i] = SAT16(pcm[i] + pcm_silk[i]); + pcm[i] = SAT16(ADD32(pcm[i], pcm_silk[i])); #else for (i=0;ichannels;i++) pcm[i] = pcm[i] + (opus_val16)((1.f/32768.f)*pcm_silk[i]); @@ -449,18 +546,18 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, { const CELTMode *celt_mode; - celt_decoder_ctl(celt_dec, CELT_GET_MODE(&celt_mode)); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_GET_MODE(&celt_mode))); window = celt_mode->window; } /* 5 ms redundant frame for SILK->CELT */ if (redundancy && !celt_to_silk) { - celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); - celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_RESET_STATE)); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); - celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, redundant_audio, F5, NULL); - celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng)); + celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, redundant_audio, F5, NULL, 0); + MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng))); smooth_fade(pcm+st->channels*(frame_size-F2_5), redundant_audio+st->channels*F2_5, pcm+st->channels*(frame_size-F2_5), F2_5, st->channels, window, st->Fs); } @@ -514,197 +611,29 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, st->prev_mode = mode; st->prev_redundancy = redundancy && !celt_to_silk; - RESTORE_STACK; - return celt_ret < 0 ? celt_ret : audiosize; -} - -static int parse_size(const unsigned char *data, opus_int32 len, opus_int16 *size) -{ - if (len<1) - { - *size = -1; - return -1; - } else if (data[0]<252) + if (celt_ret>=0) { - *size = data[0]; - return 1; - } else if (len<2) - { - *size = -1; - return -1; - } else { - *size = 4*data[1] + data[0]; - return 2; + if (OPUS_CHECK_ARRAY(pcm, audiosize*st->channels)) + OPUS_PRINT_INT(audiosize); } -} -static int opus_packet_parse_impl(const unsigned char *data, opus_int32 len, - int self_delimited, unsigned char *out_toc, - const unsigned char *frames[48], opus_int16 size[48], int *payload_offset) -{ - int i, bytes; - int count; - int cbr; - unsigned char ch, toc; - int framesize; - opus_int32 last_size; - const unsigned char *data0 = data; - - if (size==NULL) - return OPUS_BAD_ARG; - - framesize = opus_packet_get_samples_per_frame(data, 48000); - - cbr = 0; - toc = *data++; - len--; - last_size = len; - switch (toc&0x3) - { - /* One frame */ - case 0: - count=1; - break; - /* Two CBR frames */ - case 1: - count=2; - cbr = 1; - if (!self_delimited) - { - if (len&0x1) - return OPUS_INVALID_PACKET; - last_size = len/2; - /* If last_size doesn't fit in size[0], we'll catch it later */ - size[0] = (opus_int16)last_size; - } - break; - /* Two VBR frames */ - case 2: - count = 2; - bytes = parse_size(data, len, size); - len -= bytes; - if (size[0]<0 || size[0] > len) - return OPUS_INVALID_PACKET; - data += bytes; - last_size = len-size[0]; - break; - /* Multiple CBR/VBR frames (from 0 to 120 ms) */ - default: /*case 3:*/ - if (len<1) - return OPUS_INVALID_PACKET; - /* Number of frames encoded in bits 0 to 5 */ - ch = *data++; - count = ch&0x3F; - if (count <= 0 || framesize*count > 5760) - return OPUS_INVALID_PACKET; - len--; - /* Padding flag is bit 6 */ - if (ch&0x40) - { - int p; - do { - if (len<=0) - return OPUS_INVALID_PACKET; - p = *data++; - len--; - len -= p==255 ? 254: p; - } while (p==255); - } - if (len<0) - return OPUS_INVALID_PACKET; - /* VBR flag is bit 7 */ - cbr = !(ch&0x80); - if (!cbr) - { - /* VBR case */ - last_size = len; - for (i=0;i len) - return OPUS_INVALID_PACKET; - data += bytes; - last_size -= bytes+size[i]; - } - if (last_size<0) - return OPUS_INVALID_PACKET; - } else if (!self_delimited) - { - /* CBR case */ - last_size = len/count; - if (last_size*count!=len) - return OPUS_INVALID_PACKET; - for (i=0;i len) - return OPUS_INVALID_PACKET; - data += bytes; - /* For CBR packets, apply the size to all the frames. */ - if (cbr) - { - if (size[count-1]*count > len) - return OPUS_INVALID_PACKET; - for (i=0;i last_size) - return OPUS_INVALID_PACKET; - } else - { - /* Because it's not encoded explicitly, it's possible the size of the - last packet (or all the packets, for the CBR case) is larger than - 1275. Reject them here.*/ - if (last_size > 1275) - return OPUS_INVALID_PACKET; - size[count-1] = (opus_int16)last_size; - } - - if (frames) - { - for (i=0;i1) return OPUS_BAD_ARG; /* For FEC/PLC, frame_size has to be to have a multiple of 2.5 ms */ @@ -715,12 +644,14 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, int pcm_count=0; do { int ret; - ret = opus_decode_frame(st, NULL, 0, pcm, frame_size-pcm_count, 0); + ret = opus_decode_frame(st, NULL, 0, pcm+pcm_count*st->channels, frame_size-pcm_count, 0); if (ret<0) return ret; - pcm += st->channels*ret; pcm_count += ret; } while (pcm_count < frame_size); + celt_assert(pcm_count == frame_size); + if (OPUS_CHECK_ARRAY(pcm, pcm_count*st->channels)) + OPUS_PRINT_INT(pcm_count); st->last_packet_duration = pcm_count; return pcm_count; } else if (len<0) @@ -731,7 +662,10 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, packet_frame_size = opus_packet_get_samples_per_frame(data, st->Fs); packet_stream_channels = opus_packet_get_nb_channels(data); - count = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL, size, &offset); + count = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL, + size, &offset, packet_offset); + if (count<0) + return count; data += offset; @@ -741,12 +675,12 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, int ret; /* If no FEC can be present, run the PLC (recursive call) */ if (frame_size < packet_frame_size || packet_mode == MODE_CELT_ONLY || st->mode == MODE_CELT_ONLY) - return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL); + return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, soft_clip); /* Otherwise, run the PLC on everything except the size for which we might have FEC */ duration_copy = st->last_packet_duration; if (frame_size-packet_frame_size!=0) { - ret = opus_decode_native(st, NULL, 0, pcm, frame_size-packet_frame_size, 0, 0, NULL); + ret = opus_decode_native(st, NULL, 0, pcm, frame_size-packet_frame_size, 0, 0, NULL, soft_clip); if (ret<0) { st->last_packet_duration = duration_copy; @@ -763,14 +697,13 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, packet_frame_size, 1); if (ret<0) return ret; - st->last_packet_duration = frame_size; - return frame_size; + else { + if (OPUS_CHECK_ARRAY(pcm, frame_size*st->channels)) + OPUS_PRINT_INT(frame_size); + st->last_packet_duration = frame_size; + return frame_size; + } } - tot_offset = 0; - if (count < 0) - return count; - - tot_offset += offset; if (count*packet_frame_size > frame_size) return OPUS_BUFFER_TOO_SMALL; @@ -785,17 +718,22 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, for (i=0;ichannels, frame_size-nb_samples, 0); if (ret<0) return ret; + celt_assert(ret==packet_frame_size); data += size[i]; - tot_offset += size[i]; - pcm += ret*st->channels; nb_samples += ret; } - if (packet_offset != NULL) - *packet_offset = tot_offset; st->last_packet_duration = nb_samples; + if (OPUS_CHECK_ARRAY(pcm, nb_samples*st->channels)) + OPUS_PRINT_INT(nb_samples); +#ifndef FIXED_POINT + if (soft_clip) + opus_pcm_soft_clip(pcm, nb_samples, st->channels, st->softclip_mem); + else + st->softclip_mem[0]=st->softclip_mem[1]=0; +#endif return nb_samples; } @@ -804,7 +742,9 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, int opus_decode(OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) { - return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL); + if(frame_size<=0) + return OPUS_BAD_ARG; + return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0); } #ifndef DISABLE_FLOAT_API @@ -813,11 +753,26 @@ int opus_decode_float(OpusDecoder *st, const unsigned char *data, { VARDECL(opus_int16, out); int ret, i; + int nb_samples; ALLOC_STACK; + if(frame_size<=0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + if (data != NULL && len > 0 && !decode_fec) + { + nb_samples = opus_decoder_get_nb_samples(st, data, len); + if (nb_samples>0) + frame_size = IMIN(frame_size, nb_samples); + else + return OPUS_INVALID_PACKET; + } + celt_assert(st->channels == 1 || st->channels == 2); ALLOC(out, frame_size*st->channels, opus_int16); - ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL); + ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 0); if (ret > 0) { for (i=0;ichannels;i++) @@ -835,17 +790,27 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, { VARDECL(float, out); int ret, i; + int nb_samples; ALLOC_STACK; - if(frame_size<0) + if(frame_size<=0) { RESTORE_STACK; return OPUS_BAD_ARG; } + if (data != NULL && len > 0 && !decode_fec) + { + nb_samples = opus_decoder_get_nb_samples(st, data, len); + if (nb_samples>0) + frame_size = IMIN(frame_size, nb_samples); + else + return OPUS_INVALID_PACKET; + } + celt_assert(st->channels == 1 || st->channels == 2); ALLOC(out, frame_size*st->channels, float); - ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL); + ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 1); if (ret > 0) { for (i=0;ichannels;i++) @@ -858,7 +823,9 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, int opus_decode_float(OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) { - return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL); + if(frame_size<=0) + return OPUS_BAD_ARG; + return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0); } #endif @@ -881,12 +848,20 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) case OPUS_GET_BANDWIDTH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } *value = st->bandwidth; } break; case OPUS_GET_FINAL_RANGE_REQUEST: { opus_uint32 *value = va_arg(ap, opus_uint32*); + if (!value) + { + goto bad_arg; + } *value = st->rangeFinal; } break; @@ -905,10 +880,9 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) case OPUS_GET_SAMPLE_RATE_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); - if (value==NULL) + if (!value) { - ret = OPUS_BAD_ARG; - break; + goto bad_arg; } *value = st->Fs; } @@ -916,13 +890,12 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) case OPUS_GET_PITCH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); - if (value==NULL) + if (!value) { - ret = OPUS_BAD_ARG; - break; + goto bad_arg; } if (st->prev_mode == MODE_CELT_ONLY) - celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value)); + ret = celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value)); else *value = st->DecControl.prevPitchLag; } @@ -930,10 +903,9 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) case OPUS_GET_GAIN_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); - if (value==NULL) + if (!value) { - ret = OPUS_BAD_ARG; - break; + goto bad_arg; } *value = st->decode_gain; } @@ -943,18 +915,41 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) opus_int32 value = va_arg(ap, opus_int32); if (value<-32768 || value>32767) { - ret = OPUS_BAD_ARG; - break; + goto bad_arg; } st->decode_gain = value; } break; case OPUS_GET_LAST_PACKET_DURATION_REQUEST: { - opus_uint32 *value = va_arg(ap, opus_uint32*); + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } *value = st->last_packet_duration; } break; + case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + ret = celt_decoder_ctl(celt_dec, OPUS_SET_PHASE_INVERSION_DISABLED(value)); + } + break; + case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + ret = celt_decoder_ctl(celt_dec, OPUS_GET_PHASE_INVERSION_DISABLED(value)); + } + break; default: /*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/ ret = OPUS_UNIMPLEMENTED; @@ -963,6 +958,9 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) va_end(ap); return ret; +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; } void opus_decoder_destroy(OpusDecoder *st) @@ -989,27 +987,6 @@ int opus_packet_get_bandwidth(const unsigned char *data) return bandwidth; } -int opus_packet_get_samples_per_frame(const unsigned char *data, - opus_int32 Fs) -{ - int audiosize; - if (data[0]&0x80) - { - audiosize = ((data[0]>>3)&0x3); - audiosize = (Fs<>3)&0x3); - if (audiosize == 3) - audiosize = Fs*60/1000; - else - audiosize = (Fs< [options] \n", argv[0]); fprintf(stderr, " %s -d " "[options] \n\n", argv[0]); - fprintf(stderr, "mode: voip | audio | restricted-lowdelay\n" ); + fprintf(stderr, "application: voip | audio | restricted-lowdelay\n" ); fprintf(stderr, "options:\n" ); fprintf(stderr, "-e : only runs the encoder (output the bit-stream)\n" ); fprintf(stderr, "-d : only runs the decoder (reads the bit-stream as input)\n" ); fprintf(stderr, "-cbr : enable constant bitrate; default: variable bitrate\n" ); fprintf(stderr, "-cvbr : enable constrained variable bitrate; default: unconstrained\n" ); + fprintf(stderr, "-delayed-decision : use look-ahead for speech/music detection (experts only); default: disabled\n" ); fprintf(stderr, "-bandwidth : audio bandwidth (from narrowband to fullband); default: sampling rate\n" ); - fprintf(stderr, "-framesize <2.5|5|10|20|40|60> : frame size in ms; default: 20 \n" ); + fprintf(stderr, "-framesize <2.5|5|10|20|40|60|80|100|120> : frame size in ms; default: 20 \n" ); fprintf(stderr, "-max_payload : maximum payload size in bytes, default: 1024\n" ); fprintf(stderr, "-complexity : complexity, 0 (lowest) ... 10 (highest); default: 10\n" ); fprintf(stderr, "-inbandfec : enable SILK inband FEC\n" ); @@ -77,23 +79,7 @@ static opus_uint32 char_to_int(unsigned char ch[4]) | ((opus_uint32)ch[2]<< 8) | (opus_uint32)ch[3]; } -static void check_decoder_option(int encode_only, const char *opt) -{ - if (encode_only) - { - fprintf(stderr, "option %s is only for decoding\n", opt); - exit(EXIT_FAILURE); - } -} - -static void check_encoder_option(int decode_only, const char *opt) -{ - if (decode_only) - { - fprintf(stderr, "option %s is only for encoding\n", opt); - exit(EXIT_FAILURE); - } -} +#define check_encoder_option(decode_only, opt) do {if (decode_only) {fprintf(stderr, "option %s is only for encoding\n", opt); goto failure;}} while(0) static const int silk8_test[][4] = { {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*3, 1}, @@ -192,19 +178,49 @@ static const int celt_hq_test[][4] = { {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 2}, }; +#if 0 /* This is a hack that replaces the normal encoder/decoder with the multistream version */ +#define OpusEncoder OpusMSEncoder +#define OpusDecoder OpusMSDecoder +#define opus_encode opus_multistream_encode +#define opus_decode opus_multistream_decode +#define opus_encoder_ctl opus_multistream_encoder_ctl +#define opus_decoder_ctl opus_multistream_decoder_ctl +#define opus_encoder_create ms_opus_encoder_create +#define opus_decoder_create ms_opus_decoder_create +#define opus_encoder_destroy opus_multistream_encoder_destroy +#define opus_decoder_destroy opus_multistream_decoder_destroy + +static OpusEncoder *ms_opus_encoder_create(opus_int32 Fs, int channels, int application, int *error) +{ + int streams, coupled_streams; + unsigned char mapping[256]; + return (OpusEncoder *)opus_multistream_surround_encoder_create(Fs, channels, 1, &streams, &coupled_streams, mapping, application, error); +} +static OpusDecoder *ms_opus_decoder_create(opus_int32 Fs, int channels, int *error) +{ + int streams; + int coupled_streams; + unsigned char mapping[256]={0,1}; + streams = 1; + coupled_streams = channels==2; + return (OpusDecoder *)opus_multistream_decoder_create(Fs, channels, streams, coupled_streams, mapping, error); +} +#endif + int main(int argc, char *argv[]) { int err; char *inFile, *outFile; - FILE *fin, *fout; + FILE *fin=NULL; + FILE *fout=NULL; OpusEncoder *enc=NULL; OpusDecoder *dec=NULL; int args; int len[2]; int frame_size, channels; opus_int32 bitrate_bps=0; - unsigned char *data[2]; - unsigned char *fbytes; + unsigned char *data[2] = {NULL, NULL}; + unsigned char *fbytes=NULL; opus_int32 sampling_rate; int use_vbr; int max_payload_bytes; @@ -218,17 +234,21 @@ int main(int argc, char *argv[]) int k; opus_int32 skip=0; int stop=0; - short *in, *out; + short *in=NULL; + short *out=NULL; int application=OPUS_APPLICATION_AUDIO; double bits=0.0, bits_max=0.0, bits_act=0.0, bits2=0.0, nrg; - int bandwidth=-1; + double tot_samples=0; + opus_uint64 tot_in, tot_out; + int bandwidth=OPUS_AUTO; const char *bandwidth_string; int lost = 0, lost_prev = 1; int toggle = 0; opus_uint32 enc_final_range[2]; opus_uint32 dec_final_range; int encode_only=0, decode_only=0; - int max_frame_size = 960*6; + int max_frame_size = 48000*2; + size_t num_read; int curr_read=0; int sweep_bps = 0; int random_framesize=0, newsize=0, delayed_celt=0; @@ -239,13 +259,19 @@ int main(int argc, char *argv[]) int curr_mode=0; int curr_mode_count=0; int mode_switch_time = 48000; + int nb_encoded=0; + int remaining=0; + int variable_duration=OPUS_FRAMESIZE_ARG; + int delayed_decision=0; + int ret = EXIT_FAILURE; if (argc < 5 ) { print_usage( argv ); - return EXIT_FAILURE; + goto failure; } + tot_in=tot_out=0; fprintf(stderr, "%s\n", opus_get_version_string()); args = 1; @@ -261,7 +287,7 @@ int main(int argc, char *argv[]) if (!decode_only && argc < 7 ) { print_usage( argv ); - return EXIT_FAILURE; + goto failure; } if (!decode_only) @@ -273,19 +299,12 @@ int main(int argc, char *argv[]) else if (strcmp(argv[args], "audio")!=0) { fprintf(stderr, "unknown application: %s\n", argv[args]); print_usage(argv); - return EXIT_FAILURE; + goto failure; } args++; } sampling_rate = (opus_int32)atol(argv[args]); args++; - channels = atoi(argv[args]); - args++; - if (!decode_only) - { - bitrate_bps = (opus_int32)atol(argv[args]); - args++; - } if (sampling_rate != 8000 && sampling_rate != 12000 && sampling_rate != 16000 && sampling_rate != 24000 @@ -293,21 +312,33 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Supported sampling rates are 8000, 12000, " "16000, 24000 and 48000.\n"); - return EXIT_FAILURE; + goto failure; } frame_size = sampling_rate/50; + channels = atoi(argv[args]); + args++; + + if (channels < 1 || channels > 2) + { + fprintf(stderr, "Opus_demo supports only 1 or 2 channels.\n"); + goto failure; + } + + if (!decode_only) + { + bitrate_bps = (opus_int32)atol(argv[args]); + args++; + } + /* defaults: */ use_vbr = 1; - bandwidth = OPUS_AUTO; max_payload_bytes = MAX_PACKET; complexity = 10; use_inbandfec = 0; forcechannels = OPUS_AUTO; use_dtx = 0; packet_loss_perc = 0; - max_frame_size = 960*6; - curr_read=0; while( args < argc - 2 ) { /* process command line options */ @@ -331,7 +362,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "Unknown bandwidth %s. " "Supported are NB, MB, WB, SWB, FB.\n", argv[ args + 1 ]); - return EXIT_FAILURE; + goto failure; } args += 2; } else if( strcmp( argv[ args ], "-framesize" ) == 0 ) { @@ -348,11 +379,17 @@ int main(int argc, char *argv[]) frame_size = sampling_rate/25; else if (strcmp(argv[ args + 1 ], "60")==0) frame_size = 3*sampling_rate/50; + else if (strcmp(argv[ args + 1 ], "80")==0) + frame_size = 4*sampling_rate/50; + else if (strcmp(argv[ args + 1 ], "100")==0) + frame_size = 5*sampling_rate/50; + else if (strcmp(argv[ args + 1 ], "120")==0) + frame_size = 6*sampling_rate/50; else { fprintf(stderr, "Unsupported frame size: %s ms. " - "Supported are 2.5, 5, 10, 20, 40, 60.\n", + "Supported are 2.5, 5, 10, 20, 40, 60, 80, 100, 120.\n", argv[ args + 1 ]); - return EXIT_FAILURE; + goto failure; } args += 2; } else if( strcmp( argv[ args ], "-max_payload" ) == 0 ) { @@ -374,12 +411,15 @@ int main(int argc, char *argv[]) check_encoder_option(decode_only, "-cvbr"); cvbr = 1; args++; + } else if( strcmp( argv[ args ], "-delayed-decision" ) == 0 ) { + check_encoder_option(decode_only, "-delayed-decision"); + delayed_decision = 1; + args++; } else if( strcmp( argv[ args ], "-dtx") == 0 ) { check_encoder_option(decode_only, "-dtx"); use_dtx = 1; args++; } else if( strcmp( argv[ args ], "-loss" ) == 0 ) { - check_decoder_option(encode_only, "-loss"); packet_loss_perc = atoi( argv[ args + 1 ] ); args += 2; } else if( strcmp( argv[ args ], "-sweep" ) == 0 ) { @@ -436,7 +476,7 @@ int main(int argc, char *argv[]) } else { printf( "Error: unrecognized setting: %s\n\n", argv[ args ] ); print_usage( argv ); - return EXIT_FAILURE; + goto failure; } } @@ -447,7 +487,7 @@ int main(int argc, char *argv[]) { fprintf (stderr, "max_payload_bytes must be between 0 and %d\n", MAX_PACKET); - return EXIT_FAILURE; + goto failure; } inFile = argv[argc-2]; @@ -455,7 +495,7 @@ int main(int argc, char *argv[]) if (!fin) { fprintf (stderr, "Could not open input file %s\n", argv[argc-2]); - return EXIT_FAILURE; + goto failure; } if (mode_list) { @@ -473,8 +513,7 @@ int main(int argc, char *argv[]) if (!fout) { fprintf (stderr, "Could not open output file %s\n", argv[argc-1]); - fclose(fin); - return EXIT_FAILURE; + goto failure; } if (!decode_only) @@ -483,9 +522,7 @@ int main(int argc, char *argv[]) if (err != OPUS_OK) { fprintf(stderr, "Cannot create encoder: %s\n", opus_strerror(err)); - fclose(fin); - fclose(fout); - return EXIT_FAILURE; + goto failure; } opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps)); opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth)); @@ -499,6 +536,7 @@ int main(int argc, char *argv[]) opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip)); opus_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(16)); + opus_encoder_ctl(enc, OPUS_SET_EXPERT_FRAME_DURATION(variable_duration)); } if (!encode_only) { @@ -506,9 +544,7 @@ int main(int argc, char *argv[]) if (err != OPUS_OK) { fprintf(stderr, "Cannot create decoder: %s\n", opus_strerror(err)); - fclose(fin); - fclose(fout); - return EXIT_FAILURE; + goto failure; } } @@ -531,7 +567,7 @@ int main(int argc, char *argv[]) bandwidth_string = "fullband"; break; case OPUS_AUTO: - bandwidth_string = "auto"; + bandwidth_string = "auto bandwidth"; break; default: bandwidth_string = "unknown"; @@ -543,16 +579,40 @@ int main(int argc, char *argv[]) (long)sampling_rate, channels); else fprintf(stderr, "Encoding %ld Hz input at %.3f kb/s " - "in %s mode with %d-sample frames.\n", + "in %s with %d-sample frames.\n", (long)sampling_rate, bitrate_bps*0.001, bandwidth_string, frame_size); in = (short*)malloc(max_frame_size*channels*sizeof(short)); out = (short*)malloc(max_frame_size*channels*sizeof(short)); + /* We need to allocate for 16-bit PCM data, but we store it as unsigned char. */ fbytes = (unsigned char*)malloc(max_frame_size*channels*sizeof(short)); - data[0] = (unsigned char*)calloc(max_payload_bytes,sizeof(char)); + data[0] = (unsigned char*)calloc(max_payload_bytes,sizeof(unsigned char)); if ( use_inbandfec ) { - data[1] = (unsigned char*)calloc(max_payload_bytes,sizeof(char)); + data[1] = (unsigned char*)calloc(max_payload_bytes,sizeof(unsigned char)); + } + if(delayed_decision) + { + if (frame_size==sampling_rate/400) + variable_duration = OPUS_FRAMESIZE_2_5_MS; + else if (frame_size==sampling_rate/200) + variable_duration = OPUS_FRAMESIZE_5_MS; + else if (frame_size==sampling_rate/100) + variable_duration = OPUS_FRAMESIZE_10_MS; + else if (frame_size==sampling_rate/50) + variable_duration = OPUS_FRAMESIZE_20_MS; + else if (frame_size==sampling_rate/25) + variable_duration = OPUS_FRAMESIZE_40_MS; + else if (frame_size==3*sampling_rate/50) + variable_duration = OPUS_FRAMESIZE_60_MS; + else if (frame_size==4*sampling_rate/50) + variable_duration = OPUS_FRAMESIZE_80_MS; + else if (frame_size==5*sampling_rate/50) + variable_duration = OPUS_FRAMESIZE_100_MS; + else + variable_duration = OPUS_FRAMESIZE_120_MS; + opus_encoder_ctl(enc, OPUS_SET_EXPERT_FRAME_DURATION(variable_duration)); + frame_size = 2*48000; } while (!stop) { @@ -572,7 +632,7 @@ int main(int argc, char *argv[]) case 4: newsize=sampling_rate/25; break; case 5: newsize=3*sampling_rate/50; break; } - while (newsize < sampling_rate/25 && bitrate_bps-fabs(sweep_bps) <= 3*12*sampling_rate/newsize) + while (newsize < sampling_rate/25 && bitrate_bps-abs(sweep_bps) <= 3*12*sampling_rate/newsize) newsize*=2; if (newsize < sampling_rate/100 && frame_size >= sampling_rate/100) { @@ -589,8 +649,8 @@ int main(int argc, char *argv[]) if (decode_only) { unsigned char ch[4]; - err = fread(ch, 1, 4, fin); - if (feof(fin)) + num_read = fread(ch, 1, 4, fin); + if (num_read!=4) break; len[toggle] = char_to_int(ch); if (len[toggle]>max_payload_bytes || len[toggle]<0) @@ -598,14 +658,16 @@ int main(int argc, char *argv[]) fprintf(stderr, "Invalid payload length: %d\n",len[toggle]); break; } - err = fread(ch, 1, 4, fin); + num_read = fread(ch, 1, 4, fin); + if (num_read!=4) + break; enc_final_range[toggle] = char_to_int(ch); - err = fread(data[toggle], 1, len[toggle], fin); - if (err mode_switch_time && curr_mode < nb_modes_in_list-1) @@ -664,25 +730,38 @@ int main(int argc, char *argv[]) } } +#if 0 /* This is for testing the padding code, do not enable by default */ + if (len[toggle]<1275) + { + int new_len = len[toggle]+rand()%(max_payload_bytes-len[toggle]); + if ((err = opus_packet_pad(data[toggle], len[toggle], new_len)) != OPUS_OK) + { + fprintf(stderr, "padding failed: %s\n", opus_strerror(err)); + goto failure; + } + len[toggle] = new_len; + } +#endif if (encode_only) { unsigned char int_field[4]; int_to_char(len[toggle], int_field); if (fwrite(int_field, 1, 4, fout) != 4) { fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; + goto failure; } int_to_char(enc_final_range[toggle], int_field); if (fwrite(int_field, 1, 4, fout) != 4) { fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; + goto failure; } if (fwrite(data[toggle], 1, len[toggle], fout) != (unsigned)len[toggle]) { fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; + goto failure; } + tot_samples += nb_encoded; } else { - int output_samples; + opus_int32 output_samples; lost = len[toggle]==0 || (packet_loss_perc>0 && rand()%100 < packet_loss_perc); if (lost) opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples)); @@ -705,6 +784,11 @@ int main(int argc, char *argv[]) } if (output_samples>0) { + if (!decode_only && tot_out + output_samples > tot_in) + { + stop=1; + output_samples = (opus_int32)(tot_in - tot_out); + } if (output_samples>skip) { int i; for(i=0;i<(output_samples-skip)*channels;i++) @@ -716,8 +800,9 @@ int main(int argc, char *argv[]) } if (fwrite(fbytes, sizeof(short)*channels, output_samples-skip, fout) != (unsigned)(output_samples-skip)){ fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; + goto failure; } + tot_out += output_samples-skip; } if (output_samples bits_max ) ? len[toggle]*8 : bits_max; if( count >= use_inbandfec ) { - nrg = 0.0; + /* count bits */ + bits += len[toggle]*8; + bits_max = ( len[toggle]*8 > bits_max ) ? len[toggle]*8 : bits_max; + bits2 += len[toggle]*len[toggle]*64; if (!decode_only) { + nrg = 0.0; for ( k = 0; k < frame_size * channels; k++ ) { nrg += in[ k ] * (double)in[ k ]; } + nrg /= frame_size * channels; + if( nrg > 1e5 ) { + bits_act += len[toggle]*8; + count_act++; + } } - if ( ( nrg / ( frame_size * channels ) ) > 1e5 ) { - bits_act += len[toggle]*8; - count_act++; - } - /* Variance */ - bits2 += len[toggle]*len[toggle]*64; } count++; toggle = (toggle + use_inbandfec) & 1; } - fprintf (stderr, "average bitrate: %7.3f kb/s\n", - 1e-3*bits*sampling_rate/(frame_size*(double)count)); - fprintf (stderr, "maximum bitrate: %7.3f kb/s\n", - 1e-3*bits_max*sampling_rate/frame_size); - if (!decode_only) - fprintf (stderr, "active bitrate: %7.3f kb/s\n", - 1e-3*bits_act*sampling_rate/(frame_size*(double)count_act)); - fprintf (stderr, "bitrate standard deviation: %7.3f kb/s\n", - 1e-3*sqrt(bits2/count - bits*bits/(count*(double)count))*sampling_rate/frame_size); - /* Close any files to which intermediate results were stored */ - SILK_DEBUG_STORE_CLOSE_FILES + + if(decode_only && count > 0) + frame_size = (int)(tot_samples / count); + count -= use_inbandfec; + if (tot_samples >= 1 && count > 0 && frame_size) + { + /* Print out bitrate statistics */ + double var; + fprintf (stderr, "average bitrate: %7.3f kb/s\n", + 1e-3*bits*sampling_rate/tot_samples); + fprintf (stderr, "maximum bitrate: %7.3f kb/s\n", + 1e-3*bits_max*sampling_rate/frame_size); + if (!decode_only) + fprintf (stderr, "active bitrate: %7.3f kb/s\n", + 1e-3*bits_act*sampling_rate/(1e-15+frame_size*(double)count_act)); + var = bits2/count - bits*bits/(count*(double)count); + if (var < 0) + var = 0; + fprintf (stderr, "bitrate standard deviation: %7.3f kb/s\n", + 1e-3*sqrt(var)*sampling_rate/frame_size); + } else { + fprintf(stderr, "bitrate statistics are undefined\n"); + } silk_TimerSave("opus_timing.txt"); + ret = EXIT_SUCCESS; +failure: opus_encoder_destroy(enc); opus_decoder_destroy(dec); free(data[0]); - if (use_inbandfec) - free(data[1]); - fclose(fin); - fclose(fout); + free(data[1]); + if (fin) + fclose(fin); + if (fout) + fclose(fout); free(in); free(out); free(fbytes); - return EXIT_SUCCESS; + return ret; } diff --git a/external/opus-1.3.1/src/opus_encoder.c b/external/opus-1.3.1/src/opus_encoder.c new file mode 100644 index 00000000..e98ac5b8 --- /dev/null +++ b/external/opus-1.3.1/src/opus_encoder.c @@ -0,0 +1,2783 @@ +/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited + Written by Jean-Marc Valin and Koen Vos */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "celt.h" +#include "entenc.h" +#include "modes.h" +#include "API.h" +#include "stack_alloc.h" +#include "float_cast.h" +#include "opus.h" +#include "arch.h" +#include "pitch.h" +#include "opus_private.h" +#include "os_support.h" +#include "cpu_support.h" +#include "analysis.h" +#include "mathops.h" +#include "tuning_parameters.h" +#ifdef FIXED_POINT +#include "fixed/structs_FIX.h" +#else +#include "float/structs_FLP.h" +#endif + +#define MAX_ENCODER_BUFFER 480 + +#ifndef DISABLE_FLOAT_API +#define PSEUDO_SNR_THRESHOLD 316.23f /* 10^(25/10) */ +#endif + +typedef struct { + opus_val32 XX, XY, YY; + opus_val16 smoothed_width; + opus_val16 max_follower; +} StereoWidthState; + +struct OpusEncoder { + int celt_enc_offset; + int silk_enc_offset; + silk_EncControlStruct silk_mode; + int application; + int channels; + int delay_compensation; + int force_channels; + int signal_type; + int user_bandwidth; + int max_bandwidth; + int user_forced_mode; + int voice_ratio; + opus_int32 Fs; + int use_vbr; + int vbr_constraint; + int variable_duration; + opus_int32 bitrate_bps; + opus_int32 user_bitrate_bps; + int lsb_depth; + int encoder_buffer; + int lfe; + int arch; + int use_dtx; /* general DTX for both SILK and CELT */ +#ifndef DISABLE_FLOAT_API + TonalityAnalysisState analysis; +#endif + +#define OPUS_ENCODER_RESET_START stream_channels + int stream_channels; + opus_int16 hybrid_stereo_width_Q14; + opus_int32 variable_HP_smth2_Q15; + opus_val16 prev_HB_gain; + opus_val32 hp_mem[4]; + int mode; + int prev_mode; + int prev_channels; + int prev_framesize; + int bandwidth; + /* Bandwidth determined automatically from the rate (before any other adjustment) */ + int auto_bandwidth; + int silk_bw_switch; + /* Sampling rate (at the API level) */ + int first; + opus_val16 * energy_masking; + StereoWidthState width_mem; + opus_val16 delay_buffer[MAX_ENCODER_BUFFER*2]; +#ifndef DISABLE_FLOAT_API + int detected_bandwidth; + int nb_no_activity_frames; + opus_val32 peak_signal_energy; +#endif + int nonfinal_frame; /* current frame is not the final in a packet */ + opus_uint32 rangeFinal; +}; + +/* Transition tables for the voice and music. First column is the + middle (memoriless) threshold. The second column is the hysteresis + (difference with the middle) */ +static const opus_int32 mono_voice_bandwidth_thresholds[8] = { + 9000, 700, /* NB<->MB */ + 9000, 700, /* MB<->WB */ + 13500, 1000, /* WB<->SWB */ + 14000, 2000, /* SWB<->FB */ +}; +static const opus_int32 mono_music_bandwidth_thresholds[8] = { + 9000, 700, /* NB<->MB */ + 9000, 700, /* MB<->WB */ + 11000, 1000, /* WB<->SWB */ + 12000, 2000, /* SWB<->FB */ +}; +static const opus_int32 stereo_voice_bandwidth_thresholds[8] = { + 9000, 700, /* NB<->MB */ + 9000, 700, /* MB<->WB */ + 13500, 1000, /* WB<->SWB */ + 14000, 2000, /* SWB<->FB */ +}; +static const opus_int32 stereo_music_bandwidth_thresholds[8] = { + 9000, 700, /* NB<->MB */ + 9000, 700, /* MB<->WB */ + 11000, 1000, /* WB<->SWB */ + 12000, 2000, /* SWB<->FB */ +}; +/* Threshold bit-rates for switching between mono and stereo */ +static const opus_int32 stereo_voice_threshold = 19000; +static const opus_int32 stereo_music_threshold = 17000; + +/* Threshold bit-rate for switching between SILK/hybrid and CELT-only */ +static const opus_int32 mode_thresholds[2][2] = { + /* voice */ /* music */ + { 64000, 10000}, /* mono */ + { 44000, 10000}, /* stereo */ +}; + +static const opus_int32 fec_thresholds[] = { + 12000, 1000, /* NB */ + 14000, 1000, /* MB */ + 16000, 1000, /* WB */ + 20000, 1000, /* SWB */ + 22000, 1000, /* FB */ +}; + +int opus_encoder_get_size(int channels) +{ + int silkEncSizeBytes, celtEncSizeBytes; + int ret; + if (channels<1 || channels > 2) + return 0; + ret = silk_Get_Encoder_Size( &silkEncSizeBytes ); + if (ret) + return 0; + silkEncSizeBytes = align(silkEncSizeBytes); + celtEncSizeBytes = celt_encoder_get_size(channels); + return align(sizeof(OpusEncoder))+silkEncSizeBytes+celtEncSizeBytes; +} + +int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int application) +{ + void *silk_enc; + CELTEncoder *celt_enc; + int err; + int ret, silkEncSizeBytes; + + if((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000)||(channels!=1&&channels!=2)|| + (application != OPUS_APPLICATION_VOIP && application != OPUS_APPLICATION_AUDIO + && application != OPUS_APPLICATION_RESTRICTED_LOWDELAY)) + return OPUS_BAD_ARG; + + OPUS_CLEAR((char*)st, opus_encoder_get_size(channels)); + /* Create SILK encoder */ + ret = silk_Get_Encoder_Size( &silkEncSizeBytes ); + if (ret) + return OPUS_BAD_ARG; + silkEncSizeBytes = align(silkEncSizeBytes); + st->silk_enc_offset = align(sizeof(OpusEncoder)); + st->celt_enc_offset = st->silk_enc_offset+silkEncSizeBytes; + silk_enc = (char*)st+st->silk_enc_offset; + celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); + + st->stream_channels = st->channels = channels; + + st->Fs = Fs; + + st->arch = opus_select_arch(); + + ret = silk_InitEncoder( silk_enc, st->arch, &st->silk_mode ); + if(ret)return OPUS_INTERNAL_ERROR; + + /* default SILK parameters */ + st->silk_mode.nChannelsAPI = channels; + st->silk_mode.nChannelsInternal = channels; + st->silk_mode.API_sampleRate = st->Fs; + st->silk_mode.maxInternalSampleRate = 16000; + st->silk_mode.minInternalSampleRate = 8000; + st->silk_mode.desiredInternalSampleRate = 16000; + st->silk_mode.payloadSize_ms = 20; + st->silk_mode.bitRate = 25000; + st->silk_mode.packetLossPercentage = 0; + st->silk_mode.complexity = 9; + st->silk_mode.useInBandFEC = 0; + st->silk_mode.useDTX = 0; + st->silk_mode.useCBR = 0; + st->silk_mode.reducedDependency = 0; + + /* Create CELT encoder */ + /* Initialize CELT encoder */ + err = celt_encoder_init(celt_enc, Fs, channels, st->arch); + if(err!=OPUS_OK)return OPUS_INTERNAL_ERROR; + + celt_encoder_ctl(celt_enc, CELT_SET_SIGNALLING(0)); + celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(st->silk_mode.complexity)); + + st->use_vbr = 1; + /* Makes constrained VBR the default (safer for real-time use) */ + st->vbr_constraint = 1; + st->user_bitrate_bps = OPUS_AUTO; + st->bitrate_bps = 3000+Fs*channels; + st->application = application; + st->signal_type = OPUS_AUTO; + st->user_bandwidth = OPUS_AUTO; + st->max_bandwidth = OPUS_BANDWIDTH_FULLBAND; + st->force_channels = OPUS_AUTO; + st->user_forced_mode = OPUS_AUTO; + st->voice_ratio = -1; + st->encoder_buffer = st->Fs/100; + st->lsb_depth = 24; + st->variable_duration = OPUS_FRAMESIZE_ARG; + + /* Delay compensation of 4 ms (2.5 ms for SILK's extra look-ahead + + 1.5 ms for SILK resamplers and stereo prediction) */ + st->delay_compensation = st->Fs/250; + + st->hybrid_stereo_width_Q14 = 1 << 14; + st->prev_HB_gain = Q15ONE; + st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); + st->first = 1; + st->mode = MODE_HYBRID; + st->bandwidth = OPUS_BANDWIDTH_FULLBAND; + +#ifndef DISABLE_FLOAT_API + tonality_analysis_init(&st->analysis, st->Fs); + st->analysis.application = st->application; +#endif + + return OPUS_OK; +} + +static unsigned char gen_toc(int mode, int framerate, int bandwidth, int channels) +{ + int period; + unsigned char toc; + period = 0; + while (framerate < 400) + { + framerate <<= 1; + period++; + } + if (mode == MODE_SILK_ONLY) + { + toc = (bandwidth-OPUS_BANDWIDTH_NARROWBAND)<<5; + toc |= (period-2)<<3; + } else if (mode == MODE_CELT_ONLY) + { + int tmp = bandwidth-OPUS_BANDWIDTH_MEDIUMBAND; + if (tmp < 0) + tmp = 0; + toc = 0x80; + toc |= tmp << 5; + toc |= period<<3; + } else /* Hybrid */ + { + toc = 0x60; + toc |= (bandwidth-OPUS_BANDWIDTH_SUPERWIDEBAND)<<4; + toc |= (period-2)<<3; + } + toc |= (channels==2)<<2; + return toc; +} + +#ifndef FIXED_POINT +static void silk_biquad_float( + const opus_val16 *in, /* I: Input signal */ + const opus_int32 *B_Q28, /* I: MA coefficients [3] */ + const opus_int32 *A_Q28, /* I: AR coefficients [2] */ + opus_val32 *S, /* I/O: State vector [2] */ + opus_val16 *out, /* O: Output signal */ + const opus_int32 len, /* I: Signal length (must be even) */ + int stride +) +{ + /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ + opus_int k; + opus_val32 vout; + opus_val32 inval; + opus_val32 A[2], B[3]; + + A[0] = (opus_val32)(A_Q28[0] * (1.f/((opus_int32)1<<28))); + A[1] = (opus_val32)(A_Q28[1] * (1.f/((opus_int32)1<<28))); + B[0] = (opus_val32)(B_Q28[0] * (1.f/((opus_int32)1<<28))); + B[1] = (opus_val32)(B_Q28[1] * (1.f/((opus_int32)1<<28))); + B[2] = (opus_val32)(B_Q28[2] * (1.f/((opus_int32)1<<28))); + + /* Negate A_Q28 values and split in two parts */ + + for( k = 0; k < len; k++ ) { + /* S[ 0 ], S[ 1 ]: Q12 */ + inval = in[ k*stride ]; + vout = S[ 0 ] + B[0]*inval; + + S[ 0 ] = S[1] - vout*A[0] + B[1]*inval; + + S[ 1 ] = - vout*A[1] + B[2]*inval + VERY_SMALL; + + /* Scale back to Q0 and saturate */ + out[ k*stride ] = vout; + } +} +#endif + +static void hp_cutoff(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *out, opus_val32 *hp_mem, int len, int channels, opus_int32 Fs, int arch) +{ + opus_int32 B_Q28[ 3 ], A_Q28[ 2 ]; + opus_int32 Fc_Q19, r_Q28, r_Q22; + (void)arch; + + silk_assert( cutoff_Hz <= silk_int32_MAX / SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ) ); + Fc_Q19 = silk_DIV32_16( silk_SMULBB( SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ), cutoff_Hz ), Fs/1000 ); + silk_assert( Fc_Q19 > 0 && Fc_Q19 < 32768 ); + + r_Q28 = SILK_FIX_CONST( 1.0, 28 ) - silk_MUL( SILK_FIX_CONST( 0.92, 9 ), Fc_Q19 ); + + /* b = r * [ 1; -2; 1 ]; */ + /* a = [ 1; -2 * r * ( 1 - 0.5 * Fc^2 ); r^2 ]; */ + B_Q28[ 0 ] = r_Q28; + B_Q28[ 1 ] = silk_LSHIFT( -r_Q28, 1 ); + B_Q28[ 2 ] = r_Q28; + + /* -r * ( 2 - Fc * Fc ); */ + r_Q22 = silk_RSHIFT( r_Q28, 6 ); + A_Q28[ 0 ] = silk_SMULWW( r_Q22, silk_SMULWW( Fc_Q19, Fc_Q19 ) - SILK_FIX_CONST( 2.0, 22 ) ); + A_Q28[ 1 ] = silk_SMULWW( r_Q22, r_Q22 ); + +#ifdef FIXED_POINT + if( channels == 1 ) { + silk_biquad_alt_stride1( in, B_Q28, A_Q28, hp_mem, out, len ); + } else { + silk_biquad_alt_stride2( in, B_Q28, A_Q28, hp_mem, out, len, arch ); + } +#else + silk_biquad_float( in, B_Q28, A_Q28, hp_mem, out, len, channels ); + if( channels == 2 ) { + silk_biquad_float( in+1, B_Q28, A_Q28, hp_mem+2, out+1, len, channels ); + } +#endif +} + +#ifdef FIXED_POINT +static void dc_reject(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *out, opus_val32 *hp_mem, int len, int channels, opus_int32 Fs) +{ + int c, i; + int shift; + + /* Approximates -round(log2(6.3*cutoff_Hz/Fs)) */ + shift=celt_ilog2(Fs/(cutoff_Hz*4)); + for (c=0;cFs/400; + if (st->user_bitrate_bps==OPUS_AUTO) + return 60*st->Fs/frame_size + st->Fs*st->channels; + else if (st->user_bitrate_bps==OPUS_BITRATE_MAX) + return max_data_bytes*8*st->Fs/frame_size; + else + return st->user_bitrate_bps; +} + +#ifndef DISABLE_FLOAT_API +#ifdef FIXED_POINT +#define PCM2VAL(x) FLOAT2INT16(x) +#else +#define PCM2VAL(x) SCALEIN(x) +#endif + +void downmix_float(const void *_x, opus_val32 *y, int subframe, int offset, int c1, int c2, int C) +{ + const float *x; + int j; + + x = (const float *)_x; + for (j=0;j-1) + { + for (j=0;j-1) + { + for (j=0;j= OPUS_FRAMESIZE_2_5_MS && variable_duration <= OPUS_FRAMESIZE_120_MS) + { + if (variable_duration <= OPUS_FRAMESIZE_40_MS) + new_size = (Fs/400)<<(variable_duration-OPUS_FRAMESIZE_2_5_MS); + else + new_size = (variable_duration-OPUS_FRAMESIZE_2_5_MS-2)*Fs/50; + } + else + return -1; + if (new_size>frame_size) + return -1; + if (400*new_size!=Fs && 200*new_size!=Fs && 100*new_size!=Fs && + 50*new_size!=Fs && 25*new_size!=Fs && 50*new_size!=3*Fs && + 50*new_size!=4*Fs && 50*new_size!=5*Fs && 50*new_size!=6*Fs) + return -1; + return new_size; +} + +opus_val16 compute_stereo_width(const opus_val16 *pcm, int frame_size, opus_int32 Fs, StereoWidthState *mem) +{ + opus_val32 xx, xy, yy; + opus_val16 sqrt_xx, sqrt_yy; + opus_val16 qrrt_xx, qrrt_yy; + int frame_rate; + int i; + opus_val16 short_alpha; + + frame_rate = Fs/frame_size; + short_alpha = Q15ONE - MULT16_16(25, Q15ONE)/IMAX(50,frame_rate); + xx=xy=yy=0; + /* Unroll by 4. The frame size is always a multiple of 4 *except* for + 2.5 ms frames at 12 kHz. Since this setting is very rare (and very + stupid), we just discard the last two samples. */ + for (i=0;iXX += MULT16_32_Q15(short_alpha, xx-mem->XX); + mem->XY += MULT16_32_Q15(short_alpha, xy-mem->XY); + mem->YY += MULT16_32_Q15(short_alpha, yy-mem->YY); + mem->XX = MAX32(0, mem->XX); + mem->XY = MAX32(0, mem->XY); + mem->YY = MAX32(0, mem->YY); + if (MAX32(mem->XX, mem->YY)>QCONST16(8e-4f, 18)) + { + opus_val16 corr; + opus_val16 ldiff; + opus_val16 width; + sqrt_xx = celt_sqrt(mem->XX); + sqrt_yy = celt_sqrt(mem->YY); + qrrt_xx = celt_sqrt(sqrt_xx); + qrrt_yy = celt_sqrt(sqrt_yy); + /* Inter-channel correlation */ + mem->XY = MIN32(mem->XY, sqrt_xx*sqrt_yy); + corr = SHR32(frac_div32(mem->XY,EPSILON+MULT16_16(sqrt_xx,sqrt_yy)),16); + /* Approximate loudness difference */ + ldiff = MULT16_16(Q15ONE, ABS16(qrrt_xx-qrrt_yy))/(EPSILON+qrrt_xx+qrrt_yy); + width = MULT16_16_Q15(celt_sqrt(QCONST32(1.f,30)-MULT16_16(corr,corr)), ldiff); + /* Smoothing over one second */ + mem->smoothed_width += (width-mem->smoothed_width)/frame_rate; + /* Peak follower */ + mem->max_follower = MAX16(mem->max_follower-QCONST16(.02f,15)/frame_rate, mem->smoothed_width); + } + /*printf("%f %f %f %f %f ", corr/(float)Q15ONE, ldiff/(float)Q15ONE, width/(float)Q15ONE, mem->smoothed_width/(float)Q15ONE, mem->max_follower/(float)Q15ONE);*/ + return EXTRACT16(MIN32(Q15ONE, MULT16_16(20, mem->max_follower))); +} + +static int decide_fec(int useInBandFEC, int PacketLoss_perc, int last_fec, int mode, int *bandwidth, opus_int32 rate) +{ + int orig_bandwidth; + if (!useInBandFEC || PacketLoss_perc == 0 || mode == MODE_CELT_ONLY) + return 0; + orig_bandwidth = *bandwidth; + for (;;) + { + opus_int32 hysteresis; + opus_int32 LBRR_rate_thres_bps; + /* Compute threshold for using FEC at the current bandwidth setting */ + LBRR_rate_thres_bps = fec_thresholds[2*(*bandwidth - OPUS_BANDWIDTH_NARROWBAND)]; + hysteresis = fec_thresholds[2*(*bandwidth - OPUS_BANDWIDTH_NARROWBAND) + 1]; + if (last_fec == 1) LBRR_rate_thres_bps -= hysteresis; + if (last_fec == 0) LBRR_rate_thres_bps += hysteresis; + LBRR_rate_thres_bps = silk_SMULWB( silk_MUL( LBRR_rate_thres_bps, + 125 - silk_min( PacketLoss_perc, 25 ) ), SILK_FIX_CONST( 0.01, 16 ) ); + /* If loss <= 5%, we look at whether we have enough rate to enable FEC. + If loss > 5%, we decrease the bandwidth until we can enable FEC. */ + if (rate > LBRR_rate_thres_bps) + return 1; + else if (PacketLoss_perc <= 5) + return 0; + else if (*bandwidth > OPUS_BANDWIDTH_NARROWBAND) + (*bandwidth)--; + else + break; + } + /* Couldn't find any bandwidth to enable FEC, keep original bandwidth. */ + *bandwidth = orig_bandwidth; + return 0; +} + +static int compute_silk_rate_for_hybrid(int rate, int bandwidth, int frame20ms, int vbr, int fec, int channels) { + int entry; + int i; + int N; + int silk_rate; + static int rate_table[][5] = { + /* |total| |-------- SILK------------| + |-- No FEC -| |--- FEC ---| + 10ms 20ms 10ms 20ms */ + { 0, 0, 0, 0, 0}, + {12000, 10000, 10000, 11000, 11000}, + {16000, 13500, 13500, 15000, 15000}, + {20000, 16000, 16000, 18000, 18000}, + {24000, 18000, 18000, 21000, 21000}, + {32000, 22000, 22000, 28000, 28000}, + {64000, 38000, 38000, 50000, 50000} + }; + /* Do the allocation per-channel. */ + rate /= channels; + entry = 1 + frame20ms + 2*fec; + N = sizeof(rate_table)/sizeof(rate_table[0]); + for (i=1;i rate) break; + } + if (i == N) + { + silk_rate = rate_table[i-1][entry]; + /* For now, just give 50% of the extra bits to SILK. */ + silk_rate += (rate-rate_table[i-1][0])/2; + } else { + opus_int32 lo, hi, x0, x1; + lo = rate_table[i-1][entry]; + hi = rate_table[i][entry]; + x0 = rate_table[i-1][0]; + x1 = rate_table[i][0]; + silk_rate = (lo*(x1-rate) + hi*(rate-x0))/(x1-x0); + } + if (!vbr) + { + /* Tiny boost to SILK for CBR. We should probably tune this better. */ + silk_rate += 100; + } + if (bandwidth==OPUS_BANDWIDTH_SUPERWIDEBAND) + silk_rate += 300; + silk_rate *= channels; + /* Small adjustment for stereo (calibrated for 32 kb/s, haven't tried other bitrates). */ + if (channels == 2 && rate >= 12000) + silk_rate -= 1000; + return silk_rate; +} + +/* Returns the equivalent bitrate corresponding to 20 ms frames, + complexity 10 VBR operation. */ +static opus_int32 compute_equiv_rate(opus_int32 bitrate, int channels, + int frame_rate, int vbr, int mode, int complexity, int loss) +{ + opus_int32 equiv; + equiv = bitrate; + /* Take into account overhead from smaller frames. */ + if (frame_rate > 50) + equiv -= (40*channels+20)*(frame_rate - 50); + /* CBR is about a 8% penalty for both SILK and CELT. */ + if (!vbr) + equiv -= equiv/12; + /* Complexity makes about 10% difference (from 0 to 10) in general. */ + equiv = equiv * (90+complexity)/100; + if (mode == MODE_SILK_ONLY || mode == MODE_HYBRID) + { + /* SILK complexity 0-1 uses the non-delayed-decision NSQ, which + costs about 20%. */ + if (complexity<2) + equiv = equiv*4/5; + equiv -= equiv*loss/(6*loss + 10); + } else if (mode == MODE_CELT_ONLY) { + /* CELT complexity 0-4 doesn't have the pitch filter, which costs + about 10%. */ + if (complexity<5) + equiv = equiv*9/10; + } else { + /* Mode not known yet */ + /* Half the SILK loss*/ + equiv -= equiv*loss/(12*loss + 20); + } + return equiv; +} + +#ifndef DISABLE_FLOAT_API + +int is_digital_silence(const opus_val16* pcm, int frame_size, int channels, int lsb_depth) +{ + int silence = 0; + opus_val32 sample_max = 0; +#ifdef MLP_TRAINING + return 0; +#endif + sample_max = celt_maxabs16(pcm, frame_size*channels); + +#ifdef FIXED_POINT + silence = (sample_max == 0); + (void)lsb_depth; +#else + silence = (sample_max <= (opus_val16) 1 / (1 << lsb_depth)); +#endif + + return silence; +} + +#ifdef FIXED_POINT +static opus_val32 compute_frame_energy(const opus_val16 *pcm, int frame_size, int channels, int arch) +{ + int i; + opus_val32 sample_max; + int max_shift; + int shift; + opus_val32 energy = 0; + int len = frame_size*channels; + (void)arch; + /* Max amplitude in the signal */ + sample_max = celt_maxabs16(pcm, len); + + /* Compute the right shift required in the MAC to avoid an overflow */ + max_shift = celt_ilog2(len); + shift = IMAX(0, (celt_ilog2(sample_max) << 1) + max_shift - 28); + + /* Compute the energy */ + for (i=0; i= (PSEUDO_SNR_THRESHOLD * noise_energy); + } + } + + if (is_silence) + { + /* The number of consecutive DTX frames should be within the allowed bounds */ + (*nb_no_activity_frames)++; + + if (*nb_no_activity_frames > NB_SPEECH_FRAMES_BEFORE_DTX) + { + if (*nb_no_activity_frames <= (NB_SPEECH_FRAMES_BEFORE_DTX + MAX_CONSECUTIVE_DTX)) + /* Valid frame for DTX! */ + return 1; + else + (*nb_no_activity_frames) = NB_SPEECH_FRAMES_BEFORE_DTX; + } + } else + (*nb_no_activity_frames) = 0; + + return 0; +} + +#endif + +static opus_int32 encode_multiframe_packet(OpusEncoder *st, + const opus_val16 *pcm, + int nb_frames, + int frame_size, + unsigned char *data, + opus_int32 out_data_bytes, + int to_celt, + int lsb_depth, + int float_api) +{ + int i; + int ret = 0; + VARDECL(unsigned char, tmp_data); + int bak_mode, bak_bandwidth, bak_channels, bak_to_mono; + VARDECL(OpusRepacketizer, rp); + int max_header_bytes; + opus_int32 bytes_per_frame; + opus_int32 cbr_bytes; + opus_int32 repacketize_len; + int tmp_len; + ALLOC_STACK; + + /* Worst cases: + * 2 frames: Code 2 with different compressed sizes + * >2 frames: Code 3 VBR */ + max_header_bytes = nb_frames == 2 ? 3 : (2+(nb_frames-1)*2); + + if (st->use_vbr || st->user_bitrate_bps==OPUS_BITRATE_MAX) + repacketize_len = out_data_bytes; + else { + cbr_bytes = 3*st->bitrate_bps/(3*8*st->Fs/(frame_size*nb_frames)); + repacketize_len = IMIN(cbr_bytes, out_data_bytes); + } + bytes_per_frame = IMIN(1276, 1+(repacketize_len-max_header_bytes)/nb_frames); + + ALLOC(tmp_data, nb_frames*bytes_per_frame, unsigned char); + ALLOC(rp, 1, OpusRepacketizer); + opus_repacketizer_init(rp); + + bak_mode = st->user_forced_mode; + bak_bandwidth = st->user_bandwidth; + bak_channels = st->force_channels; + + st->user_forced_mode = st->mode; + st->user_bandwidth = st->bandwidth; + st->force_channels = st->stream_channels; + + bak_to_mono = st->silk_mode.toMono; + if (bak_to_mono) + st->force_channels = 1; + else + st->prev_channels = st->stream_channels; + + for (i=0;isilk_mode.toMono = 0; + st->nonfinal_frame = i<(nb_frames-1); + + /* When switching from SILK/Hybrid to CELT, only ask for a switch at the last frame */ + if (to_celt && i==nb_frames-1) + st->user_forced_mode = MODE_CELT_ONLY; + + tmp_len = opus_encode_native(st, pcm+i*(st->channels*frame_size), frame_size, + tmp_data+i*bytes_per_frame, bytes_per_frame, lsb_depth, NULL, 0, 0, 0, 0, + NULL, float_api); + + if (tmp_len<0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + + ret = opus_repacketizer_cat(rp, tmp_data+i*bytes_per_frame, tmp_len); + + if (ret<0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + } + + ret = opus_repacketizer_out_range_impl(rp, 0, nb_frames, data, repacketize_len, 0, !st->use_vbr); + + if (ret<0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + + /* Discard configs that were forced locally for the purpose of repacketization */ + st->user_forced_mode = bak_mode; + st->user_bandwidth = bak_bandwidth; + st->force_channels = bak_channels; + st->silk_mode.toMono = bak_to_mono; + + RESTORE_STACK; + return ret; +} + +static int compute_redundancy_bytes(opus_int32 max_data_bytes, opus_int32 bitrate_bps, int frame_rate, int channels) +{ + int redundancy_bytes_cap; + int redundancy_bytes; + opus_int32 redundancy_rate; + int base_bits; + opus_int32 available_bits; + base_bits = (40*channels+20); + + /* Equivalent rate for 5 ms frames. */ + redundancy_rate = bitrate_bps + base_bits*(200 - frame_rate); + /* For VBR, further increase the bitrate if we can afford it. It's pretty short + and we'll avoid artefacts. */ + redundancy_rate = 3*redundancy_rate/2; + redundancy_bytes = redundancy_rate/1600; + + /* Compute the max rate we can use given CBR or VBR with cap. */ + available_bits = max_data_bytes*8 - 2*base_bits; + redundancy_bytes_cap = (available_bits*240/(240+48000/frame_rate) + base_bits)/8; + redundancy_bytes = IMIN(redundancy_bytes, redundancy_bytes_cap); + /* It we can't get enough bits for redundancy to be worth it, rely on the decoder PLC. */ + if (redundancy_bytes > 4 + 8*channels) + redundancy_bytes = IMIN(257, redundancy_bytes); + else + redundancy_bytes = 0; + return redundancy_bytes; +} + +opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_size, + unsigned char *data, opus_int32 out_data_bytes, int lsb_depth, + const void *analysis_pcm, opus_int32 analysis_size, int c1, int c2, + int analysis_channels, downmix_func downmix, int float_api) +{ + void *silk_enc; + CELTEncoder *celt_enc; + int i; + int ret=0; + opus_int32 nBytes; + ec_enc enc; + int bytes_target; + int prefill=0; + int start_band = 0; + int redundancy = 0; + int redundancy_bytes = 0; /* Number of bytes to use for redundancy frame */ + int celt_to_silk = 0; + VARDECL(opus_val16, pcm_buf); + int nb_compr_bytes; + int to_celt = 0; + opus_uint32 redundant_rng = 0; + int cutoff_Hz, hp_freq_smth1; + int voice_est; /* Probability of voice in Q7 */ + opus_int32 equiv_rate; + int delay_compensation; + int frame_rate; + opus_int32 max_rate; /* Max bitrate we're allowed to use */ + int curr_bandwidth; + opus_val16 HB_gain; + opus_int32 max_data_bytes; /* Max number of bytes we're allowed to use */ + int total_buffer; + opus_val16 stereo_width; + const CELTMode *celt_mode; +#ifndef DISABLE_FLOAT_API + AnalysisInfo analysis_info; + int analysis_read_pos_bak=-1; + int analysis_read_subframe_bak=-1; + int is_silence = 0; +#endif + VARDECL(opus_val16, tmp_prefill); + + ALLOC_STACK; + + max_data_bytes = IMIN(1276, out_data_bytes); + + st->rangeFinal = 0; + if (frame_size <= 0 || max_data_bytes <= 0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + + /* Cannot encode 100 ms in 1 byte */ + if (max_data_bytes==1 && st->Fs==(frame_size*10)) + { + RESTORE_STACK; + return OPUS_BUFFER_TOO_SMALL; + } + + silk_enc = (char*)st+st->silk_enc_offset; + celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); + if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) + delay_compensation = 0; + else + delay_compensation = st->delay_compensation; + + lsb_depth = IMIN(lsb_depth, st->lsb_depth); + + celt_encoder_ctl(celt_enc, CELT_GET_MODE(&celt_mode)); +#ifndef DISABLE_FLOAT_API + analysis_info.valid = 0; +#ifdef FIXED_POINT + if (st->silk_mode.complexity >= 10 && st->Fs>=16000) +#else + if (st->silk_mode.complexity >= 7 && st->Fs>=16000) +#endif + { + is_silence = is_digital_silence(pcm, frame_size, st->channels, lsb_depth); + analysis_read_pos_bak = st->analysis.read_pos; + analysis_read_subframe_bak = st->analysis.read_subframe; + run_analysis(&st->analysis, celt_mode, analysis_pcm, analysis_size, frame_size, + c1, c2, analysis_channels, st->Fs, + lsb_depth, downmix, &analysis_info); + + /* Track the peak signal energy */ + if (!is_silence && analysis_info.activity_probability > DTX_ACTIVITY_THRESHOLD) + st->peak_signal_energy = MAX32(MULT16_32_Q15(QCONST16(0.999f, 15), st->peak_signal_energy), + compute_frame_energy(pcm, frame_size, st->channels, st->arch)); + } else if (st->analysis.initialized) { + tonality_analysis_reset(&st->analysis); + } +#else + (void)analysis_pcm; + (void)analysis_size; + (void)c1; + (void)c2; + (void)analysis_channels; + (void)downmix; +#endif + +#ifndef DISABLE_FLOAT_API + /* Reset voice_ratio if this frame is not silent or if analysis is disabled. + * Otherwise, preserve voice_ratio from the last non-silent frame */ + if (!is_silence) + st->voice_ratio = -1; + + st->detected_bandwidth = 0; + if (analysis_info.valid) + { + int analysis_bandwidth; + if (st->signal_type == OPUS_AUTO) + { + float prob; + if (st->prev_mode == 0) + prob = analysis_info.music_prob; + else if (st->prev_mode == MODE_CELT_ONLY) + prob = analysis_info.music_prob_max; + else + prob = analysis_info.music_prob_min; + st->voice_ratio = (int)floor(.5+100*(1-prob)); + } + + analysis_bandwidth = analysis_info.bandwidth; + if (analysis_bandwidth<=12) + st->detected_bandwidth = OPUS_BANDWIDTH_NARROWBAND; + else if (analysis_bandwidth<=14) + st->detected_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; + else if (analysis_bandwidth<=16) + st->detected_bandwidth = OPUS_BANDWIDTH_WIDEBAND; + else if (analysis_bandwidth<=18) + st->detected_bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; + else + st->detected_bandwidth = OPUS_BANDWIDTH_FULLBAND; + } +#else + st->voice_ratio = -1; +#endif + + if (st->channels==2 && st->force_channels!=1) + stereo_width = compute_stereo_width(pcm, frame_size, st->Fs, &st->width_mem); + else + stereo_width = 0; + total_buffer = delay_compensation; + st->bitrate_bps = user_bitrate_to_bitrate(st, frame_size, max_data_bytes); + + frame_rate = st->Fs/frame_size; + if (!st->use_vbr) + { + int cbrBytes; + /* Multiply by 12 to make sure the division is exact. */ + int frame_rate12 = 12*st->Fs/frame_size; + /* We need to make sure that "int" values always fit in 16 bits. */ + cbrBytes = IMIN( (12*st->bitrate_bps/8 + frame_rate12/2)/frame_rate12, max_data_bytes); + st->bitrate_bps = cbrBytes*(opus_int32)frame_rate12*8/12; + /* Make sure we provide at least one byte to avoid failing. */ + max_data_bytes = IMAX(1, cbrBytes); + } + if (max_data_bytes<3 || st->bitrate_bps < 3*frame_rate*8 + || (frame_rate<50 && (max_data_bytes*frame_rate<300 || st->bitrate_bps < 2400))) + { + /*If the space is too low to do something useful, emit 'PLC' frames.*/ + int tocmode = st->mode; + int bw = st->bandwidth == 0 ? OPUS_BANDWIDTH_NARROWBAND : st->bandwidth; + int packet_code = 0; + int num_multiframes = 0; + + if (tocmode==0) + tocmode = MODE_SILK_ONLY; + if (frame_rate>100) + tocmode = MODE_CELT_ONLY; + /* 40 ms -> 2 x 20 ms if in CELT_ONLY or HYBRID mode */ + if (frame_rate==25 && tocmode!=MODE_SILK_ONLY) + { + frame_rate = 50; + packet_code = 1; + } + + /* >= 60 ms frames */ + if (frame_rate<=16) + { + /* 1 x 60 ms, 2 x 40 ms, 2 x 60 ms */ + if (out_data_bytes==1 || (tocmode==MODE_SILK_ONLY && frame_rate!=10)) + { + tocmode = MODE_SILK_ONLY; + + packet_code = frame_rate <= 12; + frame_rate = frame_rate == 12 ? 25 : 16; + } + else + { + num_multiframes = 50/frame_rate; + frame_rate = 50; + packet_code = 3; + } + } + + if(tocmode==MODE_SILK_ONLY&&bw>OPUS_BANDWIDTH_WIDEBAND) + bw=OPUS_BANDWIDTH_WIDEBAND; + else if (tocmode==MODE_CELT_ONLY&&bw==OPUS_BANDWIDTH_MEDIUMBAND) + bw=OPUS_BANDWIDTH_NARROWBAND; + else if (tocmode==MODE_HYBRID&&bw<=OPUS_BANDWIDTH_SUPERWIDEBAND) + bw=OPUS_BANDWIDTH_SUPERWIDEBAND; + + data[0] = gen_toc(tocmode, frame_rate, bw, st->stream_channels); + data[0] |= packet_code; + + ret = packet_code <= 1 ? 1 : 2; + + max_data_bytes = IMAX(max_data_bytes, ret); + + if (packet_code==3) + data[1] = num_multiframes; + + if (!st->use_vbr) + { + ret = opus_packet_pad(data, ret, max_data_bytes); + if (ret == OPUS_OK) + ret = max_data_bytes; + else + ret = OPUS_INTERNAL_ERROR; + } + RESTORE_STACK; + return ret; + } + max_rate = frame_rate*max_data_bytes*8; + + /* Equivalent 20-ms rate for mode/channel/bandwidth decisions */ + equiv_rate = compute_equiv_rate(st->bitrate_bps, st->channels, st->Fs/frame_size, + st->use_vbr, 0, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); + + if (st->signal_type == OPUS_SIGNAL_VOICE) + voice_est = 127; + else if (st->signal_type == OPUS_SIGNAL_MUSIC) + voice_est = 0; + else if (st->voice_ratio >= 0) + { + voice_est = st->voice_ratio*327>>8; + /* For AUDIO, never be more than 90% confident of having speech */ + if (st->application == OPUS_APPLICATION_AUDIO) + voice_est = IMIN(voice_est, 115); + } else if (st->application == OPUS_APPLICATION_VOIP) + voice_est = 115; + else + voice_est = 48; + + if (st->force_channels!=OPUS_AUTO && st->channels == 2) + { + st->stream_channels = st->force_channels; + } else { +#ifdef FUZZING + /* Random mono/stereo decision */ + if (st->channels == 2 && (rand()&0x1F)==0) + st->stream_channels = 3-st->stream_channels; +#else + /* Rate-dependent mono-stereo decision */ + if (st->channels == 2) + { + opus_int32 stereo_threshold; + stereo_threshold = stereo_music_threshold + ((voice_est*voice_est*(stereo_voice_threshold-stereo_music_threshold))>>14); + if (st->stream_channels == 2) + stereo_threshold -= 1000; + else + stereo_threshold += 1000; + st->stream_channels = (equiv_rate > stereo_threshold) ? 2 : 1; + } else { + st->stream_channels = st->channels; + } +#endif + } + /* Update equivalent rate for channels decision. */ + equiv_rate = compute_equiv_rate(st->bitrate_bps, st->stream_channels, st->Fs/frame_size, + st->use_vbr, 0, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); + + /* Allow SILK DTX if DTX is enabled but the generalized DTX cannot be used, + e.g. because of the complexity setting or sample rate. */ +#ifndef DISABLE_FLOAT_API + st->silk_mode.useDTX = st->use_dtx && !(analysis_info.valid || is_silence); +#else + st->silk_mode.useDTX = st->use_dtx; +#endif + + /* Mode selection depending on application and signal type */ + if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) + { + st->mode = MODE_CELT_ONLY; + } else if (st->user_forced_mode == OPUS_AUTO) + { +#ifdef FUZZING + /* Random mode switching */ + if ((rand()&0xF)==0) + { + if ((rand()&0x1)==0) + st->mode = MODE_CELT_ONLY; + else + st->mode = MODE_SILK_ONLY; + } else { + if (st->prev_mode==MODE_CELT_ONLY) + st->mode = MODE_CELT_ONLY; + else + st->mode = MODE_SILK_ONLY; + } +#else + opus_int32 mode_voice, mode_music; + opus_int32 threshold; + + /* Interpolate based on stereo width */ + mode_voice = (opus_int32)(MULT16_32_Q15(Q15ONE-stereo_width,mode_thresholds[0][0]) + + MULT16_32_Q15(stereo_width,mode_thresholds[1][0])); + mode_music = (opus_int32)(MULT16_32_Q15(Q15ONE-stereo_width,mode_thresholds[1][1]) + + MULT16_32_Q15(stereo_width,mode_thresholds[1][1])); + /* Interpolate based on speech/music probability */ + threshold = mode_music + ((voice_est*voice_est*(mode_voice-mode_music))>>14); + /* Bias towards SILK for VoIP because of some useful features */ + if (st->application == OPUS_APPLICATION_VOIP) + threshold += 8000; + + /*printf("%f %d\n", stereo_width/(float)Q15ONE, threshold);*/ + /* Hysteresis */ + if (st->prev_mode == MODE_CELT_ONLY) + threshold -= 4000; + else if (st->prev_mode>0) + threshold += 4000; + + st->mode = (equiv_rate >= threshold) ? MODE_CELT_ONLY: MODE_SILK_ONLY; + + /* When FEC is enabled and there's enough packet loss, use SILK */ + if (st->silk_mode.useInBandFEC && st->silk_mode.packetLossPercentage > (128-voice_est)>>4) + st->mode = MODE_SILK_ONLY; + /* When encoding voice and DTX is enabled but the generalized DTX cannot be used, + use SILK in order to make use of its DTX. */ + if (st->silk_mode.useDTX && voice_est > 100) + st->mode = MODE_SILK_ONLY; +#endif + + /* If max_data_bytes represents less than 6 kb/s, switch to CELT-only mode */ + if (max_data_bytes < (frame_rate > 50 ? 9000 : 6000)*frame_size / (st->Fs * 8)) + st->mode = MODE_CELT_ONLY; + } else { + st->mode = st->user_forced_mode; + } + + /* Override the chosen mode to make sure we meet the requested frame size */ + if (st->mode != MODE_CELT_ONLY && frame_size < st->Fs/100) + st->mode = MODE_CELT_ONLY; + if (st->lfe) + st->mode = MODE_CELT_ONLY; + + if (st->prev_mode > 0 && + ((st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) || + (st->mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY))) + { + redundancy = 1; + celt_to_silk = (st->mode != MODE_CELT_ONLY); + if (!celt_to_silk) + { + /* Switch to SILK/hybrid if frame size is 10 ms or more*/ + if (frame_size >= st->Fs/100) + { + st->mode = st->prev_mode; + to_celt = 1; + } else { + redundancy=0; + } + } + } + + /* When encoding multiframes, we can ask for a switch to CELT only in the last frame. This switch + * is processed above as the requested mode shouldn't interrupt stereo->mono transition. */ + if (st->stream_channels == 1 && st->prev_channels ==2 && st->silk_mode.toMono==0 + && st->mode != MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY) + { + /* Delay stereo->mono transition by two frames so that SILK can do a smooth downmix */ + st->silk_mode.toMono = 1; + st->stream_channels = 2; + } else { + st->silk_mode.toMono = 0; + } + + /* Update equivalent rate with mode decision. */ + equiv_rate = compute_equiv_rate(st->bitrate_bps, st->stream_channels, st->Fs/frame_size, + st->use_vbr, st->mode, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); + + if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) + { + silk_EncControlStruct dummy; + silk_InitEncoder( silk_enc, st->arch, &dummy); + prefill=1; + } + + /* Automatic (rate-dependent) bandwidth selection */ + if (st->mode == MODE_CELT_ONLY || st->first || st->silk_mode.allowBandwidthSwitch) + { + const opus_int32 *voice_bandwidth_thresholds, *music_bandwidth_thresholds; + opus_int32 bandwidth_thresholds[8]; + int bandwidth = OPUS_BANDWIDTH_FULLBAND; + + if (st->channels==2 && st->force_channels!=1) + { + voice_bandwidth_thresholds = stereo_voice_bandwidth_thresholds; + music_bandwidth_thresholds = stereo_music_bandwidth_thresholds; + } else { + voice_bandwidth_thresholds = mono_voice_bandwidth_thresholds; + music_bandwidth_thresholds = mono_music_bandwidth_thresholds; + } + /* Interpolate bandwidth thresholds depending on voice estimation */ + for (i=0;i<8;i++) + { + bandwidth_thresholds[i] = music_bandwidth_thresholds[i] + + ((voice_est*voice_est*(voice_bandwidth_thresholds[i]-music_bandwidth_thresholds[i]))>>14); + } + do { + int threshold, hysteresis; + threshold = bandwidth_thresholds[2*(bandwidth-OPUS_BANDWIDTH_MEDIUMBAND)]; + hysteresis = bandwidth_thresholds[2*(bandwidth-OPUS_BANDWIDTH_MEDIUMBAND)+1]; + if (!st->first) + { + if (st->auto_bandwidth >= bandwidth) + threshold -= hysteresis; + else + threshold += hysteresis; + } + if (equiv_rate >= threshold) + break; + } while (--bandwidth>OPUS_BANDWIDTH_NARROWBAND); + /* We don't use mediumband anymore, except when explicitly requested or during + mode transitions. */ + if (bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) + bandwidth = OPUS_BANDWIDTH_WIDEBAND; + st->bandwidth = st->auto_bandwidth = bandwidth; + /* Prevents any transition to SWB/FB until the SILK layer has fully + switched to WB mode and turned the variable LP filter off */ + if (!st->first && st->mode != MODE_CELT_ONLY && !st->silk_mode.inWBmodeWithoutVariableLP && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) + st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; + } + + if (st->bandwidth>st->max_bandwidth) + st->bandwidth = st->max_bandwidth; + + if (st->user_bandwidth != OPUS_AUTO) + st->bandwidth = st->user_bandwidth; + + /* This prevents us from using hybrid at unsafe CBR/max rates */ + if (st->mode != MODE_CELT_ONLY && max_rate < 15000) + { + st->bandwidth = IMIN(st->bandwidth, OPUS_BANDWIDTH_WIDEBAND); + } + + /* Prevents Opus from wasting bits on frequencies that are above + the Nyquist rate of the input signal */ + if (st->Fs <= 24000 && st->bandwidth > OPUS_BANDWIDTH_SUPERWIDEBAND) + st->bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; + if (st->Fs <= 16000 && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) + st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; + if (st->Fs <= 12000 && st->bandwidth > OPUS_BANDWIDTH_MEDIUMBAND) + st->bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; + if (st->Fs <= 8000 && st->bandwidth > OPUS_BANDWIDTH_NARROWBAND) + st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; +#ifndef DISABLE_FLOAT_API + /* Use detected bandwidth to reduce the encoded bandwidth. */ + if (st->detected_bandwidth && st->user_bandwidth == OPUS_AUTO) + { + int min_detected_bandwidth; + /* Makes bandwidth detection more conservative just in case the detector + gets it wrong when we could have coded a high bandwidth transparently. + When operating in SILK/hybrid mode, we don't go below wideband to avoid + more complicated switches that require redundancy. */ + if (equiv_rate <= 18000*st->stream_channels && st->mode == MODE_CELT_ONLY) + min_detected_bandwidth = OPUS_BANDWIDTH_NARROWBAND; + else if (equiv_rate <= 24000*st->stream_channels && st->mode == MODE_CELT_ONLY) + min_detected_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; + else if (equiv_rate <= 30000*st->stream_channels) + min_detected_bandwidth = OPUS_BANDWIDTH_WIDEBAND; + else if (equiv_rate <= 44000*st->stream_channels) + min_detected_bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; + else + min_detected_bandwidth = OPUS_BANDWIDTH_FULLBAND; + + st->detected_bandwidth = IMAX(st->detected_bandwidth, min_detected_bandwidth); + st->bandwidth = IMIN(st->bandwidth, st->detected_bandwidth); + } +#endif + st->silk_mode.LBRR_coded = decide_fec(st->silk_mode.useInBandFEC, st->silk_mode.packetLossPercentage, + st->silk_mode.LBRR_coded, st->mode, &st->bandwidth, equiv_rate); + celt_encoder_ctl(celt_enc, OPUS_SET_LSB_DEPTH(lsb_depth)); + + /* CELT mode doesn't support mediumband, use wideband instead */ + if (st->mode == MODE_CELT_ONLY && st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) + st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; + if (st->lfe) + st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; + + curr_bandwidth = st->bandwidth; + + /* Chooses the appropriate mode for speech + *NEVER* switch to/from CELT-only mode here as this will invalidate some assumptions */ + if (st->mode == MODE_SILK_ONLY && curr_bandwidth > OPUS_BANDWIDTH_WIDEBAND) + st->mode = MODE_HYBRID; + if (st->mode == MODE_HYBRID && curr_bandwidth <= OPUS_BANDWIDTH_WIDEBAND) + st->mode = MODE_SILK_ONLY; + + /* Can't support higher than >60 ms frames, and >20 ms when in Hybrid or CELT-only modes */ + if ((frame_size > st->Fs/50 && (st->mode != MODE_SILK_ONLY)) || frame_size > 3*st->Fs/50) + { + int enc_frame_size; + int nb_frames; + + if (st->mode == MODE_SILK_ONLY) + { + if (frame_size == 2*st->Fs/25) /* 80 ms -> 2x 40 ms */ + enc_frame_size = st->Fs/25; + else if (frame_size == 3*st->Fs/25) /* 120 ms -> 2x 60 ms */ + enc_frame_size = 3*st->Fs/50; + else /* 100 ms -> 5x 20 ms */ + enc_frame_size = st->Fs/50; + } + else + enc_frame_size = st->Fs/50; + + nb_frames = frame_size/enc_frame_size; + +#ifndef DISABLE_FLOAT_API + if (analysis_read_pos_bak!= -1) + { + st->analysis.read_pos = analysis_read_pos_bak; + st->analysis.read_subframe = analysis_read_subframe_bak; + } +#endif + + ret = encode_multiframe_packet(st, pcm, nb_frames, enc_frame_size, data, + out_data_bytes, to_celt, lsb_depth, float_api); + + RESTORE_STACK; + return ret; + } + + /* For the first frame at a new SILK bandwidth */ + if (st->silk_bw_switch) + { + redundancy = 1; + celt_to_silk = 1; + st->silk_bw_switch = 0; + /* Do a prefill without reseting the sampling rate control. */ + prefill=2; + } + + /* If we decided to go with CELT, make sure redundancy is off, no matter what + we decided earlier. */ + if (st->mode == MODE_CELT_ONLY) + redundancy = 0; + + if (redundancy) + { + redundancy_bytes = compute_redundancy_bytes(max_data_bytes, st->bitrate_bps, frame_rate, st->stream_channels); + if (redundancy_bytes == 0) + redundancy = 0; + } + + /* printf("%d %d %d %d\n", st->bitrate_bps, st->stream_channels, st->mode, curr_bandwidth); */ + bytes_target = IMIN(max_data_bytes-redundancy_bytes, st->bitrate_bps * frame_size / (st->Fs * 8)) - 1; + + data += 1; + + ec_enc_init(&enc, data, max_data_bytes-1); + + ALLOC(pcm_buf, (total_buffer+frame_size)*st->channels, opus_val16); + OPUS_COPY(pcm_buf, &st->delay_buffer[(st->encoder_buffer-total_buffer)*st->channels], total_buffer*st->channels); + + if (st->mode == MODE_CELT_ONLY) + hp_freq_smth1 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); + else + hp_freq_smth1 = ((silk_encoder*)silk_enc)->state_Fxx[0].sCmn.variable_HP_smth1_Q15; + + st->variable_HP_smth2_Q15 = silk_SMLAWB( st->variable_HP_smth2_Q15, + hp_freq_smth1 - st->variable_HP_smth2_Q15, SILK_FIX_CONST( VARIABLE_HP_SMTH_COEF2, 16 ) ); + + /* convert from log scale to Hertz */ + cutoff_Hz = silk_log2lin( silk_RSHIFT( st->variable_HP_smth2_Q15, 8 ) ); + + if (st->application == OPUS_APPLICATION_VOIP) + { + hp_cutoff(pcm, cutoff_Hz, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs, st->arch); + } else { + dc_reject(pcm, 3, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs); + } +#ifndef FIXED_POINT + if (float_api) + { + opus_val32 sum; + sum = celt_inner_prod(&pcm_buf[total_buffer*st->channels], &pcm_buf[total_buffer*st->channels], frame_size*st->channels, st->arch); + /* This should filter out both NaNs and ridiculous signals that could + cause NaNs further down. */ + if (!(sum < 1e9f) || celt_isnan(sum)) + { + OPUS_CLEAR(&pcm_buf[total_buffer*st->channels], frame_size*st->channels); + st->hp_mem[0] = st->hp_mem[1] = st->hp_mem[2] = st->hp_mem[3] = 0; + } + } +#endif + + + /* SILK processing */ + HB_gain = Q15ONE; + if (st->mode != MODE_CELT_ONLY) + { + opus_int32 total_bitRate, celt_rate; + opus_int activity; +#ifdef FIXED_POINT + const opus_int16 *pcm_silk; +#else + VARDECL(opus_int16, pcm_silk); + ALLOC(pcm_silk, st->channels*frame_size, opus_int16); +#endif + + activity = VAD_NO_DECISION; +#ifndef DISABLE_FLOAT_API + if( analysis_info.valid ) { + /* Inform SILK about the Opus VAD decision */ + activity = ( analysis_info.activity_probability >= DTX_ACTIVITY_THRESHOLD ); + } +#endif + + /* Distribute bits between SILK and CELT */ + total_bitRate = 8 * bytes_target * frame_rate; + if( st->mode == MODE_HYBRID ) { + /* Base rate for SILK */ + st->silk_mode.bitRate = compute_silk_rate_for_hybrid(total_bitRate, + curr_bandwidth, st->Fs == 50 * frame_size, st->use_vbr, st->silk_mode.LBRR_coded, + st->stream_channels); + if (!st->energy_masking) + { + /* Increasingly attenuate high band when it gets allocated fewer bits */ + celt_rate = total_bitRate - st->silk_mode.bitRate; + HB_gain = Q15ONE - SHR32(celt_exp2(-celt_rate * QCONST16(1.f/1024, 10)), 1); + } + } else { + /* SILK gets all bits */ + st->silk_mode.bitRate = total_bitRate; + } + + /* Surround masking for SILK */ + if (st->energy_masking && st->use_vbr && !st->lfe) + { + opus_val32 mask_sum=0; + opus_val16 masking_depth; + opus_int32 rate_offset; + int c; + int end = 17; + opus_int16 srate = 16000; + if (st->bandwidth == OPUS_BANDWIDTH_NARROWBAND) + { + end = 13; + srate = 8000; + } else if (st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) + { + end = 15; + srate = 12000; + } + for (c=0;cchannels;c++) + { + for(i=0;ienergy_masking[21*c+i], + QCONST16(.5f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT)); + if (mask > 0) + mask = HALF16(mask); + mask_sum += mask; + } + } + /* Conservative rate reduction, we cut the masking in half */ + masking_depth = mask_sum / end*st->channels; + masking_depth += QCONST16(.2f, DB_SHIFT); + rate_offset = (opus_int32)PSHR32(MULT16_16(srate, masking_depth), DB_SHIFT); + rate_offset = MAX32(rate_offset, -2*st->silk_mode.bitRate/3); + /* Split the rate change between the SILK and CELT part for hybrid. */ + if (st->bandwidth==OPUS_BANDWIDTH_SUPERWIDEBAND || st->bandwidth==OPUS_BANDWIDTH_FULLBAND) + st->silk_mode.bitRate += 3*rate_offset/5; + else + st->silk_mode.bitRate += rate_offset; + } + + st->silk_mode.payloadSize_ms = 1000 * frame_size / st->Fs; + st->silk_mode.nChannelsAPI = st->channels; + st->silk_mode.nChannelsInternal = st->stream_channels; + if (curr_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { + st->silk_mode.desiredInternalSampleRate = 8000; + } else if (curr_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { + st->silk_mode.desiredInternalSampleRate = 12000; + } else { + celt_assert( st->mode == MODE_HYBRID || curr_bandwidth == OPUS_BANDWIDTH_WIDEBAND ); + st->silk_mode.desiredInternalSampleRate = 16000; + } + if( st->mode == MODE_HYBRID ) { + /* Don't allow bandwidth reduction at lowest bitrates in hybrid mode */ + st->silk_mode.minInternalSampleRate = 16000; + } else { + st->silk_mode.minInternalSampleRate = 8000; + } + + st->silk_mode.maxInternalSampleRate = 16000; + if (st->mode == MODE_SILK_ONLY) + { + opus_int32 effective_max_rate = max_rate; + if (frame_rate > 50) + effective_max_rate = effective_max_rate*2/3; + if (effective_max_rate < 8000) + { + st->silk_mode.maxInternalSampleRate = 12000; + st->silk_mode.desiredInternalSampleRate = IMIN(12000, st->silk_mode.desiredInternalSampleRate); + } + if (effective_max_rate < 7000) + { + st->silk_mode.maxInternalSampleRate = 8000; + st->silk_mode.desiredInternalSampleRate = IMIN(8000, st->silk_mode.desiredInternalSampleRate); + } + } + + st->silk_mode.useCBR = !st->use_vbr; + + /* Call SILK encoder for the low band */ + + /* Max bits for SILK, counting ToC, redundancy bytes, and optionally redundancy. */ + st->silk_mode.maxBits = (max_data_bytes-1)*8; + if (redundancy && redundancy_bytes >= 2) + { + /* Counting 1 bit for redundancy position and 20 bits for flag+size (only for hybrid). */ + st->silk_mode.maxBits -= redundancy_bytes*8 + 1; + if (st->mode == MODE_HYBRID) + st->silk_mode.maxBits -= 20; + } + if (st->silk_mode.useCBR) + { + if (st->mode == MODE_HYBRID) + { + st->silk_mode.maxBits = IMIN(st->silk_mode.maxBits, st->silk_mode.bitRate * frame_size / st->Fs); + } + } else { + /* Constrained VBR. */ + if (st->mode == MODE_HYBRID) + { + /* Compute SILK bitrate corresponding to the max total bits available */ + opus_int32 maxBitRate = compute_silk_rate_for_hybrid(st->silk_mode.maxBits*st->Fs / frame_size, + curr_bandwidth, st->Fs == 50 * frame_size, st->use_vbr, st->silk_mode.LBRR_coded, + st->stream_channels); + st->silk_mode.maxBits = maxBitRate * frame_size / st->Fs; + } + } + + if (prefill) + { + opus_int32 zero=0; + int prefill_offset; + /* Use a smooth onset for the SILK prefill to avoid the encoder trying to encode + a discontinuity. The exact location is what we need to avoid leaving any "gap" + in the audio when mixing with the redundant CELT frame. Here we can afford to + overwrite st->delay_buffer because the only thing that uses it before it gets + rewritten is tmp_prefill[] and even then only the part after the ramp really + gets used (rather than sent to the encoder and discarded) */ + prefill_offset = st->channels*(st->encoder_buffer-st->delay_compensation-st->Fs/400); + gain_fade(st->delay_buffer+prefill_offset, st->delay_buffer+prefill_offset, + 0, Q15ONE, celt_mode->overlap, st->Fs/400, st->channels, celt_mode->window, st->Fs); + OPUS_CLEAR(st->delay_buffer, prefill_offset); +#ifdef FIXED_POINT + pcm_silk = st->delay_buffer; +#else + for (i=0;iencoder_buffer*st->channels;i++) + pcm_silk[i] = FLOAT2INT16(st->delay_buffer[i]); +#endif + silk_Encode( silk_enc, &st->silk_mode, pcm_silk, st->encoder_buffer, NULL, &zero, prefill, activity ); + /* Prevent a second switch in the real encode call. */ + st->silk_mode.opusCanSwitch = 0; + } + +#ifdef FIXED_POINT + pcm_silk = pcm_buf+total_buffer*st->channels; +#else + for (i=0;ichannels;i++) + pcm_silk[i] = FLOAT2INT16(pcm_buf[total_buffer*st->channels + i]); +#endif + ret = silk_Encode( silk_enc, &st->silk_mode, pcm_silk, frame_size, &enc, &nBytes, 0, activity ); + if( ret ) { + /*fprintf (stderr, "SILK encode error: %d\n", ret);*/ + /* Handle error */ + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + + /* Extract SILK internal bandwidth for signaling in first byte */ + if( st->mode == MODE_SILK_ONLY ) { + if( st->silk_mode.internalSampleRate == 8000 ) { + curr_bandwidth = OPUS_BANDWIDTH_NARROWBAND; + } else if( st->silk_mode.internalSampleRate == 12000 ) { + curr_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; + } else if( st->silk_mode.internalSampleRate == 16000 ) { + curr_bandwidth = OPUS_BANDWIDTH_WIDEBAND; + } + } else { + celt_assert( st->silk_mode.internalSampleRate == 16000 ); + } + + st->silk_mode.opusCanSwitch = st->silk_mode.switchReady && !st->nonfinal_frame; + + if (nBytes==0) + { + st->rangeFinal = 0; + data[-1] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); + RESTORE_STACK; + return 1; + } + + /* FIXME: How do we allocate the redundancy for CBR? */ + if (st->silk_mode.opusCanSwitch) + { + redundancy_bytes = compute_redundancy_bytes(max_data_bytes, st->bitrate_bps, frame_rate, st->stream_channels); + redundancy = (redundancy_bytes != 0); + celt_to_silk = 0; + st->silk_bw_switch = 1; + } + } + + /* CELT processing */ + { + int endband=21; + + switch(curr_bandwidth) + { + case OPUS_BANDWIDTH_NARROWBAND: + endband = 13; + break; + case OPUS_BANDWIDTH_MEDIUMBAND: + case OPUS_BANDWIDTH_WIDEBAND: + endband = 17; + break; + case OPUS_BANDWIDTH_SUPERWIDEBAND: + endband = 19; + break; + case OPUS_BANDWIDTH_FULLBAND: + endband = 21; + break; + } + celt_encoder_ctl(celt_enc, CELT_SET_END_BAND(endband)); + celt_encoder_ctl(celt_enc, CELT_SET_CHANNELS(st->stream_channels)); + } + celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); + if (st->mode != MODE_SILK_ONLY) + { + opus_val32 celt_pred=2; + celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); + /* We may still decide to disable prediction later */ + if (st->silk_mode.reducedDependency) + celt_pred = 0; + celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(celt_pred)); + + if (st->mode == MODE_HYBRID) + { + if( st->use_vbr ) { + celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps-st->silk_mode.bitRate)); + celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(0)); + } + } else { + if (st->use_vbr) + { + celt_encoder_ctl(celt_enc, OPUS_SET_VBR(1)); + celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(st->vbr_constraint)); + celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps)); + } + } + } + + ALLOC(tmp_prefill, st->channels*st->Fs/400, opus_val16); + if (st->mode != MODE_SILK_ONLY && st->mode != st->prev_mode && st->prev_mode > 0) + { + OPUS_COPY(tmp_prefill, &st->delay_buffer[(st->encoder_buffer-total_buffer-st->Fs/400)*st->channels], st->channels*st->Fs/400); + } + + if (st->channels*(st->encoder_buffer-(frame_size+total_buffer)) > 0) + { + OPUS_MOVE(st->delay_buffer, &st->delay_buffer[st->channels*frame_size], st->channels*(st->encoder_buffer-frame_size-total_buffer)); + OPUS_COPY(&st->delay_buffer[st->channels*(st->encoder_buffer-frame_size-total_buffer)], + &pcm_buf[0], + (frame_size+total_buffer)*st->channels); + } else { + OPUS_COPY(st->delay_buffer, &pcm_buf[(frame_size+total_buffer-st->encoder_buffer)*st->channels], st->encoder_buffer*st->channels); + } + /* gain_fade() and stereo_fade() need to be after the buffer copying + because we don't want any of this to affect the SILK part */ + if( st->prev_HB_gain < Q15ONE || HB_gain < Q15ONE ) { + gain_fade(pcm_buf, pcm_buf, + st->prev_HB_gain, HB_gain, celt_mode->overlap, frame_size, st->channels, celt_mode->window, st->Fs); + } + st->prev_HB_gain = HB_gain; + if (st->mode != MODE_HYBRID || st->stream_channels==1) + { + if (equiv_rate > 32000) + st->silk_mode.stereoWidth_Q14 = 16384; + else if (equiv_rate < 16000) + st->silk_mode.stereoWidth_Q14 = 0; + else + st->silk_mode.stereoWidth_Q14 = 16384 - 2048*(opus_int32)(32000-equiv_rate)/(equiv_rate-14000); + } + if( !st->energy_masking && st->channels == 2 ) { + /* Apply stereo width reduction (at low bitrates) */ + if( st->hybrid_stereo_width_Q14 < (1 << 14) || st->silk_mode.stereoWidth_Q14 < (1 << 14) ) { + opus_val16 g1, g2; + g1 = st->hybrid_stereo_width_Q14; + g2 = (opus_val16)(st->silk_mode.stereoWidth_Q14); +#ifdef FIXED_POINT + g1 = g1==16384 ? Q15ONE : SHL16(g1,1); + g2 = g2==16384 ? Q15ONE : SHL16(g2,1); +#else + g1 *= (1.f/16384); + g2 *= (1.f/16384); +#endif + stereo_fade(pcm_buf, pcm_buf, g1, g2, celt_mode->overlap, + frame_size, st->channels, celt_mode->window, st->Fs); + st->hybrid_stereo_width_Q14 = st->silk_mode.stereoWidth_Q14; + } + } + + if ( st->mode != MODE_CELT_ONLY && ec_tell(&enc)+17+20*(st->mode == MODE_HYBRID) <= 8*(max_data_bytes-1)) + { + /* For SILK mode, the redundancy is inferred from the length */ + if (st->mode == MODE_HYBRID) + ec_enc_bit_logp(&enc, redundancy, 12); + if (redundancy) + { + int max_redundancy; + ec_enc_bit_logp(&enc, celt_to_silk, 1); + if (st->mode == MODE_HYBRID) + { + /* Reserve the 8 bits needed for the redundancy length, + and at least a few bits for CELT if possible */ + max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+8+3+7)>>3); + } + else + max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+7)>>3); + /* Target the same bit-rate for redundancy as for the rest, + up to a max of 257 bytes */ + redundancy_bytes = IMIN(max_redundancy, redundancy_bytes); + redundancy_bytes = IMIN(257, IMAX(2, redundancy_bytes)); + if (st->mode == MODE_HYBRID) + ec_enc_uint(&enc, redundancy_bytes-2, 256); + } + } else { + redundancy = 0; + } + + if (!redundancy) + { + st->silk_bw_switch = 0; + redundancy_bytes = 0; + } + if (st->mode != MODE_CELT_ONLY)start_band=17; + + if (st->mode == MODE_SILK_ONLY) + { + ret = (ec_tell(&enc)+7)>>3; + ec_enc_done(&enc); + nb_compr_bytes = ret; + } else { + nb_compr_bytes = (max_data_bytes-1)-redundancy_bytes; + ec_enc_shrink(&enc, nb_compr_bytes); + } + +#ifndef DISABLE_FLOAT_API + if (redundancy || st->mode != MODE_SILK_ONLY) + celt_encoder_ctl(celt_enc, CELT_SET_ANALYSIS(&analysis_info)); +#endif + if (st->mode == MODE_HYBRID) { + SILKInfo info; + info.signalType = st->silk_mode.signalType; + info.offset = st->silk_mode.offset; + celt_encoder_ctl(celt_enc, CELT_SET_SILK_INFO(&info)); + } + + /* 5 ms redundant frame for CELT->SILK */ + if (redundancy && celt_to_silk) + { + int err; + celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(0)); + celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); + celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); + err = celt_encode_with_ec(celt_enc, pcm_buf, st->Fs/200, data+nb_compr_bytes, redundancy_bytes, NULL); + if (err < 0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + celt_encoder_ctl(celt_enc, OPUS_GET_FINAL_RANGE(&redundant_rng)); + celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); + } + + celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(start_band)); + + if (st->mode != MODE_SILK_ONLY) + { + if (st->mode != st->prev_mode && st->prev_mode > 0) + { + unsigned char dummy[2]; + celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); + + /* Prefilling */ + celt_encode_with_ec(celt_enc, tmp_prefill, st->Fs/400, dummy, 2, NULL); + celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(0)); + } + /* If false, we already busted the budget and we'll end up with a "PLC frame" */ + if (ec_tell(&enc) <= 8*nb_compr_bytes) + { + /* Set the bitrate again if it was overridden in the redundancy code above*/ + if (redundancy && celt_to_silk && st->mode==MODE_HYBRID && st->use_vbr) + celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps-st->silk_mode.bitRate)); + celt_encoder_ctl(celt_enc, OPUS_SET_VBR(st->use_vbr)); + ret = celt_encode_with_ec(celt_enc, pcm_buf, frame_size, NULL, nb_compr_bytes, &enc); + if (ret < 0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + /* Put CELT->SILK redundancy data in the right place. */ + if (redundancy && celt_to_silk && st->mode==MODE_HYBRID && st->use_vbr) + { + OPUS_MOVE(data+ret, data+nb_compr_bytes, redundancy_bytes); + nb_compr_bytes = nb_compr_bytes+redundancy_bytes; + } + } + } + + /* 5 ms redundant frame for SILK->CELT */ + if (redundancy && !celt_to_silk) + { + int err; + unsigned char dummy[2]; + int N2, N4; + N2 = st->Fs/200; + N4 = st->Fs/400; + + celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); + celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(0)); + celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(0)); + celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); + celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); + + if (st->mode == MODE_HYBRID) + { + /* Shrink packet to what the encoder actually used. */ + nb_compr_bytes = ret; + ec_enc_shrink(&enc, nb_compr_bytes); + } + /* NOTE: We could speed this up slightly (at the expense of code size) by just adding a function that prefills the buffer */ + celt_encode_with_ec(celt_enc, pcm_buf+st->channels*(frame_size-N2-N4), N4, dummy, 2, NULL); + + err = celt_encode_with_ec(celt_enc, pcm_buf+st->channels*(frame_size-N2), N2, data+nb_compr_bytes, redundancy_bytes, NULL); + if (err < 0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + celt_encoder_ctl(celt_enc, OPUS_GET_FINAL_RANGE(&redundant_rng)); + } + + + + /* Signalling the mode in the first byte */ + data--; + data[0] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); + + st->rangeFinal = enc.rng ^ redundant_rng; + + if (to_celt) + st->prev_mode = MODE_CELT_ONLY; + else + st->prev_mode = st->mode; + st->prev_channels = st->stream_channels; + st->prev_framesize = frame_size; + + st->first = 0; + + /* DTX decision */ +#ifndef DISABLE_FLOAT_API + if (st->use_dtx && (analysis_info.valid || is_silence)) + { + if (decide_dtx_mode(analysis_info.activity_probability, &st->nb_no_activity_frames, + st->peak_signal_energy, pcm, frame_size, st->channels, is_silence, st->arch)) + { + st->rangeFinal = 0; + data[0] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); + RESTORE_STACK; + return 1; + } + } else { + st->nb_no_activity_frames = 0; + } +#endif + + /* In the unlikely case that the SILK encoder busted its target, tell + the decoder to call the PLC */ + if (ec_tell(&enc) > (max_data_bytes-1)*8) + { + if (max_data_bytes < 2) + { + RESTORE_STACK; + return OPUS_BUFFER_TOO_SMALL; + } + data[1] = 0; + ret = 1; + st->rangeFinal = 0; + } else if (st->mode==MODE_SILK_ONLY&&!redundancy) + { + /*When in LPC only mode it's perfectly + reasonable to strip off trailing zero bytes as + the required range decoder behavior is to + fill these in. This can't be done when the MDCT + modes are used because the decoder needs to know + the actual length for allocation purposes.*/ + while(ret>2&&data[ret]==0)ret--; + } + /* Count ToC and redundancy */ + ret += 1+redundancy_bytes; + if (!st->use_vbr) + { + if (opus_packet_pad(data, ret, max_data_bytes) != OPUS_OK) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + ret = max_data_bytes; + } + RESTORE_STACK; + return ret; +} + +#ifdef FIXED_POINT + +#ifndef DISABLE_FLOAT_API +opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int analysis_frame_size, + unsigned char *data, opus_int32 max_data_bytes) +{ + int i, ret; + int frame_size; + VARDECL(opus_int16, in); + ALLOC_STACK; + + frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); + if (frame_size <= 0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + ALLOC(in, frame_size*st->channels, opus_int16); + + for (i=0;ichannels;i++) + in[i] = FLOAT2INT16(pcm[i]); + ret = opus_encode_native(st, in, frame_size, data, max_data_bytes, 16, + pcm, analysis_frame_size, 0, -2, st->channels, downmix_float, 1); + RESTORE_STACK; + return ret; +} +#endif + +opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_frame_size, + unsigned char *data, opus_int32 out_data_bytes) +{ + int frame_size; + frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); + return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 16, + pcm, analysis_frame_size, 0, -2, st->channels, downmix_int, 0); +} + +#else +opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_frame_size, + unsigned char *data, opus_int32 max_data_bytes) +{ + int i, ret; + int frame_size; + VARDECL(float, in); + ALLOC_STACK; + + frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); + if (frame_size <= 0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + ALLOC(in, frame_size*st->channels, float); + + for (i=0;ichannels;i++) + in[i] = (1.0f/32768)*pcm[i]; + ret = opus_encode_native(st, in, frame_size, data, max_data_bytes, 16, + pcm, analysis_frame_size, 0, -2, st->channels, downmix_int, 0); + RESTORE_STACK; + return ret; +} +opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int analysis_frame_size, + unsigned char *data, opus_int32 out_data_bytes) +{ + int frame_size; + frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); + return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 24, + pcm, analysis_frame_size, 0, -2, st->channels, downmix_float, 1); +} +#endif + + +int opus_encoder_ctl(OpusEncoder *st, int request, ...) +{ + int ret; + CELTEncoder *celt_enc; + va_list ap; + + ret = OPUS_OK; + va_start(ap, request); + + celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); + + switch (request) + { + case OPUS_SET_APPLICATION_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if ( (value != OPUS_APPLICATION_VOIP && value != OPUS_APPLICATION_AUDIO + && value != OPUS_APPLICATION_RESTRICTED_LOWDELAY) + || (!st->first && st->application != value)) + { + ret = OPUS_BAD_ARG; + break; + } + st->application = value; +#ifndef DISABLE_FLOAT_API + st->analysis.application = value; +#endif + } + break; + case OPUS_GET_APPLICATION_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->application; + } + break; + case OPUS_SET_BITRATE_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value != OPUS_AUTO && value != OPUS_BITRATE_MAX) + { + if (value <= 0) + goto bad_arg; + else if (value <= 500) + value = 500; + else if (value > (opus_int32)300000*st->channels) + value = (opus_int32)300000*st->channels; + } + st->user_bitrate_bps = value; + } + break; + case OPUS_GET_BITRATE_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = user_bitrate_to_bitrate(st, st->prev_framesize, 1276); + } + break; + case OPUS_SET_FORCE_CHANNELS_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if((value<1 || value>st->channels) && value != OPUS_AUTO) + { + goto bad_arg; + } + st->force_channels = value; + } + break; + case OPUS_GET_FORCE_CHANNELS_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->force_channels; + } + break; + case OPUS_SET_MAX_BANDWIDTH_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) + { + goto bad_arg; + } + st->max_bandwidth = value; + if (st->max_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { + st->silk_mode.maxInternalSampleRate = 8000; + } else if (st->max_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { + st->silk_mode.maxInternalSampleRate = 12000; + } else { + st->silk_mode.maxInternalSampleRate = 16000; + } + } + break; + case OPUS_GET_MAX_BANDWIDTH_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->max_bandwidth; + } + break; + case OPUS_SET_BANDWIDTH_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if ((value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) && value != OPUS_AUTO) + { + goto bad_arg; + } + st->user_bandwidth = value; + if (st->user_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { + st->silk_mode.maxInternalSampleRate = 8000; + } else if (st->user_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { + st->silk_mode.maxInternalSampleRate = 12000; + } else { + st->silk_mode.maxInternalSampleRate = 16000; + } + } + break; + case OPUS_GET_BANDWIDTH_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->bandwidth; + } + break; + case OPUS_SET_DTX_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + st->use_dtx = value; + } + break; + case OPUS_GET_DTX_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->use_dtx; + } + break; + case OPUS_SET_COMPLEXITY_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>10) + { + goto bad_arg; + } + st->silk_mode.complexity = value; + celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(value)); + } + break; + case OPUS_GET_COMPLEXITY_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->silk_mode.complexity; + } + break; + case OPUS_SET_INBAND_FEC_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + st->silk_mode.useInBandFEC = value; + } + break; + case OPUS_GET_INBAND_FEC_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->silk_mode.useInBandFEC; + } + break; + case OPUS_SET_PACKET_LOSS_PERC_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value < 0 || value > 100) + { + goto bad_arg; + } + st->silk_mode.packetLossPercentage = value; + celt_encoder_ctl(celt_enc, OPUS_SET_PACKET_LOSS_PERC(value)); + } + break; + case OPUS_GET_PACKET_LOSS_PERC_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->silk_mode.packetLossPercentage; + } + break; + case OPUS_SET_VBR_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + st->use_vbr = value; + st->silk_mode.useCBR = 1-value; + } + break; + case OPUS_GET_VBR_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->use_vbr; + } + break; + case OPUS_SET_VOICE_RATIO_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<-1 || value>100) + { + goto bad_arg; + } + st->voice_ratio = value; + } + break; + case OPUS_GET_VOICE_RATIO_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->voice_ratio; + } + break; + case OPUS_SET_VBR_CONSTRAINT_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + st->vbr_constraint = value; + } + break; + case OPUS_GET_VBR_CONSTRAINT_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->vbr_constraint; + } + break; + case OPUS_SET_SIGNAL_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value!=OPUS_AUTO && value!=OPUS_SIGNAL_VOICE && value!=OPUS_SIGNAL_MUSIC) + { + goto bad_arg; + } + st->signal_type = value; + } + break; + case OPUS_GET_SIGNAL_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->signal_type; + } + break; + case OPUS_GET_LOOKAHEAD_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->Fs/400; + if (st->application != OPUS_APPLICATION_RESTRICTED_LOWDELAY) + *value += st->delay_compensation; + } + break; + case OPUS_GET_SAMPLE_RATE_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->Fs; + } + break; + case OPUS_GET_FINAL_RANGE_REQUEST: + { + opus_uint32 *value = va_arg(ap, opus_uint32*); + if (!value) + { + goto bad_arg; + } + *value = st->rangeFinal; + } + break; + case OPUS_SET_LSB_DEPTH_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value<8 || value>24) + { + goto bad_arg; + } + st->lsb_depth=value; + } + break; + case OPUS_GET_LSB_DEPTH_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->lsb_depth; + } + break; + case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value != OPUS_FRAMESIZE_ARG && value != OPUS_FRAMESIZE_2_5_MS && + value != OPUS_FRAMESIZE_5_MS && value != OPUS_FRAMESIZE_10_MS && + value != OPUS_FRAMESIZE_20_MS && value != OPUS_FRAMESIZE_40_MS && + value != OPUS_FRAMESIZE_60_MS && value != OPUS_FRAMESIZE_80_MS && + value != OPUS_FRAMESIZE_100_MS && value != OPUS_FRAMESIZE_120_MS) + { + goto bad_arg; + } + st->variable_duration = value; + } + break; + case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->variable_duration; + } + break; + case OPUS_SET_PREDICTION_DISABLED_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if (value > 1 || value < 0) + goto bad_arg; + st->silk_mode.reducedDependency = value; + } + break; + case OPUS_GET_PREDICTION_DISABLED_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + goto bad_arg; + *value = st->silk_mode.reducedDependency; + } + break; + case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if(value<0 || value>1) + { + goto bad_arg; + } + celt_encoder_ctl(celt_enc, OPUS_SET_PHASE_INVERSION_DISABLED(value)); + } + break; + case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + celt_encoder_ctl(celt_enc, OPUS_GET_PHASE_INVERSION_DISABLED(value)); + } + break; + case OPUS_RESET_STATE: + { + void *silk_enc; + silk_EncControlStruct dummy; + char *start; + silk_enc = (char*)st+st->silk_enc_offset; +#ifndef DISABLE_FLOAT_API + tonality_analysis_reset(&st->analysis); +#endif + + start = (char*)&st->OPUS_ENCODER_RESET_START; + OPUS_CLEAR(start, sizeof(OpusEncoder) - (start - (char*)st)); + + celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); + silk_InitEncoder( silk_enc, st->arch, &dummy ); + st->stream_channels = st->channels; + st->hybrid_stereo_width_Q14 = 1 << 14; + st->prev_HB_gain = Q15ONE; + st->first = 1; + st->mode = MODE_HYBRID; + st->bandwidth = OPUS_BANDWIDTH_FULLBAND; + st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); + } + break; + case OPUS_SET_FORCE_MODE_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + if ((value < MODE_SILK_ONLY || value > MODE_CELT_ONLY) && value != OPUS_AUTO) + { + goto bad_arg; + } + st->user_forced_mode = value; + } + break; + case OPUS_SET_LFE_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->lfe = value; + ret = celt_encoder_ctl(celt_enc, OPUS_SET_LFE(value)); + } + break; + case OPUS_SET_ENERGY_MASK_REQUEST: + { + opus_val16 *value = va_arg(ap, opus_val16*); + st->energy_masking = value; + ret = celt_encoder_ctl(celt_enc, OPUS_SET_ENERGY_MASK(value)); + } + break; + case OPUS_GET_IN_DTX_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + if (st->silk_mode.useDTX && (st->prev_mode == MODE_SILK_ONLY || st->prev_mode == MODE_HYBRID)) { + /* DTX determined by Silk. */ + int n; + void *silk_enc = (char*)st+st->silk_enc_offset; + *value = 1; + for (n=0;nsilk_mode.nChannelsInternal;n++) { + *value = *value && ((silk_encoder*)silk_enc)->state_Fxx[n].sCmn.noSpeechCounter >= NB_SPEECH_FRAMES_BEFORE_DTX; + } + } +#ifndef DISABLE_FLOAT_API + else if (st->use_dtx) { + /* DTX determined by Opus. */ + *value = st->nb_no_activity_frames >= NB_SPEECH_FRAMES_BEFORE_DTX; + } +#endif + else { + *value = 0; + } + } + break; + + case CELT_GET_MODE_REQUEST: + { + const CELTMode ** value = va_arg(ap, const CELTMode**); + if (!value) + { + goto bad_arg; + } + ret = celt_encoder_ctl(celt_enc, CELT_GET_MODE(value)); + } + break; + default: + /* fprintf(stderr, "unknown opus_encoder_ctl() request: %d", request);*/ + ret = OPUS_UNIMPLEMENTED; + break; + } + va_end(ap); + return ret; +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; +} + +void opus_encoder_destroy(OpusEncoder *st) +{ + opus_free(st); +} diff --git a/external/opus-1.3.1/src/opus_multistream.c b/external/opus-1.3.1/src/opus_multistream.c new file mode 100644 index 00000000..09c3639b --- /dev/null +++ b/external/opus-1.3.1/src/opus_multistream.c @@ -0,0 +1,92 @@ +/* Copyright (c) 2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "opus_multistream.h" +#include "opus.h" +#include "opus_private.h" +#include "stack_alloc.h" +#include +#include "float_cast.h" +#include "os_support.h" + + +int validate_layout(const ChannelLayout *layout) +{ + int i, max_channel; + + max_channel = layout->nb_streams+layout->nb_coupled_streams; + if (max_channel>255) + return 0; + for (i=0;inb_channels;i++) + { + if (layout->mapping[i] >= max_channel && layout->mapping[i] != 255) + return 0; + } + return 1; +} + + +int get_left_channel(const ChannelLayout *layout, int stream_id, int prev) +{ + int i; + i = (prev<0) ? 0 : prev+1; + for (;inb_channels;i++) + { + if (layout->mapping[i]==stream_id*2) + return i; + } + return -1; +} + +int get_right_channel(const ChannelLayout *layout, int stream_id, int prev) +{ + int i; + i = (prev<0) ? 0 : prev+1; + for (;inb_channels;i++) + { + if (layout->mapping[i]==stream_id*2+1) + return i; + } + return -1; +} + +int get_mono_channel(const ChannelLayout *layout, int stream_id, int prev) +{ + int i; + i = (prev<0) ? 0 : prev+1; + for (;inb_channels;i++) + { + if (layout->mapping[i]==stream_id+layout->nb_coupled_streams) + return i; + } + return -1; +} + diff --git a/external/opus-1.3.1/src/opus_multistream_decoder.c b/external/opus-1.3.1/src/opus_multistream_decoder.c new file mode 100644 index 00000000..0018517a --- /dev/null +++ b/external/opus-1.3.1/src/opus_multistream_decoder.c @@ -0,0 +1,549 @@ +/* Copyright (c) 2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "opus_multistream.h" +#include "opus.h" +#include "opus_private.h" +#include "stack_alloc.h" +#include +#include "float_cast.h" +#include "os_support.h" + +/* DECODER */ + +#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) +static void validate_ms_decoder(OpusMSDecoder *st) +{ + validate_layout(&st->layout); +} +#define VALIDATE_MS_DECODER(st) validate_ms_decoder(st) +#else +#define VALIDATE_MS_DECODER(st) +#endif + + +opus_int32 opus_multistream_decoder_get_size(int nb_streams, int nb_coupled_streams) +{ + int coupled_size; + int mono_size; + + if(nb_streams<1||nb_coupled_streams>nb_streams||nb_coupled_streams<0)return 0; + coupled_size = opus_decoder_get_size(2); + mono_size = opus_decoder_get_size(1); + return align(sizeof(OpusMSDecoder)) + + nb_coupled_streams * align(coupled_size) + + (nb_streams-nb_coupled_streams) * align(mono_size); +} + +int opus_multistream_decoder_init( + OpusMSDecoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping +) +{ + int coupled_size; + int mono_size; + int i, ret; + char *ptr; + + if ((channels>255) || (channels<1) || (coupled_streams>streams) || + (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) + return OPUS_BAD_ARG; + + st->layout.nb_channels = channels; + st->layout.nb_streams = streams; + st->layout.nb_coupled_streams = coupled_streams; + + for (i=0;ilayout.nb_channels;i++) + st->layout.mapping[i] = mapping[i]; + if (!validate_layout(&st->layout)) + return OPUS_BAD_ARG; + + ptr = (char*)st + align(sizeof(OpusMSDecoder)); + coupled_size = opus_decoder_get_size(2); + mono_size = opus_decoder_get_size(1); + + for (i=0;ilayout.nb_coupled_streams;i++) + { + ret=opus_decoder_init((OpusDecoder*)ptr, Fs, 2); + if(ret!=OPUS_OK)return ret; + ptr += align(coupled_size); + } + for (;ilayout.nb_streams;i++) + { + ret=opus_decoder_init((OpusDecoder*)ptr, Fs, 1); + if(ret!=OPUS_OK)return ret; + ptr += align(mono_size); + } + return OPUS_OK; +} + + +OpusMSDecoder *opus_multistream_decoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping, + int *error +) +{ + int ret; + OpusMSDecoder *st; + if ((channels>255) || (channels<1) || (coupled_streams>streams) || + (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) + { + if (error) + *error = OPUS_BAD_ARG; + return NULL; + } + st = (OpusMSDecoder *)opus_alloc(opus_multistream_decoder_get_size(streams, coupled_streams)); + if (st==NULL) + { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + ret = opus_multistream_decoder_init(st, Fs, channels, streams, coupled_streams, mapping); + if (error) + *error = ret; + if (ret != OPUS_OK) + { + opus_free(st); + st = NULL; + } + return st; +} + +static int opus_multistream_packet_validate(const unsigned char *data, + opus_int32 len, int nb_streams, opus_int32 Fs) +{ + int s; + int count; + unsigned char toc; + opus_int16 size[48]; + int samples=0; + opus_int32 packet_offset; + + for (s=0;slayout.nb_streams-1) + { + RESTORE_STACK; + return OPUS_INVALID_PACKET; + } + if (!do_plc) + { + int ret = opus_multistream_packet_validate(data, len, st->layout.nb_streams, Fs); + if (ret < 0) + { + RESTORE_STACK; + return ret; + } else if (ret > frame_size) + { + RESTORE_STACK; + return OPUS_BUFFER_TOO_SMALL; + } + } + for (s=0;slayout.nb_streams;s++) + { + OpusDecoder *dec; + opus_int32 packet_offset; + int ret; + + dec = (OpusDecoder*)ptr; + ptr += (s < st->layout.nb_coupled_streams) ? align(coupled_size) : align(mono_size); + + if (!do_plc && len<=0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + packet_offset = 0; + ret = opus_decode_native(dec, data, len, buf, frame_size, decode_fec, s!=st->layout.nb_streams-1, &packet_offset, soft_clip); + data += packet_offset; + len -= packet_offset; + if (ret <= 0) + { + RESTORE_STACK; + return ret; + } + frame_size = ret; + if (s < st->layout.nb_coupled_streams) + { + int chan, prev; + prev = -1; + /* Copy "left" audio to the channel(s) where it belongs */ + while ( (chan = get_left_channel(&st->layout, s, prev)) != -1) + { + (*copy_channel_out)(pcm, st->layout.nb_channels, chan, + buf, 2, frame_size, user_data); + prev = chan; + } + prev = -1; + /* Copy "right" audio to the channel(s) where it belongs */ + while ( (chan = get_right_channel(&st->layout, s, prev)) != -1) + { + (*copy_channel_out)(pcm, st->layout.nb_channels, chan, + buf+1, 2, frame_size, user_data); + prev = chan; + } + } else { + int chan, prev; + prev = -1; + /* Copy audio to the channel(s) where it belongs */ + while ( (chan = get_mono_channel(&st->layout, s, prev)) != -1) + { + (*copy_channel_out)(pcm, st->layout.nb_channels, chan, + buf, 1, frame_size, user_data); + prev = chan; + } + } + } + /* Handle muted channels */ + for (c=0;clayout.nb_channels;c++) + { + if (st->layout.mapping[c] == 255) + { + (*copy_channel_out)(pcm, st->layout.nb_channels, c, + NULL, 0, frame_size, user_data); + } + } + RESTORE_STACK; + return frame_size; +} + +#if !defined(DISABLE_FLOAT_API) +static void opus_copy_channel_out_float( + void *dst, + int dst_stride, + int dst_channel, + const opus_val16 *src, + int src_stride, + int frame_size, + void *user_data +) +{ + float *float_dst; + opus_int32 i; + (void)user_data; + float_dst = (float*)dst; + if (src != NULL) + { + for (i=0;ilayout.nb_streams;s++) + { + OpusDecoder *dec; + dec = (OpusDecoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + ret = opus_decoder_ctl(dec, request, &tmp); + if (ret != OPUS_OK) break; + *value ^= tmp; + } + } + break; + case OPUS_RESET_STATE: + { + int s; + for (s=0;slayout.nb_streams;s++) + { + OpusDecoder *dec; + + dec = (OpusDecoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + ret = opus_decoder_ctl(dec, OPUS_RESET_STATE); + if (ret != OPUS_OK) + break; + } + } + break; + case OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST: + { + int s; + opus_int32 stream_id; + OpusDecoder **value; + stream_id = va_arg(ap, opus_int32); + if (stream_id<0 || stream_id >= st->layout.nb_streams) + goto bad_arg; + value = va_arg(ap, OpusDecoder**); + if (!value) + { + goto bad_arg; + } + for (s=0;slayout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + } + *value = (OpusDecoder*)ptr; + } + break; + case OPUS_SET_GAIN_REQUEST: + case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + { + int s; + /* This works for int32 params */ + opus_int32 value = va_arg(ap, opus_int32); + for (s=0;slayout.nb_streams;s++) + { + OpusDecoder *dec; + + dec = (OpusDecoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + ret = opus_decoder_ctl(dec, request, value); + if (ret != OPUS_OK) + break; + } + } + break; + default: + ret = OPUS_UNIMPLEMENTED; + break; + } + return ret; +bad_arg: + return OPUS_BAD_ARG; +} + +int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) +{ + int ret; + va_list ap; + va_start(ap, request); + ret = opus_multistream_decoder_ctl_va_list(st, request, ap); + va_end(ap); + return ret; +} + +void opus_multistream_decoder_destroy(OpusMSDecoder *st) +{ + opus_free(st); +} diff --git a/external/opus-1.3.1/src/opus_multistream_encoder.c b/external/opus-1.3.1/src/opus_multistream_encoder.c new file mode 100644 index 00000000..93204a14 --- /dev/null +++ b/external/opus-1.3.1/src/opus_multistream_encoder.c @@ -0,0 +1,1328 @@ +/* Copyright (c) 2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "opus_multistream.h" +#include "opus.h" +#include "opus_private.h" +#include "stack_alloc.h" +#include +#include "float_cast.h" +#include "os_support.h" +#include "mathops.h" +#include "mdct.h" +#include "modes.h" +#include "bands.h" +#include "quant_bands.h" +#include "pitch.h" + +typedef struct { + int nb_streams; + int nb_coupled_streams; + unsigned char mapping[8]; +} VorbisLayout; + +/* Index is nb_channel-1*/ +static const VorbisLayout vorbis_mappings[8] = { + {1, 0, {0}}, /* 1: mono */ + {1, 1, {0, 1}}, /* 2: stereo */ + {2, 1, {0, 2, 1}}, /* 3: 1-d surround */ + {2, 2, {0, 1, 2, 3}}, /* 4: quadraphonic surround */ + {3, 2, {0, 4, 1, 2, 3}}, /* 5: 5-channel surround */ + {4, 2, {0, 4, 1, 2, 3, 5}}, /* 6: 5.1 surround */ + {4, 3, {0, 4, 1, 2, 3, 5, 6}}, /* 7: 6.1 surround */ + {5, 3, {0, 6, 1, 2, 3, 4, 5, 7}}, /* 8: 7.1 surround */ +}; + +static opus_val32 *ms_get_preemph_mem(OpusMSEncoder *st) +{ + int s; + char *ptr; + int coupled_size, mono_size; + + coupled_size = opus_encoder_get_size(2); + mono_size = opus_encoder_get_size(1); + ptr = (char*)st + align(sizeof(OpusMSEncoder)); + for (s=0;slayout.nb_streams;s++) + { + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + } + /* void* cast avoids clang -Wcast-align warning */ + return (opus_val32*)(void*)(ptr+st->layout.nb_channels*120*sizeof(opus_val32)); +} + +static opus_val32 *ms_get_window_mem(OpusMSEncoder *st) +{ + int s; + char *ptr; + int coupled_size, mono_size; + + coupled_size = opus_encoder_get_size(2); + mono_size = opus_encoder_get_size(1); + ptr = (char*)st + align(sizeof(OpusMSEncoder)); + for (s=0;slayout.nb_streams;s++) + { + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + } + /* void* cast avoids clang -Wcast-align warning */ + return (opus_val32*)(void*)ptr; +} + +static int validate_ambisonics(int nb_channels, int *nb_streams, int *nb_coupled_streams) +{ + int order_plus_one; + int acn_channels; + int nondiegetic_channels; + + if (nb_channels < 1 || nb_channels > 227) + return 0; + + order_plus_one = isqrt32(nb_channels); + acn_channels = order_plus_one * order_plus_one; + nondiegetic_channels = nb_channels - acn_channels; + + if (nondiegetic_channels != 0 && nondiegetic_channels != 2) + return 0; + + if (nb_streams) + *nb_streams = acn_channels + (nondiegetic_channels != 0); + if (nb_coupled_streams) + *nb_coupled_streams = nondiegetic_channels != 0; + return 1; +} + +static int validate_encoder_layout(const ChannelLayout *layout) +{ + int s; + for (s=0;snb_streams;s++) + { + if (s < layout->nb_coupled_streams) + { + if (get_left_channel(layout, s, -1)==-1) + return 0; + if (get_right_channel(layout, s, -1)==-1) + return 0; + } else { + if (get_mono_channel(layout, s, -1)==-1) + return 0; + } + } + return 1; +} + +static void channel_pos(int channels, int pos[8]) +{ + /* Position in the mix: 0 don't mix, 1: left, 2: center, 3:right */ + if (channels==4) + { + pos[0]=1; + pos[1]=3; + pos[2]=1; + pos[3]=3; + } else if (channels==3||channels==5||channels==6) + { + pos[0]=1; + pos[1]=2; + pos[2]=3; + pos[3]=1; + pos[4]=3; + pos[5]=0; + } else if (channels==7) + { + pos[0]=1; + pos[1]=2; + pos[2]=3; + pos[3]=1; + pos[4]=3; + pos[5]=2; + pos[6]=0; + } else if (channels==8) + { + pos[0]=1; + pos[1]=2; + pos[2]=3; + pos[3]=1; + pos[4]=3; + pos[5]=1; + pos[6]=3; + pos[7]=0; + } +} + +#if 1 +/* Computes a rough approximation of log2(2^a + 2^b) */ +static opus_val16 logSum(opus_val16 a, opus_val16 b) +{ + opus_val16 max; + opus_val32 diff; + opus_val16 frac; + static const opus_val16 diff_table[17] = { + QCONST16(0.5000000f, DB_SHIFT), QCONST16(0.2924813f, DB_SHIFT), QCONST16(0.1609640f, DB_SHIFT), QCONST16(0.0849625f, DB_SHIFT), + QCONST16(0.0437314f, DB_SHIFT), QCONST16(0.0221971f, DB_SHIFT), QCONST16(0.0111839f, DB_SHIFT), QCONST16(0.0056136f, DB_SHIFT), + QCONST16(0.0028123f, DB_SHIFT) + }; + int low; + if (a>b) + { + max = a; + diff = SUB32(EXTEND32(a),EXTEND32(b)); + } else { + max = b; + diff = SUB32(EXTEND32(b),EXTEND32(a)); + } + if (!(diff < QCONST16(8.f, DB_SHIFT))) /* inverted to catch NaNs */ + return max; +#ifdef FIXED_POINT + low = SHR32(diff, DB_SHIFT-1); + frac = SHL16(diff - SHL16(low, DB_SHIFT-1), 16-DB_SHIFT); +#else + low = (int)floor(2*diff); + frac = 2*diff - low; +#endif + return max + diff_table[low] + MULT16_16_Q15(frac, SUB16(diff_table[low+1], diff_table[low])); +} +#else +opus_val16 logSum(opus_val16 a, opus_val16 b) +{ + return log2(pow(4, a)+ pow(4, b))/2; +} +#endif + +void surround_analysis(const CELTMode *celt_mode, const void *pcm, opus_val16 *bandLogE, opus_val32 *mem, opus_val32 *preemph_mem, + int len, int overlap, int channels, int rate, opus_copy_channel_in_func copy_channel_in, int arch +) +{ + int c; + int i; + int LM; + int pos[8] = {0}; + int upsample; + int frame_size; + int freq_size; + opus_val16 channel_offset; + opus_val32 bandE[21]; + opus_val16 maskLogE[3][21]; + VARDECL(opus_val32, in); + VARDECL(opus_val16, x); + VARDECL(opus_val32, freq); + SAVE_STACK; + + upsample = resampling_factor(rate); + frame_size = len*upsample; + freq_size = IMIN(960, frame_size); + + /* LM = log2(frame_size / 120) */ + for (LM=0;LMmaxLM;LM++) + if (celt_mode->shortMdctSize<preemph, preemph_mem+c, 0); +#ifndef FIXED_POINT + { + opus_val32 sum; + sum = celt_inner_prod(in, in, frame_size+overlap, 0); + /* This should filter out both NaNs and ridiculous signals that could + cause NaNs further down. */ + if (!(sum < 1e18f) || celt_isnan(sum)) + { + OPUS_CLEAR(in, frame_size+overlap); + preemph_mem[c] = 0; + } + } +#endif + OPUS_CLEAR(bandE, 21); + for (frame=0;framemdct, in+960*frame, freq, celt_mode->window, + overlap, celt_mode->maxLM-LM, 1, arch); + if (upsample != 1) + { + int bound = freq_size/upsample; + for (i=0;i=0;i--) + bandLogE[21*c+i] = MAX16(bandLogE[21*c+i], bandLogE[21*c+i+1]-QCONST16(2.f, DB_SHIFT)); + if (pos[c]==1) + { + for (i=0;i<21;i++) + maskLogE[0][i] = logSum(maskLogE[0][i], bandLogE[21*c+i]); + } else if (pos[c]==3) + { + for (i=0;i<21;i++) + maskLogE[2][i] = logSum(maskLogE[2][i], bandLogE[21*c+i]); + } else if (pos[c]==2) + { + for (i=0;i<21;i++) + { + maskLogE[0][i] = logSum(maskLogE[0][i], bandLogE[21*c+i]-QCONST16(.5f, DB_SHIFT)); + maskLogE[2][i] = logSum(maskLogE[2][i], bandLogE[21*c+i]-QCONST16(.5f, DB_SHIFT)); + } + } +#if 0 + for (i=0;i<21;i++) + printf("%f ", bandLogE[21*c+i]); + float sum=0; + for (i=0;i<21;i++) + sum += bandLogE[21*c+i]; + printf("%f ", sum/21); +#endif + OPUS_COPY(mem+c*overlap, in+frame_size, overlap); + } + for (i=0;i<21;i++) + maskLogE[1][i] = MIN32(maskLogE[0][i],maskLogE[2][i]); + channel_offset = HALF16(celt_log2(QCONST32(2.f,14)/(channels-1))); + for (c=0;c<3;c++) + for (i=0;i<21;i++) + maskLogE[c][i] += channel_offset; +#if 0 + for (c=0;c<3;c++) + { + for (i=0;i<21;i++) + printf("%f ", maskLogE[c][i]); + } +#endif + for (c=0;cnb_streams||nb_coupled_streams<0)return 0; + coupled_size = opus_encoder_get_size(2); + mono_size = opus_encoder_get_size(1); + return align(sizeof(OpusMSEncoder)) + + nb_coupled_streams * align(coupled_size) + + (nb_streams-nb_coupled_streams) * align(mono_size); +} + +opus_int32 opus_multistream_surround_encoder_get_size(int channels, int mapping_family) +{ + int nb_streams; + int nb_coupled_streams; + opus_int32 size; + + if (mapping_family==0) + { + if (channels==1) + { + nb_streams=1; + nb_coupled_streams=0; + } else if (channels==2) + { + nb_streams=1; + nb_coupled_streams=1; + } else + return 0; + } else if (mapping_family==1 && channels<=8 && channels>=1) + { + nb_streams=vorbis_mappings[channels-1].nb_streams; + nb_coupled_streams=vorbis_mappings[channels-1].nb_coupled_streams; + } else if (mapping_family==255) + { + nb_streams=channels; + nb_coupled_streams=0; + } else if (mapping_family==2) + { + if (!validate_ambisonics(channels, &nb_streams, &nb_coupled_streams)) + return 0; + } else + return 0; + size = opus_multistream_encoder_get_size(nb_streams, nb_coupled_streams); + if (channels>2) + { + size += channels*(120*sizeof(opus_val32) + sizeof(opus_val32)); + } + return size; +} + +static int opus_multistream_encoder_init_impl( + OpusMSEncoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping, + int application, + MappingType mapping_type +) +{ + int coupled_size; + int mono_size; + int i, ret; + char *ptr; + + if ((channels>255) || (channels<1) || (coupled_streams>streams) || + (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) + return OPUS_BAD_ARG; + + st->arch = opus_select_arch(); + st->layout.nb_channels = channels; + st->layout.nb_streams = streams; + st->layout.nb_coupled_streams = coupled_streams; + if (mapping_type != MAPPING_TYPE_SURROUND) + st->lfe_stream = -1; + st->bitrate_bps = OPUS_AUTO; + st->application = application; + st->variable_duration = OPUS_FRAMESIZE_ARG; + for (i=0;ilayout.nb_channels;i++) + st->layout.mapping[i] = mapping[i]; + if (!validate_layout(&st->layout)) + return OPUS_BAD_ARG; + if (mapping_type == MAPPING_TYPE_SURROUND && + !validate_encoder_layout(&st->layout)) + return OPUS_BAD_ARG; + if (mapping_type == MAPPING_TYPE_AMBISONICS && + !validate_ambisonics(st->layout.nb_channels, NULL, NULL)) + return OPUS_BAD_ARG; + ptr = (char*)st + align(sizeof(OpusMSEncoder)); + coupled_size = opus_encoder_get_size(2); + mono_size = opus_encoder_get_size(1); + + for (i=0;ilayout.nb_coupled_streams;i++) + { + ret = opus_encoder_init((OpusEncoder*)ptr, Fs, 2, application); + if(ret!=OPUS_OK)return ret; + if (i==st->lfe_stream) + opus_encoder_ctl((OpusEncoder*)ptr, OPUS_SET_LFE(1)); + ptr += align(coupled_size); + } + for (;ilayout.nb_streams;i++) + { + ret = opus_encoder_init((OpusEncoder*)ptr, Fs, 1, application); + if (i==st->lfe_stream) + opus_encoder_ctl((OpusEncoder*)ptr, OPUS_SET_LFE(1)); + if(ret!=OPUS_OK)return ret; + ptr += align(mono_size); + } + if (mapping_type == MAPPING_TYPE_SURROUND) + { + OPUS_CLEAR(ms_get_preemph_mem(st), channels); + OPUS_CLEAR(ms_get_window_mem(st), channels*120); + } + st->mapping_type = mapping_type; + return OPUS_OK; +} + +int opus_multistream_encoder_init( + OpusMSEncoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping, + int application +) +{ + return opus_multistream_encoder_init_impl(st, Fs, channels, streams, + coupled_streams, mapping, + application, MAPPING_TYPE_NONE); +} + +int opus_multistream_surround_encoder_init( + OpusMSEncoder *st, + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + unsigned char *mapping, + int application +) +{ + MappingType mapping_type; + + if ((channels>255) || (channels<1)) + return OPUS_BAD_ARG; + st->lfe_stream = -1; + if (mapping_family==0) + { + if (channels==1) + { + *streams=1; + *coupled_streams=0; + mapping[0]=0; + } else if (channels==2) + { + *streams=1; + *coupled_streams=1; + mapping[0]=0; + mapping[1]=1; + } else + return OPUS_UNIMPLEMENTED; + } else if (mapping_family==1 && channels<=8 && channels>=1) + { + int i; + *streams=vorbis_mappings[channels-1].nb_streams; + *coupled_streams=vorbis_mappings[channels-1].nb_coupled_streams; + for (i=0;i=6) + st->lfe_stream = *streams-1; + } else if (mapping_family==255) + { + int i; + *streams=channels; + *coupled_streams=0; + for(i=0;i2 && mapping_family==1) { + mapping_type = MAPPING_TYPE_SURROUND; + } else if (mapping_family==2) + { + mapping_type = MAPPING_TYPE_AMBISONICS; + } else + { + mapping_type = MAPPING_TYPE_NONE; + } + return opus_multistream_encoder_init_impl(st, Fs, channels, *streams, + *coupled_streams, mapping, + application, mapping_type); +} + +OpusMSEncoder *opus_multistream_encoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + const unsigned char *mapping, + int application, + int *error +) +{ + int ret; + OpusMSEncoder *st; + if ((channels>255) || (channels<1) || (coupled_streams>streams) || + (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) + { + if (error) + *error = OPUS_BAD_ARG; + return NULL; + } + st = (OpusMSEncoder *)opus_alloc(opus_multistream_encoder_get_size(streams, coupled_streams)); + if (st==NULL) + { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + ret = opus_multistream_encoder_init(st, Fs, channels, streams, coupled_streams, mapping, application); + if (ret != OPUS_OK) + { + opus_free(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} + +OpusMSEncoder *opus_multistream_surround_encoder_create( + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + unsigned char *mapping, + int application, + int *error +) +{ + int ret; + opus_int32 size; + OpusMSEncoder *st; + if ((channels>255) || (channels<1)) + { + if (error) + *error = OPUS_BAD_ARG; + return NULL; + } + size = opus_multistream_surround_encoder_get_size(channels, mapping_family); + if (!size) + { + if (error) + *error = OPUS_UNIMPLEMENTED; + return NULL; + } + st = (OpusMSEncoder *)opus_alloc(size); + if (st==NULL) + { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + ret = opus_multistream_surround_encoder_init(st, Fs, channels, mapping_family, streams, coupled_streams, mapping, application); + if (ret != OPUS_OK) + { + opus_free(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} + +static void surround_rate_allocation( + OpusMSEncoder *st, + opus_int32 *rate, + int frame_size, + opus_int32 Fs + ) +{ + int i; + opus_int32 channel_rate; + int stream_offset; + int lfe_offset; + int coupled_ratio; /* Q8 */ + int lfe_ratio; /* Q8 */ + int nb_lfe; + int nb_uncoupled; + int nb_coupled; + int nb_normal; + opus_int32 channel_offset; + opus_int32 bitrate; + int total; + + nb_lfe = (st->lfe_stream!=-1); + nb_coupled = st->layout.nb_coupled_streams; + nb_uncoupled = st->layout.nb_streams-nb_coupled-nb_lfe; + nb_normal = 2*nb_coupled + nb_uncoupled; + + /* Give each non-LFE channel enough bits per channel for coding band energy. */ + channel_offset = 40*IMAX(50, Fs/frame_size); + + if (st->bitrate_bps==OPUS_AUTO) + { + bitrate = nb_normal*(channel_offset + Fs + 10000) + 8000*nb_lfe; + } else if (st->bitrate_bps==OPUS_BITRATE_MAX) + { + bitrate = nb_normal*300000 + nb_lfe*128000; + } else { + bitrate = st->bitrate_bps; + } + + /* Give LFE some basic stream_channel allocation but never exceed 1/20 of the + total rate for the non-energy part to avoid problems at really low rate. */ + lfe_offset = IMIN(bitrate/20, 3000) + 15*IMAX(50, Fs/frame_size); + + /* We give each stream (coupled or uncoupled) a starting bitrate. + This models the main saving of coupled channels over uncoupled. */ + stream_offset = (bitrate - channel_offset*nb_normal - lfe_offset*nb_lfe)/nb_normal/2; + stream_offset = IMAX(0, IMIN(20000, stream_offset)); + + /* Coupled streams get twice the mono rate after the offset is allocated. */ + coupled_ratio = 512; + /* Should depend on the bitrate, for now we assume LFE gets 1/8 the bits of mono */ + lfe_ratio = 32; + + total = (nb_uncoupled<<8) /* mono */ + + coupled_ratio*nb_coupled /* stereo */ + + nb_lfe*lfe_ratio; + channel_rate = 256*(opus_int64)(bitrate - lfe_offset*nb_lfe - stream_offset*(nb_coupled+nb_uncoupled) - channel_offset*nb_normal)/total; + + for (i=0;ilayout.nb_streams;i++) + { + if (ilayout.nb_coupled_streams) + rate[i] = 2*channel_offset + IMAX(0, stream_offset+(channel_rate*coupled_ratio>>8)); + else if (i!=st->lfe_stream) + rate[i] = channel_offset + IMAX(0, stream_offset + channel_rate); + else + rate[i] = IMAX(0, lfe_offset+(channel_rate*lfe_ratio>>8)); + } +} + +static void ambisonics_rate_allocation( + OpusMSEncoder *st, + opus_int32 *rate, + int frame_size, + opus_int32 Fs + ) +{ + int i; + opus_int32 total_rate; + opus_int32 per_stream_rate; + + const int nb_channels = st->layout.nb_streams + st->layout.nb_coupled_streams; + + if (st->bitrate_bps==OPUS_AUTO) + { + total_rate = (st->layout.nb_coupled_streams + st->layout.nb_streams) * + (Fs+60*Fs/frame_size) + st->layout.nb_streams * (opus_int32)15000; + } else if (st->bitrate_bps==OPUS_BITRATE_MAX) + { + total_rate = nb_channels * 320000; + } else + { + total_rate = st->bitrate_bps; + } + + /* Allocate equal number of bits to Ambisonic (uncoupled) and non-diegetic + * (coupled) streams */ + per_stream_rate = total_rate / st->layout.nb_streams; + for (i = 0; i < st->layout.nb_streams; i++) + { + rate[i] = per_stream_rate; + } +} + +static opus_int32 rate_allocation( + OpusMSEncoder *st, + opus_int32 *rate, + int frame_size + ) +{ + int i; + opus_int32 rate_sum=0; + opus_int32 Fs; + char *ptr; + + ptr = (char*)st + align(sizeof(OpusMSEncoder)); + opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_SAMPLE_RATE(&Fs)); + + if (st->mapping_type == MAPPING_TYPE_AMBISONICS) { + ambisonics_rate_allocation(st, rate, frame_size, Fs); + } else + { + surround_rate_allocation(st, rate, frame_size, Fs); + } + + for (i=0;ilayout.nb_streams;i++) + { + rate[i] = IMAX(rate[i], 500); + rate_sum += rate[i]; + } + return rate_sum; +} + +/* Max size in case the encoder decides to return six frames (6 x 20 ms = 120 ms) */ +#define MS_FRAME_TMP (6*1275+12) +int opus_multistream_encode_native +( + OpusMSEncoder *st, + opus_copy_channel_in_func copy_channel_in, + const void *pcm, + int analysis_frame_size, + unsigned char *data, + opus_int32 max_data_bytes, + int lsb_depth, + downmix_func downmix, + int float_api, + void *user_data +) +{ + opus_int32 Fs; + int coupled_size; + int mono_size; + int s; + char *ptr; + int tot_size; + VARDECL(opus_val16, buf); + VARDECL(opus_val16, bandSMR); + unsigned char tmp_data[MS_FRAME_TMP]; + OpusRepacketizer rp; + opus_int32 vbr; + const CELTMode *celt_mode; + opus_int32 bitrates[256]; + opus_val16 bandLogE[42]; + opus_val32 *mem = NULL; + opus_val32 *preemph_mem=NULL; + int frame_size; + opus_int32 rate_sum; + opus_int32 smallest_packet; + ALLOC_STACK; + + if (st->mapping_type == MAPPING_TYPE_SURROUND) + { + preemph_mem = ms_get_preemph_mem(st); + mem = ms_get_window_mem(st); + } + + ptr = (char*)st + align(sizeof(OpusMSEncoder)); + opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_SAMPLE_RATE(&Fs)); + opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_VBR(&vbr)); + opus_encoder_ctl((OpusEncoder*)ptr, CELT_GET_MODE(&celt_mode)); + + frame_size = frame_size_select(analysis_frame_size, st->variable_duration, Fs); + if (frame_size <= 0) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + + /* Smallest packet the encoder can produce. */ + smallest_packet = st->layout.nb_streams*2-1; + /* 100 ms needs an extra byte per stream for the ToC. */ + if (Fs/frame_size == 10) + smallest_packet += st->layout.nb_streams; + if (max_data_bytes < smallest_packet) + { + RESTORE_STACK; + return OPUS_BUFFER_TOO_SMALL; + } + ALLOC(buf, 2*frame_size, opus_val16); + coupled_size = opus_encoder_get_size(2); + mono_size = opus_encoder_get_size(1); + + ALLOC(bandSMR, 21*st->layout.nb_channels, opus_val16); + if (st->mapping_type == MAPPING_TYPE_SURROUND) + { + surround_analysis(celt_mode, pcm, bandSMR, mem, preemph_mem, frame_size, 120, st->layout.nb_channels, Fs, copy_channel_in, st->arch); + } + + /* Compute bitrate allocation between streams (this could be a lot better) */ + rate_sum = rate_allocation(st, bitrates, frame_size); + + if (!vbr) + { + if (st->bitrate_bps == OPUS_AUTO) + { + max_data_bytes = IMIN(max_data_bytes, 3*rate_sum/(3*8*Fs/frame_size)); + } else if (st->bitrate_bps != OPUS_BITRATE_MAX) + { + max_data_bytes = IMIN(max_data_bytes, IMAX(smallest_packet, + 3*st->bitrate_bps/(3*8*Fs/frame_size))); + } + } + ptr = (char*)st + align(sizeof(OpusMSEncoder)); + for (s=0;slayout.nb_streams;s++) + { + OpusEncoder *enc; + enc = (OpusEncoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrates[s])); + if (st->mapping_type == MAPPING_TYPE_SURROUND) + { + opus_int32 equiv_rate; + equiv_rate = st->bitrate_bps; + if (frame_size*50 < Fs) + equiv_rate -= 60*(Fs/frame_size - 50)*st->layout.nb_channels; + if (equiv_rate > 10000*st->layout.nb_channels) + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + else if (equiv_rate > 7000*st->layout.nb_channels) + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_SUPERWIDEBAND)); + else if (equiv_rate > 5000*st->layout.nb_channels) + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_WIDEBAND)); + else + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + if (s < st->layout.nb_coupled_streams) + { + /* To preserve the spatial image, force stereo CELT on coupled streams */ + opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_CELT_ONLY)); + opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(2)); + } + } + else if (st->mapping_type == MAPPING_TYPE_AMBISONICS) { + opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_CELT_ONLY)); + } + } + + ptr = (char*)st + align(sizeof(OpusMSEncoder)); + /* Counting ToC */ + tot_size = 0; + for (s=0;slayout.nb_streams;s++) + { + OpusEncoder *enc; + int len; + int curr_max; + int c1, c2; + int ret; + + opus_repacketizer_init(&rp); + enc = (OpusEncoder*)ptr; + if (s < st->layout.nb_coupled_streams) + { + int i; + int left, right; + left = get_left_channel(&st->layout, s, -1); + right = get_right_channel(&st->layout, s, -1); + (*copy_channel_in)(buf, 2, + pcm, st->layout.nb_channels, left, frame_size, user_data); + (*copy_channel_in)(buf+1, 2, + pcm, st->layout.nb_channels, right, frame_size, user_data); + ptr += align(coupled_size); + if (st->mapping_type == MAPPING_TYPE_SURROUND) + { + for (i=0;i<21;i++) + { + bandLogE[i] = bandSMR[21*left+i]; + bandLogE[21+i] = bandSMR[21*right+i]; + } + } + c1 = left; + c2 = right; + } else { + int i; + int chan = get_mono_channel(&st->layout, s, -1); + (*copy_channel_in)(buf, 1, + pcm, st->layout.nb_channels, chan, frame_size, user_data); + ptr += align(mono_size); + if (st->mapping_type == MAPPING_TYPE_SURROUND) + { + for (i=0;i<21;i++) + bandLogE[i] = bandSMR[21*chan+i]; + } + c1 = chan; + c2 = -1; + } + if (st->mapping_type == MAPPING_TYPE_SURROUND) + opus_encoder_ctl(enc, OPUS_SET_ENERGY_MASK(bandLogE)); + /* number of bytes left (+Toc) */ + curr_max = max_data_bytes - tot_size; + /* Reserve one byte for the last stream and two for the others */ + curr_max -= IMAX(0,2*(st->layout.nb_streams-s-1)-1); + /* For 100 ms, reserve an extra byte per stream for the ToC */ + if (Fs/frame_size == 10) + curr_max -= st->layout.nb_streams-s-1; + curr_max = IMIN(curr_max,MS_FRAME_TMP); + /* Repacketizer will add one or two bytes for self-delimited frames */ + if (s != st->layout.nb_streams-1) curr_max -= curr_max>253 ? 2 : 1; + if (!vbr && s == st->layout.nb_streams-1) + opus_encoder_ctl(enc, OPUS_SET_BITRATE(curr_max*(8*Fs/frame_size))); + len = opus_encode_native(enc, buf, frame_size, tmp_data, curr_max, lsb_depth, + pcm, analysis_frame_size, c1, c2, st->layout.nb_channels, downmix, float_api); + if (len<0) + { + RESTORE_STACK; + return len; + } + /* We need to use the repacketizer to add the self-delimiting lengths + while taking into account the fact that the encoder can now return + more than one frame at a time (e.g. 60 ms CELT-only) */ + ret = opus_repacketizer_cat(&rp, tmp_data, len); + /* If the opus_repacketizer_cat() fails, then something's seriously wrong + with the encoder. */ + if (ret != OPUS_OK) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + len = opus_repacketizer_out_range_impl(&rp, 0, opus_repacketizer_get_nb_frames(&rp), + data, max_data_bytes-tot_size, s != st->layout.nb_streams-1, !vbr && s == st->layout.nb_streams-1); + data += len; + tot_size += len; + } + /*printf("\n");*/ + RESTORE_STACK; + return tot_size; +} + +#if !defined(DISABLE_FLOAT_API) +static void opus_copy_channel_in_float( + opus_val16 *dst, + int dst_stride, + const void *src, + int src_stride, + int src_channel, + int frame_size, + void *user_data +) +{ + const float *float_src; + opus_int32 i; + (void)user_data; + float_src = (const float *)src; + for (i=0;ilayout.nb_channels, IMAX(500*st->layout.nb_channels, value)); + } + st->bitrate_bps = value; + } + break; + case OPUS_GET_BITRATE_REQUEST: + { + int s; + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = 0; + for (s=0;slayout.nb_streams;s++) + { + opus_int32 rate; + OpusEncoder *enc; + enc = (OpusEncoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + opus_encoder_ctl(enc, request, &rate); + *value += rate; + } + } + break; + case OPUS_GET_LSB_DEPTH_REQUEST: + case OPUS_GET_VBR_REQUEST: + case OPUS_GET_APPLICATION_REQUEST: + case OPUS_GET_BANDWIDTH_REQUEST: + case OPUS_GET_COMPLEXITY_REQUEST: + case OPUS_GET_PACKET_LOSS_PERC_REQUEST: + case OPUS_GET_DTX_REQUEST: + case OPUS_GET_VOICE_RATIO_REQUEST: + case OPUS_GET_VBR_CONSTRAINT_REQUEST: + case OPUS_GET_SIGNAL_REQUEST: + case OPUS_GET_LOOKAHEAD_REQUEST: + case OPUS_GET_SAMPLE_RATE_REQUEST: + case OPUS_GET_INBAND_FEC_REQUEST: + case OPUS_GET_FORCE_CHANNELS_REQUEST: + case OPUS_GET_PREDICTION_DISABLED_REQUEST: + case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: + { + OpusEncoder *enc; + /* For int32* GET params, just query the first stream */ + opus_int32 *value = va_arg(ap, opus_int32*); + enc = (OpusEncoder*)ptr; + ret = opus_encoder_ctl(enc, request, value); + } + break; + case OPUS_GET_FINAL_RANGE_REQUEST: + { + int s; + opus_uint32 *value = va_arg(ap, opus_uint32*); + opus_uint32 tmp; + if (!value) + { + goto bad_arg; + } + *value=0; + for (s=0;slayout.nb_streams;s++) + { + OpusEncoder *enc; + enc = (OpusEncoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + ret = opus_encoder_ctl(enc, request, &tmp); + if (ret != OPUS_OK) break; + *value ^= tmp; + } + } + break; + case OPUS_SET_LSB_DEPTH_REQUEST: + case OPUS_SET_COMPLEXITY_REQUEST: + case OPUS_SET_VBR_REQUEST: + case OPUS_SET_VBR_CONSTRAINT_REQUEST: + case OPUS_SET_MAX_BANDWIDTH_REQUEST: + case OPUS_SET_BANDWIDTH_REQUEST: + case OPUS_SET_SIGNAL_REQUEST: + case OPUS_SET_APPLICATION_REQUEST: + case OPUS_SET_INBAND_FEC_REQUEST: + case OPUS_SET_PACKET_LOSS_PERC_REQUEST: + case OPUS_SET_DTX_REQUEST: + case OPUS_SET_FORCE_MODE_REQUEST: + case OPUS_SET_FORCE_CHANNELS_REQUEST: + case OPUS_SET_PREDICTION_DISABLED_REQUEST: + case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + { + int s; + /* This works for int32 params */ + opus_int32 value = va_arg(ap, opus_int32); + for (s=0;slayout.nb_streams;s++) + { + OpusEncoder *enc; + + enc = (OpusEncoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + ret = opus_encoder_ctl(enc, request, value); + if (ret != OPUS_OK) + break; + } + } + break; + case OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST: + { + int s; + opus_int32 stream_id; + OpusEncoder **value; + stream_id = va_arg(ap, opus_int32); + if (stream_id<0 || stream_id >= st->layout.nb_streams) + goto bad_arg; + value = va_arg(ap, OpusEncoder**); + if (!value) + { + goto bad_arg; + } + for (s=0;slayout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + } + *value = (OpusEncoder*)ptr; + } + break; + case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST: + { + opus_int32 value = va_arg(ap, opus_int32); + st->variable_duration = value; + } + break; + case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = st->variable_duration; + } + break; + case OPUS_RESET_STATE: + { + int s; + if (st->mapping_type == MAPPING_TYPE_SURROUND) + { + OPUS_CLEAR(ms_get_preemph_mem(st), st->layout.nb_channels); + OPUS_CLEAR(ms_get_window_mem(st), st->layout.nb_channels*120); + } + for (s=0;slayout.nb_streams;s++) + { + OpusEncoder *enc; + enc = (OpusEncoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + ret = opus_encoder_ctl(enc, OPUS_RESET_STATE); + if (ret != OPUS_OK) + break; + } + } + break; + default: + ret = OPUS_UNIMPLEMENTED; + break; + } + return ret; +bad_arg: + return OPUS_BAD_ARG; +} + +int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) +{ + int ret; + va_list ap; + va_start(ap, request); + ret = opus_multistream_encoder_ctl_va_list(st, request, ap); + va_end(ap); + return ret; +} + +void opus_multistream_encoder_destroy(OpusMSEncoder *st) +{ + opus_free(st); +} diff --git a/external/opus-1.3.1/src/opus_private.h b/external/opus-1.3.1/src/opus_private.h new file mode 100644 index 00000000..5e2463f5 --- /dev/null +++ b/external/opus-1.3.1/src/opus_private.h @@ -0,0 +1,201 @@ +/* Copyright (c) 2012 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifndef OPUS_PRIVATE_H +#define OPUS_PRIVATE_H + +#include "arch.h" +#include "opus.h" +#include "celt.h" + +#include /* va_list */ +#include /* offsetof */ + +struct OpusRepacketizer { + unsigned char toc; + int nb_frames; + const unsigned char *frames[48]; + opus_int16 len[48]; + int framesize; +}; + +typedef struct ChannelLayout { + int nb_channels; + int nb_streams; + int nb_coupled_streams; + unsigned char mapping[256]; +} ChannelLayout; + +typedef enum { + MAPPING_TYPE_NONE, + MAPPING_TYPE_SURROUND, + MAPPING_TYPE_AMBISONICS +} MappingType; + +struct OpusMSEncoder { + ChannelLayout layout; + int arch; + int lfe_stream; + int application; + int variable_duration; + MappingType mapping_type; + opus_int32 bitrate_bps; + /* Encoder states go here */ + /* then opus_val32 window_mem[channels*120]; */ + /* then opus_val32 preemph_mem[channels]; */ +}; + +struct OpusMSDecoder { + ChannelLayout layout; + /* Decoder states go here */ +}; + +int opus_multistream_encoder_ctl_va_list(struct OpusMSEncoder *st, int request, + va_list ap); +int opus_multistream_decoder_ctl_va_list(struct OpusMSDecoder *st, int request, + va_list ap); + +int validate_layout(const ChannelLayout *layout); +int get_left_channel(const ChannelLayout *layout, int stream_id, int prev); +int get_right_channel(const ChannelLayout *layout, int stream_id, int prev); +int get_mono_channel(const ChannelLayout *layout, int stream_id, int prev); + +typedef void (*opus_copy_channel_in_func)( + opus_val16 *dst, + int dst_stride, + const void *src, + int src_stride, + int src_channel, + int frame_size, + void *user_data +); + +typedef void (*opus_copy_channel_out_func)( + void *dst, + int dst_stride, + int dst_channel, + const opus_val16 *src, + int src_stride, + int frame_size, + void *user_data +); + +#define MODE_SILK_ONLY 1000 +#define MODE_HYBRID 1001 +#define MODE_CELT_ONLY 1002 + +#define OPUS_SET_VOICE_RATIO_REQUEST 11018 +#define OPUS_GET_VOICE_RATIO_REQUEST 11019 + +/** Configures the encoder's expected percentage of voice + * opposed to music or other signals. + * + * @note This interface is currently more aspiration than actuality. It's + * ultimately expected to bias an automatic signal classifier, but it currently + * just shifts the static bitrate to mode mapping around a little bit. + * + * @param[in] x int: Voice percentage in the range 0-100, inclusive. + * @hideinitializer */ +#define OPUS_SET_VOICE_RATIO(x) OPUS_SET_VOICE_RATIO_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured voice ratio value, @see OPUS_SET_VOICE_RATIO + * + * @param[out] x int*: Voice percentage in the range 0-100, inclusive. + * @hideinitializer */ +#define OPUS_GET_VOICE_RATIO(x) OPUS_GET_VOICE_RATIO_REQUEST, __opus_check_int_ptr(x) + + +#define OPUS_SET_FORCE_MODE_REQUEST 11002 +#define OPUS_SET_FORCE_MODE(x) OPUS_SET_FORCE_MODE_REQUEST, __opus_check_int(x) + +typedef void (*downmix_func)(const void *, opus_val32 *, int, int, int, int, int); +void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); +void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); +int is_digital_silence(const opus_val16* pcm, int frame_size, int channels, int lsb_depth); + +int encode_size(int size, unsigned char *data); + +opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_int32 Fs); + +opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_size, + unsigned char *data, opus_int32 out_data_bytes, int lsb_depth, + const void *analysis_pcm, opus_int32 analysis_size, int c1, int c2, + int analysis_channels, downmix_func downmix, int float_api); + +int opus_decode_native(OpusDecoder *st, const unsigned char *data, opus_int32 len, + opus_val16 *pcm, int frame_size, int decode_fec, int self_delimited, + opus_int32 *packet_offset, int soft_clip); + +/* Make sure everything is properly aligned. */ +static OPUS_INLINE int align(int i) +{ + struct foo {char c; union { void* p; opus_int32 i; opus_val32 v; } u;}; + + unsigned int alignment = offsetof(struct foo, u); + + /* Optimizing compilers should optimize div and multiply into and + for all sensible alignment values. */ + return ((i + alignment - 1) / alignment) * alignment; +} + +int opus_packet_parse_impl(const unsigned char *data, opus_int32 len, + int self_delimited, unsigned char *out_toc, + const unsigned char *frames[48], opus_int16 size[48], + int *payload_offset, opus_int32 *packet_offset); + +opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int end, + unsigned char *data, opus_int32 maxlen, int self_delimited, int pad); + +int pad_frame(unsigned char *data, opus_int32 len, opus_int32 new_len); + +int opus_multistream_encode_native +( + struct OpusMSEncoder *st, + opus_copy_channel_in_func copy_channel_in, + const void *pcm, + int analysis_frame_size, + unsigned char *data, + opus_int32 max_data_bytes, + int lsb_depth, + downmix_func downmix, + int float_api, + void *user_data +); + +int opus_multistream_decode_native( + struct OpusMSDecoder *st, + const unsigned char *data, + opus_int32 len, + void *pcm, + opus_copy_channel_out_func copy_channel_out, + int frame_size, + int decode_fec, + int soft_clip, + void *user_data +); + +#endif /* OPUS_PRIVATE_H */ diff --git a/external/opus-1.3.1/src/opus_projection_decoder.c b/external/opus-1.3.1/src/opus_projection_decoder.c new file mode 100644 index 00000000..c2e07d5b --- /dev/null +++ b/external/opus-1.3.1/src/opus_projection_decoder.c @@ -0,0 +1,258 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "mathops.h" +#include "os_support.h" +#include "opus_private.h" +#include "opus_defines.h" +#include "opus_projection.h" +#include "opus_multistream.h" +#include "mapping_matrix.h" +#include "stack_alloc.h" + +struct OpusProjectionDecoder +{ + opus_int32 demixing_matrix_size_in_bytes; + /* Encoder states go here */ +}; + +#if !defined(DISABLE_FLOAT_API) +static void opus_projection_copy_channel_out_float( + void *dst, + int dst_stride, + int dst_channel, + const opus_val16 *src, + int src_stride, + int frame_size, + void *user_data) +{ + float *float_dst; + const MappingMatrix *matrix; + float_dst = (float *)dst; + matrix = (const MappingMatrix *)user_data; + + if (dst_channel == 0) + OPUS_CLEAR(float_dst, frame_size * dst_stride); + + if (src != NULL) + mapping_matrix_multiply_channel_out_float(matrix, src, dst_channel, + src_stride, float_dst, dst_stride, frame_size); +} +#endif + +static void opus_projection_copy_channel_out_short( + void *dst, + int dst_stride, + int dst_channel, + const opus_val16 *src, + int src_stride, + int frame_size, + void *user_data) +{ + opus_int16 *short_dst; + const MappingMatrix *matrix; + short_dst = (opus_int16 *)dst; + matrix = (const MappingMatrix *)user_data; + if (dst_channel == 0) + OPUS_CLEAR(short_dst, frame_size * dst_stride); + + if (src != NULL) + mapping_matrix_multiply_channel_out_short(matrix, src, dst_channel, + src_stride, short_dst, dst_stride, frame_size); +} + +static MappingMatrix *get_dec_demixing_matrix(OpusProjectionDecoder *st) +{ + /* void* cast avoids clang -Wcast-align warning */ + return (MappingMatrix*)(void*)((char*)st + + align(sizeof(OpusProjectionDecoder))); +} + +static OpusMSDecoder *get_multistream_decoder(OpusProjectionDecoder *st) +{ + /* void* cast avoids clang -Wcast-align warning */ + return (OpusMSDecoder*)(void*)((char*)st + + align(sizeof(OpusProjectionDecoder) + + st->demixing_matrix_size_in_bytes)); +} + +opus_int32 opus_projection_decoder_get_size(int channels, int streams, + int coupled_streams) +{ + opus_int32 matrix_size; + opus_int32 decoder_size; + + matrix_size = + mapping_matrix_get_size(streams + coupled_streams, channels); + if (!matrix_size) + return 0; + + decoder_size = opus_multistream_decoder_get_size(streams, coupled_streams); + if (!decoder_size) + return 0; + + return align(sizeof(OpusProjectionDecoder)) + matrix_size + decoder_size; +} + +int opus_projection_decoder_init(OpusProjectionDecoder *st, opus_int32 Fs, + int channels, int streams, int coupled_streams, + unsigned char *demixing_matrix, opus_int32 demixing_matrix_size) +{ + int nb_input_streams; + opus_int32 expected_matrix_size; + int i, ret; + unsigned char mapping[255]; + VARDECL(opus_int16, buf); + ALLOC_STACK; + + /* Verify supplied matrix size. */ + nb_input_streams = streams + coupled_streams; + expected_matrix_size = nb_input_streams * channels * sizeof(opus_int16); + if (expected_matrix_size != demixing_matrix_size) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + + /* Convert demixing matrix input into internal format. */ + ALLOC(buf, nb_input_streams * channels, opus_int16); + for (i = 0; i < nb_input_streams * channels; i++) + { + int s = demixing_matrix[2*i + 1] << 8 | demixing_matrix[2*i]; + s = ((s & 0xFFFF) ^ 0x8000) - 0x8000; + buf[i] = (opus_int16)s; + } + + /* Assign demixing matrix. */ + st->demixing_matrix_size_in_bytes = + mapping_matrix_get_size(channels, nb_input_streams); + if (!st->demixing_matrix_size_in_bytes) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + + mapping_matrix_init(get_dec_demixing_matrix(st), channels, nb_input_streams, 0, + buf, demixing_matrix_size); + + /* Set trivial mapping so each input channel pairs with a matrix column. */ + for (i = 0; i < channels; i++) + mapping[i] = i; + + ret = opus_multistream_decoder_init( + get_multistream_decoder(st), Fs, channels, streams, coupled_streams, mapping); + RESTORE_STACK; + return ret; +} + +OpusProjectionDecoder *opus_projection_decoder_create( + opus_int32 Fs, int channels, int streams, int coupled_streams, + unsigned char *demixing_matrix, opus_int32 demixing_matrix_size, int *error) +{ + int size; + int ret; + OpusProjectionDecoder *st; + + /* Allocate space for the projection decoder. */ + size = opus_projection_decoder_get_size(channels, streams, coupled_streams); + if (!size) { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + st = (OpusProjectionDecoder *)opus_alloc(size); + if (!st) + { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + + /* Initialize projection decoder with provided settings. */ + ret = opus_projection_decoder_init(st, Fs, channels, streams, coupled_streams, + demixing_matrix, demixing_matrix_size); + if (ret != OPUS_OK) + { + opus_free(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} + +#ifdef FIXED_POINT +int opus_projection_decode(OpusProjectionDecoder *st, const unsigned char *data, + opus_int32 len, opus_int16 *pcm, int frame_size, + int decode_fec) +{ + return opus_multistream_decode_native(get_multistream_decoder(st), data, len, + pcm, opus_projection_copy_channel_out_short, frame_size, decode_fec, 0, + get_dec_demixing_matrix(st)); +} +#else +int opus_projection_decode(OpusProjectionDecoder *st, const unsigned char *data, + opus_int32 len, opus_int16 *pcm, int frame_size, + int decode_fec) +{ + return opus_multistream_decode_native(get_multistream_decoder(st), data, len, + pcm, opus_projection_copy_channel_out_short, frame_size, decode_fec, 1, + get_dec_demixing_matrix(st)); +} +#endif + +#ifndef DISABLE_FLOAT_API +int opus_projection_decode_float(OpusProjectionDecoder *st, const unsigned char *data, + opus_int32 len, float *pcm, int frame_size, int decode_fec) +{ + return opus_multistream_decode_native(get_multistream_decoder(st), data, len, + pcm, opus_projection_copy_channel_out_float, frame_size, decode_fec, 0, + get_dec_demixing_matrix(st)); +} +#endif + +int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) +{ + va_list ap; + int ret = OPUS_OK; + + va_start(ap, request); + ret = opus_multistream_decoder_ctl_va_list(get_multistream_decoder(st), + request, ap); + va_end(ap); + return ret; +} + +void opus_projection_decoder_destroy(OpusProjectionDecoder *st) +{ + opus_free(st); +} + diff --git a/external/opus-1.3.1/src/opus_projection_encoder.c b/external/opus-1.3.1/src/opus_projection_encoder.c new file mode 100644 index 00000000..06fb2d25 --- /dev/null +++ b/external/opus-1.3.1/src/opus_projection_encoder.c @@ -0,0 +1,468 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "mathops.h" +#include "os_support.h" +#include "opus_private.h" +#include "opus_defines.h" +#include "opus_projection.h" +#include "opus_multistream.h" +#include "stack_alloc.h" +#include "mapping_matrix.h" + +struct OpusProjectionEncoder +{ + opus_int32 mixing_matrix_size_in_bytes; + opus_int32 demixing_matrix_size_in_bytes; + /* Encoder states go here */ +}; + +#if !defined(DISABLE_FLOAT_API) +static void opus_projection_copy_channel_in_float( + opus_val16 *dst, + int dst_stride, + const void *src, + int src_stride, + int src_channel, + int frame_size, + void *user_data +) +{ + mapping_matrix_multiply_channel_in_float((const MappingMatrix*)user_data, + (const float*)src, src_stride, dst, src_channel, dst_stride, frame_size); +} +#endif + +static void opus_projection_copy_channel_in_short( + opus_val16 *dst, + int dst_stride, + const void *src, + int src_stride, + int src_channel, + int frame_size, + void *user_data +) +{ + mapping_matrix_multiply_channel_in_short((const MappingMatrix*)user_data, + (const opus_int16*)src, src_stride, dst, src_channel, dst_stride, frame_size); +} + +static int get_order_plus_one_from_channels(int channels, int *order_plus_one) +{ + int order_plus_one_; + int acn_channels; + int nondiegetic_channels; + + /* Allowed numbers of channels: + * (1 + n)^2 + 2j, for n = 0...14 and j = 0 or 1. + */ + if (channels < 1 || channels > 227) + return OPUS_BAD_ARG; + + order_plus_one_ = isqrt32(channels); + acn_channels = order_plus_one_ * order_plus_one_; + nondiegetic_channels = channels - acn_channels; + if (nondiegetic_channels != 0 && nondiegetic_channels != 2) + return OPUS_BAD_ARG; + + if (order_plus_one) + *order_plus_one = order_plus_one_; + return OPUS_OK; +} + +static int get_streams_from_channels(int channels, int mapping_family, + int *streams, int *coupled_streams, + int *order_plus_one) +{ + if (mapping_family == 3) + { + if (get_order_plus_one_from_channels(channels, order_plus_one) != OPUS_OK) + return OPUS_BAD_ARG; + if (streams) + *streams = (channels + 1) / 2; + if (coupled_streams) + *coupled_streams = channels / 2; + return OPUS_OK; + } + return OPUS_BAD_ARG; +} + +static MappingMatrix *get_mixing_matrix(OpusProjectionEncoder *st) +{ + /* void* cast avoids clang -Wcast-align warning */ + return (MappingMatrix *)(void*)((char*)st + + align(sizeof(OpusProjectionEncoder))); +} + +static MappingMatrix *get_enc_demixing_matrix(OpusProjectionEncoder *st) +{ + /* void* cast avoids clang -Wcast-align warning */ + return (MappingMatrix *)(void*)((char*)st + + align(sizeof(OpusProjectionEncoder) + + st->mixing_matrix_size_in_bytes)); +} + +static OpusMSEncoder *get_multistream_encoder(OpusProjectionEncoder *st) +{ + /* void* cast avoids clang -Wcast-align warning */ + return (OpusMSEncoder *)(void*)((char*)st + + align(sizeof(OpusProjectionEncoder) + + st->mixing_matrix_size_in_bytes + + st->demixing_matrix_size_in_bytes)); +} + +opus_int32 opus_projection_ambisonics_encoder_get_size(int channels, + int mapping_family) +{ + int nb_streams; + int nb_coupled_streams; + int order_plus_one; + int mixing_matrix_rows, mixing_matrix_cols; + int demixing_matrix_rows, demixing_matrix_cols; + opus_int32 mixing_matrix_size, demixing_matrix_size; + opus_int32 encoder_size; + int ret; + + ret = get_streams_from_channels(channels, mapping_family, &nb_streams, + &nb_coupled_streams, &order_plus_one); + if (ret != OPUS_OK) + return 0; + + if (order_plus_one == 2) + { + mixing_matrix_rows = mapping_matrix_foa_mixing.rows; + mixing_matrix_cols = mapping_matrix_foa_mixing.cols; + demixing_matrix_rows = mapping_matrix_foa_demixing.rows; + demixing_matrix_cols = mapping_matrix_foa_demixing.cols; + } + else if (order_plus_one == 3) + { + mixing_matrix_rows = mapping_matrix_soa_mixing.rows; + mixing_matrix_cols = mapping_matrix_soa_mixing.cols; + demixing_matrix_rows = mapping_matrix_soa_demixing.rows; + demixing_matrix_cols = mapping_matrix_soa_demixing.cols; + } + else if (order_plus_one == 4) + { + mixing_matrix_rows = mapping_matrix_toa_mixing.rows; + mixing_matrix_cols = mapping_matrix_toa_mixing.cols; + demixing_matrix_rows = mapping_matrix_toa_demixing.rows; + demixing_matrix_cols = mapping_matrix_toa_demixing.cols; + } + else + return 0; + + mixing_matrix_size = + mapping_matrix_get_size(mixing_matrix_rows, mixing_matrix_cols); + if (!mixing_matrix_size) + return 0; + + demixing_matrix_size = + mapping_matrix_get_size(demixing_matrix_rows, demixing_matrix_cols); + if (!demixing_matrix_size) + return 0; + + encoder_size = + opus_multistream_encoder_get_size(nb_streams, nb_coupled_streams); + if (!encoder_size) + return 0; + + return align(sizeof(OpusProjectionEncoder)) + + mixing_matrix_size + demixing_matrix_size + encoder_size; +} + +int opus_projection_ambisonics_encoder_init(OpusProjectionEncoder *st, opus_int32 Fs, + int channels, int mapping_family, + int *streams, int *coupled_streams, + int application) +{ + MappingMatrix *mixing_matrix; + MappingMatrix *demixing_matrix; + OpusMSEncoder *ms_encoder; + int i; + int ret; + int order_plus_one; + unsigned char mapping[255]; + + if (streams == NULL || coupled_streams == NULL) { + return OPUS_BAD_ARG; + } + + if (get_streams_from_channels(channels, mapping_family, streams, + coupled_streams, &order_plus_one) != OPUS_OK) + return OPUS_BAD_ARG; + + if (mapping_family == 3) + { + /* Assign mixing matrix based on available pre-computed matrices. */ + mixing_matrix = get_mixing_matrix(st); + if (order_plus_one == 2) + { + mapping_matrix_init(mixing_matrix, mapping_matrix_foa_mixing.rows, + mapping_matrix_foa_mixing.cols, mapping_matrix_foa_mixing.gain, + mapping_matrix_foa_mixing_data, + sizeof(mapping_matrix_foa_mixing_data)); + } + else if (order_plus_one == 3) + { + mapping_matrix_init(mixing_matrix, mapping_matrix_soa_mixing.rows, + mapping_matrix_soa_mixing.cols, mapping_matrix_soa_mixing.gain, + mapping_matrix_soa_mixing_data, + sizeof(mapping_matrix_soa_mixing_data)); + } + else if (order_plus_one == 4) + { + mapping_matrix_init(mixing_matrix, mapping_matrix_toa_mixing.rows, + mapping_matrix_toa_mixing.cols, mapping_matrix_toa_mixing.gain, + mapping_matrix_toa_mixing_data, + sizeof(mapping_matrix_toa_mixing_data)); + } + else + return OPUS_BAD_ARG; + + st->mixing_matrix_size_in_bytes = mapping_matrix_get_size( + mixing_matrix->rows, mixing_matrix->cols); + if (!st->mixing_matrix_size_in_bytes) + return OPUS_BAD_ARG; + + /* Assign demixing matrix based on available pre-computed matrices. */ + demixing_matrix = get_enc_demixing_matrix(st); + if (order_plus_one == 2) + { + mapping_matrix_init(demixing_matrix, mapping_matrix_foa_demixing.rows, + mapping_matrix_foa_demixing.cols, mapping_matrix_foa_demixing.gain, + mapping_matrix_foa_demixing_data, + sizeof(mapping_matrix_foa_demixing_data)); + } + else if (order_plus_one == 3) + { + mapping_matrix_init(demixing_matrix, mapping_matrix_soa_demixing.rows, + mapping_matrix_soa_demixing.cols, mapping_matrix_soa_demixing.gain, + mapping_matrix_soa_demixing_data, + sizeof(mapping_matrix_soa_demixing_data)); + } + else if (order_plus_one == 4) + { + mapping_matrix_init(demixing_matrix, mapping_matrix_toa_demixing.rows, + mapping_matrix_toa_demixing.cols, mapping_matrix_toa_demixing.gain, + mapping_matrix_toa_demixing_data, + sizeof(mapping_matrix_toa_demixing_data)); + } + else + return OPUS_BAD_ARG; + + st->demixing_matrix_size_in_bytes = mapping_matrix_get_size( + demixing_matrix->rows, demixing_matrix->cols); + if (!st->demixing_matrix_size_in_bytes) + return OPUS_BAD_ARG; + } + else + return OPUS_UNIMPLEMENTED; + + /* Ensure matrices are large enough for desired coding scheme. */ + if (*streams + *coupled_streams > mixing_matrix->rows || + channels > mixing_matrix->cols || + channels > demixing_matrix->rows || + *streams + *coupled_streams > demixing_matrix->cols) + return OPUS_BAD_ARG; + + /* Set trivial mapping so each input channel pairs with a matrix column. */ + for (i = 0; i < channels; i++) + mapping[i] = i; + + /* Initialize multistream encoder with provided settings. */ + ms_encoder = get_multistream_encoder(st); + ret = opus_multistream_encoder_init(ms_encoder, Fs, channels, *streams, + *coupled_streams, mapping, application); + return ret; +} + +OpusProjectionEncoder *opus_projection_ambisonics_encoder_create( + opus_int32 Fs, int channels, int mapping_family, int *streams, + int *coupled_streams, int application, int *error) +{ + int size; + int ret; + OpusProjectionEncoder *st; + + /* Allocate space for the projection encoder. */ + size = opus_projection_ambisonics_encoder_get_size(channels, mapping_family); + if (!size) { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + st = (OpusProjectionEncoder *)opus_alloc(size); + if (!st) + { + if (error) + *error = OPUS_ALLOC_FAIL; + return NULL; + } + + /* Initialize projection encoder with provided settings. */ + ret = opus_projection_ambisonics_encoder_init(st, Fs, channels, + mapping_family, streams, coupled_streams, application); + if (ret != OPUS_OK) + { + opus_free(st); + st = NULL; + } + if (error) + *error = ret; + return st; +} + +int opus_projection_encode(OpusProjectionEncoder *st, const opus_int16 *pcm, + int frame_size, unsigned char *data, + opus_int32 max_data_bytes) +{ + return opus_multistream_encode_native(get_multistream_encoder(st), + opus_projection_copy_channel_in_short, pcm, frame_size, data, + max_data_bytes, 16, downmix_int, 0, get_mixing_matrix(st)); +} + +#ifndef DISABLE_FLOAT_API +#ifdef FIXED_POINT +int opus_projection_encode_float(OpusProjectionEncoder *st, const float *pcm, + int frame_size, unsigned char *data, + opus_int32 max_data_bytes) +{ + return opus_multistream_encode_native(get_multistream_encoder(st), + opus_projection_copy_channel_in_float, pcm, frame_size, data, + max_data_bytes, 16, downmix_float, 1, get_mixing_matrix(st)); +} +#else +int opus_projection_encode_float(OpusProjectionEncoder *st, const float *pcm, + int frame_size, unsigned char *data, + opus_int32 max_data_bytes) +{ + return opus_multistream_encode_native(get_multistream_encoder(st), + opus_projection_copy_channel_in_float, pcm, frame_size, data, + max_data_bytes, 24, downmix_float, 1, get_mixing_matrix(st)); +} +#endif +#endif + +void opus_projection_encoder_destroy(OpusProjectionEncoder *st) +{ + opus_free(st); +} + +int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) +{ + va_list ap; + MappingMatrix *demixing_matrix; + OpusMSEncoder *ms_encoder; + int ret = OPUS_OK; + + ms_encoder = get_multistream_encoder(st); + demixing_matrix = get_enc_demixing_matrix(st); + + va_start(ap, request); + switch(request) + { + case OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = + ms_encoder->layout.nb_channels * (ms_encoder->layout.nb_streams + + ms_encoder->layout.nb_coupled_streams) * sizeof(opus_int16); + } + break; + case OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST: + { + opus_int32 *value = va_arg(ap, opus_int32*); + if (!value) + { + goto bad_arg; + } + *value = demixing_matrix->gain; + } + break; + case OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST: + { + int i, j, k, l; + int nb_input_streams; + int nb_output_streams; + unsigned char *external_char; + opus_int16 *internal_short; + opus_int32 external_size; + opus_int32 internal_size; + + /* (I/O is in relation to the decoder's perspective). */ + nb_input_streams = ms_encoder->layout.nb_streams + + ms_encoder->layout.nb_coupled_streams; + nb_output_streams = ms_encoder->layout.nb_channels; + + external_char = va_arg(ap, unsigned char *); + external_size = va_arg(ap, opus_int32); + if (!external_char) + { + goto bad_arg; + } + internal_short = mapping_matrix_get_data(demixing_matrix); + internal_size = nb_input_streams * nb_output_streams * sizeof(opus_int16); + if (external_size != internal_size) + { + goto bad_arg; + } + + /* Copy demixing matrix subset to output destination. */ + l = 0; + for (i = 0; i < nb_input_streams; i++) { + for (j = 0; j < nb_output_streams; j++) { + k = demixing_matrix->rows * i + j; + external_char[2*l] = (unsigned char)internal_short[k]; + external_char[2*l+1] = (unsigned char)(internal_short[k] >> 8); + l++; + } + } + } + break; + default: + { + ret = opus_multistream_encoder_ctl_va_list(ms_encoder, request, ap); + } + break; + } + va_end(ap); + return ret; + +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; +} + diff --git a/external/opus-1.3.1/src/repacketizer.c b/external/opus-1.3.1/src/repacketizer.c new file mode 100644 index 00000000..bda44a14 --- /dev/null +++ b/external/opus-1.3.1/src/repacketizer.c @@ -0,0 +1,349 @@ +/* Copyright (c) 2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "opus.h" +#include "opus_private.h" +#include "os_support.h" + + +int opus_repacketizer_get_size(void) +{ + return sizeof(OpusRepacketizer); +} + +OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) +{ + rp->nb_frames = 0; + return rp; +} + +OpusRepacketizer *opus_repacketizer_create(void) +{ + OpusRepacketizer *rp; + rp=(OpusRepacketizer *)opus_alloc(opus_repacketizer_get_size()); + if(rp==NULL)return NULL; + return opus_repacketizer_init(rp); +} + +void opus_repacketizer_destroy(OpusRepacketizer *rp) +{ + opus_free(rp); +} + +static int opus_repacketizer_cat_impl(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len, int self_delimited) +{ + unsigned char tmp_toc; + int curr_nb_frames,ret; + /* Set of check ToC */ + if (len<1) return OPUS_INVALID_PACKET; + if (rp->nb_frames == 0) + { + rp->toc = data[0]; + rp->framesize = opus_packet_get_samples_per_frame(data, 8000); + } else if ((rp->toc&0xFC) != (data[0]&0xFC)) + { + /*fprintf(stderr, "toc mismatch: 0x%x vs 0x%x\n", rp->toc, data[0]);*/ + return OPUS_INVALID_PACKET; + } + curr_nb_frames = opus_packet_get_nb_frames(data, len); + if(curr_nb_frames<1) return OPUS_INVALID_PACKET; + + /* Check the 120 ms maximum packet size */ + if ((curr_nb_frames+rp->nb_frames)*rp->framesize > 960) + { + return OPUS_INVALID_PACKET; + } + + ret=opus_packet_parse_impl(data, len, self_delimited, &tmp_toc, &rp->frames[rp->nb_frames], &rp->len[rp->nb_frames], NULL, NULL); + if(ret<1)return ret; + + rp->nb_frames += curr_nb_frames; + return OPUS_OK; +} + +int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) +{ + return opus_repacketizer_cat_impl(rp, data, len, 0); +} + +int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) +{ + return rp->nb_frames; +} + +opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int end, + unsigned char *data, opus_int32 maxlen, int self_delimited, int pad) +{ + int i, count; + opus_int32 tot_size; + opus_int16 *len; + const unsigned char **frames; + unsigned char * ptr; + + if (begin<0 || begin>=end || end>rp->nb_frames) + { + /*fprintf(stderr, "%d %d %d\n", begin, end, rp->nb_frames);*/ + return OPUS_BAD_ARG; + } + count = end-begin; + + len = rp->len+begin; + frames = rp->frames+begin; + if (self_delimited) + tot_size = 1 + (len[count-1]>=252); + else + tot_size = 0; + + ptr = data; + if (count==1) + { + /* Code 0 */ + tot_size += len[0]+1; + if (tot_size > maxlen) + return OPUS_BUFFER_TOO_SMALL; + *ptr++ = rp->toc&0xFC; + } else if (count==2) + { + if (len[1] == len[0]) + { + /* Code 1 */ + tot_size += 2*len[0]+1; + if (tot_size > maxlen) + return OPUS_BUFFER_TOO_SMALL; + *ptr++ = (rp->toc&0xFC) | 0x1; + } else { + /* Code 2 */ + tot_size += len[0]+len[1]+2+(len[0]>=252); + if (tot_size > maxlen) + return OPUS_BUFFER_TOO_SMALL; + *ptr++ = (rp->toc&0xFC) | 0x2; + ptr += encode_size(len[0], ptr); + } + } + if (count > 2 || (pad && tot_size < maxlen)) + { + /* Code 3 */ + int vbr; + int pad_amount=0; + + /* Restart the process for the padding case */ + ptr = data; + if (self_delimited) + tot_size = 1 + (len[count-1]>=252); + else + tot_size = 0; + vbr = 0; + for (i=1;i=252) + len[i]; + tot_size += len[count-1]; + + if (tot_size > maxlen) + return OPUS_BUFFER_TOO_SMALL; + *ptr++ = (rp->toc&0xFC) | 0x3; + *ptr++ = count | 0x80; + } else { + tot_size += count*len[0]+2; + if (tot_size > maxlen) + return OPUS_BUFFER_TOO_SMALL; + *ptr++ = (rp->toc&0xFC) | 0x3; + *ptr++ = count; + } + pad_amount = pad ? (maxlen-tot_size) : 0; + if (pad_amount != 0) + { + int nb_255s; + data[1] |= 0x40; + nb_255s = (pad_amount-1)/255; + for (i=0;inb_frames, data, maxlen, 0, 0); +} + +int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len) +{ + OpusRepacketizer rp; + opus_int32 ret; + if (len < 1) + return OPUS_BAD_ARG; + if (len==new_len) + return OPUS_OK; + else if (len > new_len) + return OPUS_BAD_ARG; + opus_repacketizer_init(&rp); + /* Moving payload to the end of the packet so we can do in-place padding */ + OPUS_MOVE(data+new_len-len, data, len); + ret = opus_repacketizer_cat(&rp, data+new_len-len, len); + if (ret != OPUS_OK) + return ret; + ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, new_len, 0, 1); + if (ret > 0) + return OPUS_OK; + else + return ret; +} + +opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len) +{ + OpusRepacketizer rp; + opus_int32 ret; + if (len < 1) + return OPUS_BAD_ARG; + opus_repacketizer_init(&rp); + ret = opus_repacketizer_cat(&rp, data, len); + if (ret < 0) + return ret; + ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, len, 0, 0); + celt_assert(ret > 0 && ret <= len); + return ret; +} + +int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams) +{ + int s; + int count; + unsigned char toc; + opus_int16 size[48]; + opus_int32 packet_offset; + opus_int32 amount; + + if (len < 1) + return OPUS_BAD_ARG; + if (len==new_len) + return OPUS_OK; + else if (len > new_len) + return OPUS_BAD_ARG; + amount = new_len - len; + /* Seek to last stream */ + for (s=0;s48) + { + fprintf(stderr, "-merge parameter must be less than 48.\n"); + return EXIT_FAILURE; + } i++; } else if (strcmp(argv[i], "-split")==0) split = 1; diff --git a/external/opus-1.3.1/src/tansig_table.h b/external/opus-1.3.1/src/tansig_table.h new file mode 100644 index 00000000..c76f844a --- /dev/null +++ b/external/opus-1.3.1/src/tansig_table.h @@ -0,0 +1,45 @@ +/* This file is auto-generated by gen_tables */ + +static const float tansig_table[201] = { +0.000000f, 0.039979f, 0.079830f, 0.119427f, 0.158649f, +0.197375f, 0.235496f, 0.272905f, 0.309507f, 0.345214f, +0.379949f, 0.413644f, 0.446244f, 0.477700f, 0.507977f, +0.537050f, 0.564900f, 0.591519f, 0.616909f, 0.641077f, +0.664037f, 0.685809f, 0.706419f, 0.725897f, 0.744277f, +0.761594f, 0.777888f, 0.793199f, 0.807569f, 0.821040f, +0.833655f, 0.845456f, 0.856485f, 0.866784f, 0.876393f, +0.885352f, 0.893698f, 0.901468f, 0.908698f, 0.915420f, +0.921669f, 0.927473f, 0.932862f, 0.937863f, 0.942503f, +0.946806f, 0.950795f, 0.954492f, 0.957917f, 0.961090f, +0.964028f, 0.966747f, 0.969265f, 0.971594f, 0.973749f, +0.975743f, 0.977587f, 0.979293f, 0.980869f, 0.982327f, +0.983675f, 0.984921f, 0.986072f, 0.987136f, 0.988119f, +0.989027f, 0.989867f, 0.990642f, 0.991359f, 0.992020f, +0.992631f, 0.993196f, 0.993718f, 0.994199f, 0.994644f, +0.995055f, 0.995434f, 0.995784f, 0.996108f, 0.996407f, +0.996682f, 0.996937f, 0.997172f, 0.997389f, 0.997590f, +0.997775f, 0.997946f, 0.998104f, 0.998249f, 0.998384f, +0.998508f, 0.998623f, 0.998728f, 0.998826f, 0.998916f, +0.999000f, 0.999076f, 0.999147f, 0.999213f, 0.999273f, +0.999329f, 0.999381f, 0.999428f, 0.999472f, 0.999513f, +0.999550f, 0.999585f, 0.999617f, 0.999646f, 0.999673f, +0.999699f, 0.999722f, 0.999743f, 0.999763f, 0.999781f, +0.999798f, 0.999813f, 0.999828f, 0.999841f, 0.999853f, +0.999865f, 0.999875f, 0.999885f, 0.999893f, 0.999902f, +0.999909f, 0.999916f, 0.999923f, 0.999929f, 0.999934f, +0.999939f, 0.999944f, 0.999948f, 0.999952f, 0.999956f, +0.999959f, 0.999962f, 0.999965f, 0.999968f, 0.999970f, +0.999973f, 0.999975f, 0.999977f, 0.999978f, 0.999980f, +0.999982f, 0.999983f, 0.999984f, 0.999986f, 0.999987f, +0.999988f, 0.999989f, 0.999990f, 0.999990f, 0.999991f, +0.999992f, 0.999992f, 0.999993f, 0.999994f, 0.999994f, +0.999994f, 0.999995f, 0.999995f, 0.999996f, 0.999996f, +0.999996f, 0.999997f, 0.999997f, 0.999997f, 0.999997f, +0.999997f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, +0.999998f, 0.999998f, 0.999999f, 0.999999f, 0.999999f, +0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, +0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, +1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, +1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, +1.000000f, +}; diff --git a/external/opus-1.3.1/test-driver b/external/opus-1.3.1/test-driver new file mode 100755 index 00000000..0218a01f --- /dev/null +++ b/external/opus-1.3.1/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 2011-2017 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/external/opus-1.3.1/tests/opus_encode_regressions.c b/external/opus-1.3.1/tests/opus_encode_regressions.c new file mode 100644 index 00000000..29234730 --- /dev/null +++ b/external/opus-1.3.1/tests/opus_encode_regressions.c @@ -0,0 +1,1035 @@ +/* Copyright (c) 2016 Mark Harris, Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include "opus_multistream.h" +#include "opus.h" +#include "test_opus_common.h" + + +static int celt_ec_internal_error(void) +{ + OpusMSEncoder *enc; + int err; + unsigned char data[2460]; + int streams; + int coupled_streams; + unsigned char mapping[1]; + + enc = opus_multistream_surround_encoder_create(16000, 1, 1, &streams, + &coupled_streams, mapping, OPUS_APPLICATION_VOIP, &err); + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(8)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(OPUS_AUTO)); + { + static const short pcm[320] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1792, 1799, 1799, + 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, + 1799, 1799, 1799, 1799, 1799, 0, 25600, 1799, 1799, + 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, + 1799, 1799, 1799, 1799, 7, 0, 255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 32767, -1, + 0, 0, 0, 100, 0, 16384, 0, 0, 0, + 0, 0, 0, 4, 0, 0, -256, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,-32768, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 0, -256, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 4352, 4, 228, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5632, 0, 0, + 0, 0,-32768, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 256, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + -3944, 10500, 4285, 10459, -6474, 10204, -6539, 11601, -6824, + 13385, -7142, 13872,-11553, 13670, -7725, 13463, -6887, 7874, + -5580, 12600, -4964, 12480, 3254, 11741, -4210, 9741, -3155, + 7558, -5468, 5431, -1073, 3641, -1304, 0, -1, 343, + 26, 0, 0, 150, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1799, 1799, 1799, 1799, 1799, -2553, + 7, 1792, 1799, 1799, 1799, 1799, 1799, 1799, 1799, + 1799, 1799, 1799, 1799, -9721 + }; + err = opus_multistream_encode(enc, pcm, 320, data, 2460); + assert(err > 0); + } + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(18)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(90)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(280130)); + { + static const short pcm[160] = + { + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9526, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, 25600, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510 + }; + err = opus_multistream_encode(enc, pcm, 160, data, 2460); + assert(err > 0); + } + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(18)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(90)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(280130)); + { + static const short pcm[160] = + { + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9494, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510 + }; + err = opus_multistream_encode(enc, pcm, 160, data, 2460); + assert(err > 0); + } + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(18)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(90)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(280130)); + { + static const short pcm[160] = + { + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9479, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, + -9510, -9510, -9510, -9510, -9510, -9510, -9510 + }; + err = opus_multistream_encode(enc, pcm, 160, data, 2460); + assert(err > 0); + } + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(18)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(90)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(280130)); + { + static const short pcm[160] = + { + -9510, -9510, 1799, 1799, 1799, 1799, 1799, 1799, 1799, + 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + -256, 255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, 0, + 4352, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 148, 0, 0, 0, 0, + 5632 + }; + err = opus_multistream_encode(enc, pcm, 160, data, 2460); + assert(err > 0); + } + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(12)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(41)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(21425)); + { + static const short pcm[40] = + { + 10459, -6474, 10204, -6539, 11601, -6824, 13385, -7142, 13872, + -11553, 13670, -7725, 13463, -6887, 12482, -5580, 12600, -4964, + 12480, 3254, 11741, -4210, 9741, -3155, 7558, -5468, 5431, + -1073, 3641, -1304, 0, -1, 343, 26, 0, 0, + 0, 0, -256, 226 + }; + err = opus_multistream_encode(enc, pcm, 40, data, 2460); + assert(err > 0); + /* returns -3 */ + } + opus_multistream_encoder_destroy(enc); + return 0; +} + +static int mscbr_encode_fail10(void) +{ + OpusMSEncoder *enc; + int err; + unsigned char data[627300]; + static const unsigned char mapping[255] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101, + 102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, + 119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, + 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169, + 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186, + 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203, + 204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, + 221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237, + 238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254 + }; + + enc = opus_multistream_encoder_create(8000, 255, 254, 1, mapping, + OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err); + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(2)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(2)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(14)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(57)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(3642675)); + { + static const short pcm[20*255] = + { + 0 + }; + err = opus_multistream_encode(enc, pcm, 20, data, 627300); + assert(err > 0); + /* returns -1 */ + } + opus_multistream_encoder_destroy(enc); + return 0; +} + +static int mscbr_encode_fail(void) +{ + OpusMSEncoder *enc; + int err; + unsigned char data[472320]; + static const unsigned char mapping[192] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101, + 102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, + 119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, + 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169, + 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186, + 187,188,189,190,191 + }; + + enc = opus_multistream_encoder_create(8000, 192, 189, 3, mapping, + OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err); + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_MEDIUMBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(8)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(15360)); + { + static const short pcm[20*192] = + { + 0 + }; + err = opus_multistream_encode(enc, pcm, 20, data, 472320); + assert(err > 0); + /* returns -1 */ + } + opus_multistream_encoder_destroy(enc); + return 0; +} + +static int surround_analysis_uninit(void) +{ + OpusMSEncoder *enc; + int err; + unsigned char data[7380]; + int streams; + int coupled_streams; + unsigned char mapping[3]; + + enc = opus_multistream_surround_encoder_create(24000, 3, 1, &streams, + &coupled_streams, mapping, OPUS_APPLICATION_AUDIO, &err); + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(8)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(84315)); + { + static const short pcm[960*3] = + { + -6896, 4901, -6158, 4120, -5164, 3631, -4442, 3153, -4070, + 3349, -4577, 4474, -5541, 5058, -6701, 3881, -7933, 1863, + -8041, 697, -6738,-31464, 14330,-12523, 4096, -6130, 29178, + -250,-21252, 10467, 16907, -3359, -6644, 31965, 14607,-21544, + -32497, 24020, 12557,-26926,-18421, -1842, 24587, 19659, 4878, + 10954, 23060, 8907,-10215,-16179, 31772,-11825,-15590,-23089, + 17173,-25903,-17387, 11733, 4884, 10204,-16476,-14367, 516, + 20453,-16898, 20967,-23813, -20, 22011,-17167, 9459, 32499, + -25855, -523, -3883, -390, -4206, 634, -3767, 2325, -2751, + 3115, -2392, 2746, -2173, 2317, -1147, 2326, 23142, 11314, + -15350,-24529, 3026, 6146, 2150, 2476, 1105, -830, 1775, + -3425, 3674,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + 4293,-14023, 3879,-15553, 3158,-16161, 2629, 18433,-12535, + -6645,-20735,-32763,-13824,-20992, 25859, 13052, -8731, 2292, + -3860, 24049, 10225,-19220, 10478,-22294, 22773, 28137, 13816, + 30953,-25863,-24598, 16888,-14612,-28942, 20974,-27397,-18944, + -18690, 20991,-16638, 5632,-14330, 28911,-25594, 17408, 29958, + -517,-20984, -1800, 11281, 9977,-21221,-14854, 23840, -9477, + 3362,-12805,-22493, 32507, 156, 16384, -1163, 2301, -1874, + 4600, -1748, 6950, 16557, 8192, -7372, -1033, -3278, 2806, + 20275, 3317, -717, 9792, -767, 9099, -613, 8362, 5027, + 7774, 2597, 8549, 5278, 8743, 9343, 6940, 13038, 4826, + 14086, 2964, 13215, 1355, 11596, 455, 9850, -519, 10680, + -2287, 12551, -3736, 13639, -4291, 13790, -2722, 14544, -866, + 15050, -304, 22833, -1196, 13520, -2063, 13051, -2317, 13066, + -2737, 13773, -2664, 14105, -3447, 13854, 24589, 24672, -5280, + 10388, -4933, 7543, -4149, 3654, -1552, 1726, 661, 57, + 2922, -751, 3917, 8419, 3840, -5218, 3435, 5540, -1073, + 4153, -6656, 1649, -769, -7276,-13072, 6380, -7948, 20717, + 18425, 17392, 14335,-18190, -1842, 24587, 19659, 11790, 10954, + 23060, 8907,-10215,-16179, 31772,-11825,-15590,-23101, 17173, + -25903,-17387, 11733, 4884, 10192,-16627,-14367, 516, 20453, + -16898, 20967,-23813, -20, 22011,-17167, 9468, 32499,-25607, + -523, -3883, -390, -4206, 634, -3767, 2325, -2751, 3115, + -2392, 2746, -2161, 2317, -1147, 2326, 23142, 11314,-15350, + -29137, 3026,-15056, -491,-15170, -386,-16015, -641,-16505, + -930,-16206, -717,-16175, -2839,-16374, -4558,-16237, -5207, + -15903, -6421, 6373, -1403, 5431, -1073, 3641, -1304, -4495, + -769, -7276, 2856, -7870, 3314, -8730, 3964,-10183, 4011, + -11135, 3421,-11727, 2966,-12360, 2818,-13472, 3660,-13805, + 5162,-13478, 6434,-12840, 7335,-12420, 6865,-12349, 5541, + -11965, 5530,-10820, 5132, -9197, 3367, -7745, 1223, -6910, + -433, -6211, -1711, -4958, -1025, -3755, -836, -3292, -1666, + -2661,-10755, 31472,-27906, 31471, 18690, 5617, 16649, 11253, + -22516,-17674,-31990, 3575,-31479, 5883, 26121, 12890, -6612, + 12228,-11634, 523, 26136,-21496, 20745,-15868, -4100,-24826, + 23282, 22798, 491, -1774, 15075,-27373,-13094, 6417,-29487, + 14608, 10185, 16143, 22211, -8436, 4288, -8694, 2375, 3023, + 486, 1455, 128, 202, 942, -923, 2068, -1233, -717, + -1042, -2167, 32255, -4632, 310, -4458, -3639, -5258, 2106, + -6857, 2681, -7497, 2765, -6601, 1945, -5219, 19154, -4877, + 619, -5719, -1928, -6208, -121, 593, 188, 1558, -4152, + 1648, 156, 1604, -3664, -6862, -2851, -5112, -3600, -3747, + -5081, -4428, -5592, 20974,-27397,-18944,-18690, 20991,-17406, + 5632,-14330, 28911, 15934, 15934, 15934, 15934, 15934, 15934, + 15934, 15934, 15934, 15934, 15934, 15934,-25594, 17408, 29958, + -7173,-16888, 9098, -613, 8362, 675, 7774, 2597, 8549, + 5278, 8743, 9375, 6940, 13038, 4826, 14598, 7721,-24308, + -29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, 24353, + 28648, 6946, -1363, 12485, -1187, 26074,-25055, 10004,-24798, + 7204, -4581, -9678, 1554, 10553, 3102, 12193, 2443, 11955, + 1213, 10689, -1293, 921, -4173, 10709, -6049, 8815, -7128, + 8147, -8308, 6847, -2977, 4920,-11447,-22426,-11794, 3514, + -10220, 3430, -7993, 1926, -7072, 327, -7569, -608, -7605, + 3695, -6271, -1579, -4877, -1419, -3103, -2197, 128, -3904, + 3760, -5401, 4906, -6051, 4250, -6272, 3492, -6343, 3197, + -6397, 4041, -6341, 6255, -6381, 7905, 16504, 0, -6144, + 8062, -5606, 8622, -5555, -9, -1, 7423, 0, 1, + 238, 5148, 1309, 4700, 2218, 4403, 2573, 3568, 28303, + 1758, 3454, -1247, 3434, -4912, 2862, -7844, 1718,-10095, + 369,-12631, 128, -3904, 3632, -5401, 4906, -6051, 4250, + -6272, 3492, -6343, 3197, -6397, 4041, -6341, 6255, -6381, + 7905, 16504, 0, -6144, 8062, -5606, 8622, -5555, 8439, + -3382, 7398, -1170, 6132, 238, 5148, 1309, 4700, 2218, + 4403, 2573, 3568, 2703, 1758, 3454, -1247, 3434, -4912, + 2862, -7844, 1718,-10095, 369,-12631, -259,-14632, 234, + -15056, -521,-15170, -386,-16015, -641,-16505, -930,-16206, + -1209,-16146, -2839,-16374, -4558,-16218, -5207,-15903, -6421, + -15615, -6925,-14871, -6149,-13759, -5233,-12844, 18313, -4357, + -5696, 2804, 12992,-22802, -6720, -9770, -7088, -8998, 14330, + -12523, 14843, -6130, 29178, -250,-27396, 10467, 16907, -3359, + -6644, 31965, 14607,-21544,-32497, 24020, 12557,-26926, -173, + -129, -6401, -130,-25089, -3841, -4916, -3048, 224, -237, + -3969, -189, -3529, -535, -3464,-14863,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14395,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907, 0, 32512,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907, 9925, -718, 9753, -767, + 9099, -613, 8362, 675, 7774, 2597, 8549, 5278, 8743, + 9375, 6940, 13038, 4826, 14598, 7721,-24308,-29905,-19703, + -17106,-16124, -3287,-26118,-19709, 0, 24353, 28648, 10274, + -11292,-29665,-16417, 24346, 14553, 18707, 26323, -4596,-17711, + 5133, 26328, 13,-31168, 24583, 18404,-28927,-24350, 19453, + 28642, 1019,-10777, -3079, 30188, -7686, 27635,-32521,-16384, + 12528, -6386, 10986, 23827,-25880,-32752,-23321, 14605, 32231, + 780,-13849, 15119, 28647, 4888, -7705, 30750, 64, 0, + 32488, 6687,-20758, 19745, -2070,-13792, -6414, 28188, -2821, + -4585, 7168, 7444, 23557,-21998, 13064, 3345, -4086,-28915, + -8694, 32262, 8461, 27387,-12275, 12012, 23563,-18719,-28410, + 29144,-22271, -562, -9986, -5434, 12288, 5573,-16642, 32448, + 29182, 32705,-30723, 24255,-19716, 18368, -4357, -5696, 2804, + 12992,-22802,-22080, -7701, -5183, 486, -3133, -5660, -1083, + 16871,-28726,-11029,-30259, -1209,-16146, -2839,-16374, -4558, + -16218,-10523, 20697, -9500, -1316, 5431, -1073, 3641, -1304, + 1649, -769, -7276, 2856, -7870, 3314, -8730, 3964,-10183, + 4011,-11135, 3421,-11727, 21398, 32767, -1, 32486, -1, + 6301,-13071, 6380, -7948, -1, 32767, 240, 14081, -5646, + 30973, -3598,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907, 32767,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907, 8901, 9375, 6940, 13038, 4826, 14598, 7721,-24308, + -29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, 24361, + 28648, 10274,-11292,-29665,-16417, 24346, 14580, 18707, 26323, + -4440,-17711, 5133, 26328,-14579,-31008, 24583, 18404, 28417, + -24350, 19453, 28642,-32513,-10777, -3079, 30188, -7686, 27635, + -32521,-16384,-20240, -6386, 10986, 23827,-25880,-32752,-23321, + 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705,-15074, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907, 8192,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14897,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -15931,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907, 26121, 12890, 2604, + 12228,-11634, 12299, 5573,-16642, 32452, 29182, 32705,-30723, + 24255,-19716, 13248,-11779, -5696, 2804, 12992,-27666,-22080, + -7701, -5183, -6682,-31464, 14330,-12523, 14843, -6130, 29178, + -18,-27396, 10467, 16907, -3359, -6644, 31965, 14607,-21544, + -32497, 24020, 12557,-26926,-18421, 706, 24587, 19659, 4878, + 10954, 23060, 8907,-10215,-22579, 31772,-11825,-15590,-23089, + 17173,-25903,-17387, 3285, 4884, 10204,-16627,-14367, 516, + 20453,-16898, 20967,-23815, -20, 22011,-17167, 9468, 32499, + -25607, -523, -3883, -390, -4206, 634, -3767, 2325, -2751, + 3115, -2392, 2746, -2173, 2317, -1147, 2326, 23142, 11314, + -15130,-29137, 3026, 6146, 2150, 2476, 1105, -830, 1775, + -3425, 3674, -5287, 4609, -7175, 4922, -9579, 4556,-12007, + 4236,-14023, 3879,-15553, 3158,-16161, 2576, 18398,-12535, + -6645,-20735,-32763,-13824,-20992, 25859, 5372, 12040, 13307, + -4355,-30213, -9, -6019, 14061,-31487,-13842, 30449, 15083, + 14088, 31205,-18678,-12830, 14090,-26138,-25337,-11541, -3254, + 27628,-22270, 30953,-16136,-30745, 20991,-17406, 5632,-14330, + 28911,-25594, 17408,-20474, 13041, -8731, 2292, -3860, 24049, + 10225,-19220, 10478, -4374, -1199, 148, -330, -74, 593, + 188, 1558, -4152, 15984, 15934, 15934, 15934, 15934, 15934, + 15934, 15934, 15934, 15934, 15934, 15934, 1598, 156, 1604, + -1163, 2278,-30018,-25821,-21763,-23776, 24066, 9502, 25866, + -25055, 10004,-24798, 7204, -4581, -9678, 1554, 10553, 3102, + 12193, 2443, 11955, 1213, 10689, -1293, 921, -4173, 8661, + -6049, 8815,-21221,-14854, 23840, -9477, 8549, 5278, 8743, + 9375, 6940, 13038, 4826, 14598, 7721,-24308,-29905,-19703, + -17106,-16124, -3287,-26118,-19709,-10769, 24361, 28648, 10274, + -11292,-29665,-16417, 24346, 14580, 18707, 26323, -4410,-17711, + 5133, 26328,-14579,-31008, 24583, 18404, 28417,-24350, 19453, + 28642,-32513,-10777, -3079, 30188, -7686, 27635,-32521,-16384, + -20240, -6386, 10986, 23827,-25880,-32752,-23321, 14605, 32231, + 780,-13849, 15119, 28647, 4888, -7705, 30750, 64, 0, + 32488, 6687,-20758, 19745, -2070, -1, -1, 28, 256, + -4608, 7168, 7444, 23557,-21998, 13064, 3345, -4086,-28915, + -8594, 32262, 8461, 27387,-12275, 12012, 23563,-18719,-28410, + 29144,-22271,-32562,-16384, 12528, -6386, 10986, 23827,-25880, + -32752,-23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, + -7705, 30750, 64, 0, 32488, 6687,-20758, 19745, -2070, + -13792, -6414, 28188, -2821, -4585, 7168, 7444, 23557,-21998, + 13064, 3345, -4086,-28915, -8694, 32262, 8461, 27387,-12275, + 12012, 23563,-18719,-28410, 29144,-22271, -562, -9986, -5434, + 12288, -2107,-16643, 32452, 29182, 32705,-30723, 24255,-19716, + 18368, -4357, -5696, 2804, 12992,-22802,-22080, -7701, -5183, + 486, -3133, -5660, -1083, 16871,-28726,-11029,-30259, -1209, + -16146, -2839,-16374, -4558,-16218,-10523, 20697, -9500, -1316, + 5431, -1073, 3641, -1304, 1649, -769, -7276, 2856, -7870, + 3314, -8730, 3964,-10183, 4011,-11135, 3421,-11727, 21398, + 32767, -1, 32486, -1, -99,-13072, 6380, -7948, 4864, + 32767, 17392, 14335, -5646, 30973, -3598,-10299,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14905,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-19771,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-16443,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-15931,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907, -1,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907, 7877, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, -994, -7276, 2856, -7870, + 3314, -8730, 3964,-10183, 4011,-11135, 3421,-11727, 21398, + 32767, -1, 32486, -1, -99,-13072, 6380, -7948, 4864, + 32767, 17392, 14335, -5646, 30973, -3598,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14905,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907, 197, 0,-14977,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907, 12838, 6653, 294, + -29699,-25821,-21763,-23776, 24066, 9502, 25866,-25055, 10004, + -24798, 7204, -4581, -9678, 1554, 10553, 3102, 12193, 2443, + 11955, 1213, 10689, -1293, 921, 179, 8448, -6049, 8815, + -7128, 8147, -8308, 6847, -9889, 4920,-11447, 3174,-11794, + 3514,-10220, 3430, 16384, 1926, -7072, 327, -7537, -608, + -7605, -1169, -6397, -1579, -4877, -1419, -3103, -2197, 128, + -3904, 3632, -5401, 4906, -6051, 4250, -6272, 3492, -6343, + 3197, -6397, 4041, -6341, 6255, -6381, 7905, 16504, 0, + -6144, 8062, -5606, 8622, -5555, 8439, -3382, 7398, -1170, + 6132, 238, 5148, 1309, 4700, 2218, 4403, 2573, 3568, + 2703, 1758, 3454, -1247, 3434, -4912, 2862, -7844, 1718, + -10095, 369,-12631, -259,-14632, 234,-15056, -491,-16194, + -386,-16015, -641,-16505, -930,-16206, -1209,-16146, -2839, + -16374, -4558,-16218, -5207,-15903, -6421,-15615, -6925,-14871, + -6149,-13759, -5233,-12844, 18313, -4357, -5696, 2804, 12992, + -22802, -6720, -9770, -7088, -8998, 14330,-12523, 14843, -6130, + 29178, -250,-27396, 10467, 16907, -3359, -6644, 31965, 14607, + -21544,-32497, 24020, 12557,-26926, -173, -129, -6401, -130, + -25089, -3816, -4916, -3048, -32, -1, -3969, 256, -3529, + -535, -3464,-14863,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -1209,-16146, -2839,-16374, -4558,-16218,-10523, 20697, -9500, + -1316, 5431, -1073, 3641, -1304, 1649, -769, -7276, 2856, + -7870, 3314, -8730, 3964,-10183, 4011,-11135, 3421,-11727, + 21398, 32767, -1, 32486, -1, 6301,-13071, 6380, -7948, + -1, 32767, 240, 14081, -5646, 30973, -3598,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + 32767,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907, 8901, 9375, 6940, + 13038, 4826, 14598, 7721,-24308,-29905,-19703,-17106,-16124, + -3287,-26118,-19709,-10769, 24361, 28648, 10274,-11292,-29665, + -16417, 24346, 14580, 18707, 26323, -4440,-17711, 5133, 26328, + -14579,-31008, 24583, 18404, 28417,-24350, 19453, 28642,-32513, + -10777, -3079, 30188, -7686, 27635,-32521,-16384,-20240, -6386, + 10986, 23827,-25880,-32752,-23321, 14605, 32231, 780,-13849, + 15119, 28647, 4888, -7705,-15074,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, 8192, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14897, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-15931,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907, 26121, 12890, 2604, 12228,-11634, 12299, 5573, + -16642, 32452, 29182, 32705,-30723, 24255,-19716, 13248,-11779, + -5696, 2804, 12992,-27666,-22080, -7701, -5183, -6682,-31464, + 14330,-12523, 14843, -6130, 29178, -18,-27396, 10467, 16907, + -3359, -6644, 31965, 14607,-21544,-32497, 24020, 12557,-26926, + -18421, 706, 24587, 19659, 4878, 10954, 23060, 8907,-10215, + -22579, 31772,-11825,-15590,-23089, 17173,-25903,-17387, 3285, + 4884, 10204,-16627,-14367, 516, 20453,-16898, 20967,-23815, + -20, 22011,-17167, 9468, 32499,-25607, -523, -3883, -390, + -4206, 634, -3767, 2325, -2751, 3115, -2392, 2746, -2173, + 2317, -1147, 2326, 23142, 11314,-15130,-29137, 3026, 6146, + 2150, 2476, 1105, -830, 1775, -3425, 3674, -5287, 4609, + -7175, 4922, -9579, 4556,-12007, 4236,-14023, 3879,-15553, + 3158,-16161, 2576, 18398,-12535, -6645,-20735,-32763,-13824, + -20992, 25859, 5372, 12040, 13307, -4355,-30213, -9, -6019 + }; + err = opus_multistream_encode(enc, pcm, 960, data, 7380); + assert(err > 0); + } + opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(0)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(6)); + opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); + opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(9)); + opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); + opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(5)); + opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(775410)); + { + static const short pcm[1440*3] = + { + 30449, 15083, 14088, 31205,-18678,-12830, 14090,-26138,-25337, + -11541, -3254, 27628,-22270, 30953,-16136,-30745, 20991,-17406, + 5632,-14330, 28911,-25594, 17408,-20474, 13041, -8731, 2292, + -3860, 24049, 10225,-19220, 10478, -4374, -1199, 148, -330, + -74, 593, 188, 1558, -4152, 15984, 15934, 15934, 15934, + 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 1598, + 156, 1604, -1163, 2278,-30018,-25821,-21763,-23776, 24066, + 9502, 25866,-25055, 10004,-24798, 7204, -4581, -9678, 1554, + 10553, 3102, 12193, 2443, 11955, 1213, 10689, -1293, 921, + -4173, 8661, -6049, 8815,-21221,-14854, 23840, -9477, 8549, + 5278, 8743, 9375, 6940, 13038, 4826, 14598, 7721,-24308, + -29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, 24361, + 28648, 10274,-11292,-29665,-16417, 24346, 14580, 18707, 26323, + -4410,-17711, 5133, 26328,-14579,-31008, 24583, 18404, 28417, + -24350, 19453, 28642,-32513,-10777, -3079, 30188, -7686, 27635, + -32521,-16384,-20240, -6386, 10986, 23827,-25880,-32752,-23321, + 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705, 30750, + 64, 0, 32488, 6687,-20758, 19745, -2070, -1, -1, + 28, 256, -4608, 7168, 7444, 23557,-21998, 13064, 3345, + -4086,-28915, -8594, 32262, 8461, 27387,-12275, 12012, 23563, + -18719,-28410, 29144,-22271,-32562,-16384, 12528, -6386, 10986, + 23827,-25880,-32752,-23321, 14605, 32231, 780,-13849, 15119, + 28647, 4888, -7705, 30750, 64, 0, 32488, 6687,-20758, + 19745, -2070,-13792, -6414, 28188, -2821, -4585, 7168, 7444, + 23557,-21998, 13064, 3345, -4086,-28915, -8694, 32262, 8461, + -14853,-14907,-14907,-14907,-14907, 32767,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14891,-14907,-14907,-14907, + -14907,-14907, 8901, 9375, 6940, 13038, 4826, 14598, 7721, + -24308,-29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, + 24361, 28648, 10274,-11292,-29665,-16417, 24346, 14580, 18707, + 26323, -4440,-17711, 5133, 26328,-14579,-31008, 24583, 18404, + 28417,-24350, 19453, 28642,-32513,-10777, -3079, 30188, -7686, + 27635,-32521,-16384,-20240, -6386, 10986, 23827,-25880,-32752, + -23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705, + -15074,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907, 8192,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14897,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-15931,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907, 26121, 12890, + 2604, 12228,-11634, 12299, 5573,-16642, 32452, 29182, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, + 7710,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-10811,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14917,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14938,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, + -14907,-14907,-14907,-14907, -571, -9986, -58, 12542,-18491, + 32507, 12838, 6653, 294, -1, 0,-19968, 18368, -4357, + -5696, 2804, 12998,-22802,-22080, -7701, -5183, 486, -3133, + -5660, -1083, 13799,-28726,-11029, 205,-14848, 32464, -1, + -129,-13072, 6380, -7948, 20717, 18425, 17392, 14335, -5646, + 30973, -3598, 7188, -3867, 3055, -4247, 5597, -4011,-26427, + -11,-30418, 7922, 2614, 237, -5839,-27413,-17624,-29716, + -13539, 239, 20991, 18164, -4082,-16647,-27386, 19458, 20224, + 4619, 19728, -7409,-18186,-25073, 27627,-23539, -7945,-31464, + 14330,-12523,-22021, -7701, -5183, 486, -3133, -5660, -1083, + 13799,-28726,-11029, 205,-14848, 32464, -1, -129,-13072, + 6380, -7948, 20717, 18425, 17392, 14093, -5646, 30973, -3598, + 7188, -3867, 3055, 3689, -5401, 4906, -6051, 4250, -6272, + 3492, -6343, 3197, -6397, 4041, -6341, 6255, -6381, 239, + 20991, 18164, -4082,-16647,-27386, 19458, 20224, 4619, 19728, + -7409,-18186,-25073, 27627,-23539, -7945,-31464, 14330,-12523, + 14843, -6130, 30202, -250,-28420, 10467, 16907, -3359, -6644, + 31965, 3343,-11727, 2966,-12616, 3064,-13472, 6732,-12349, + 5541,-11965, 5530,-10820, -1912, -3637, 32285, -4607, 310, + -32768, 0, -5258, 2106, -6857, 2681, -5449, -3606, -6717, + -5482, -3606, -1853, 4082, -7631, -9808, -1742, -2851, -5112, + 64, -868,-13546,-13365,-13365,-13365,-13365,-13365,-13365, + -13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365, + -13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365, + -13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365, + -13365,-13365,-13365,-13365,-13365,-13365,-13365, 7883, -2316, + 9086, -3944, 10500, 4285, 10459, -6474, 10204, -6539, 11601, + -6824, 13385, -7142, 13872, -7457, 13670, -7725, 13463, -6887, + 12482, -5580, 12600, -4964, 12480, 3254, 11741, -4210,-24819, + 23282, 22798, 491, -1774, -1073, 3641, -1304, 28928, -250, + -27396, 6657, -8961, 22524, 19987, 10231, 1791, 8947,-32763, + -26385,-31227, -792,-30461, 8926, 4866, 27863, 27756, 27756, + 27756, 27756, 27756, 27756, 27756, 27756, 5630,-11070,-16136, + 20671,-11530, 27328, 8179, 5059,-31503,-24379,-19472, 17863, + -29202, 22986, -23, 8909, 8422, 10450 + }; + err = opus_multistream_encode(enc, pcm, 1440, data, 7380); + /* reads uninitialized data at src/opus_multistream_encoder.c:293 */ + assert(err > 0); + } + opus_multistream_encoder_destroy(enc); + return 0; +} + +static int ec_enc_shrink_assert(void) +{ + OpusEncoder *enc; + int err; + int data_len; + unsigned char data[2000]; + static const short pcm1[960] = { 5140 }; + static const short pcm2[2880] = + { + -256,-12033, 0, -2817, 6912, 0, -5359, 5200, 3061, + 0, -2903, 5652, -1281,-24656,-14433,-24678, 32,-29793, + 2870, 0, 4096, 5120, 5140, -234,-20230,-24673,-24633, + -24673,-24705, 0,-32768,-25444,-25444, 0,-25444,-25444, + 156,-20480, -7948, -5920, -7968, -7968, 224, 0, 20480, + 11, 20496, 13, 20496, 11,-20480, 2292,-20240, 244, + 20480, 11, 20496, 11,-20480, 244,-20240, 7156, 20456, + -246,-20243, 244, 128, 244, 20480, 11, 20496, 11, + -20480, 244,-20256, 244, 20480, 256, 0, -246, 16609, + -176, 0, 29872, -4096, -2888, 516, 2896, 4096, 2896, + -20480, -3852, -2896, -1025,-31056,-14433, 244, 1792, -256, + -12033, 0, -2817, 0, 0, -5359, 5200, 3061, 16, + -2903, 5652, -1281,-24656,-14433,-24678, 32,-29793, 2870, + 0, 4096, 5120, 5140, -234,-20230,-24673,-24633,-24673, + -24705, 0,-32768,-25444,-25444, 0,-25444,-25444, 156, + -20480, -7973, -5920, -7968, -7968, 224, 0, 20480, 11, + 20496, 11, 20496, 11,-20480, 2292,-20213, 244, 20480, + 11, 20496, 11,-24698, -2873, 0, 7, -1, 208, + -256, 244, 0, 4352, 20715, -2796, 11,-22272, 5364, + -234,-20230,-24673,-25913, 8351,-24832, 13963, 11, 0, + 16, 5140, 5652, -1281,-24656,-14433,-24673, 32671, 159, + 0,-25472,-25444, 156,-25600,-25444,-25444, 0, -2896, + -7968, -7960, -7968, -7968, 0, 0, 2896, 4096, 2896, + 4096, 2896, 0, -2896, -4088, -2896, 0, 2896, 0, + -2896, -4096, -2896, 11, 2640, -4609, -2896,-32768, -3072, + 0, 2896, 4096, 2896, 0, -2896, -4096, -2896, 0, + 80, 1, 2816, 0, 20656, 255,-20480, 116,-18192 + }; + static const short pcm3[2880] = { 0 }; + + enc = opus_encoder_create(48000, 1, OPUS_APPLICATION_AUDIO, &err); + opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); + opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(6)); + opus_encoder_ctl(enc, OPUS_SET_BITRATE(6000)); + data_len = opus_encode(enc, pcm1, 960, data, 2000); + assert(data_len > 0); + + opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); + opus_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_SUPERWIDEBAND)); + opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); + opus_encoder_ctl(enc, OPUS_SET_BITRATE(15600)); + data_len = opus_encode(enc, pcm2, 2880, data, 122); + assert(data_len > 0); + + opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_encoder_ctl(enc, OPUS_SET_BITRATE(27000)); + data_len = opus_encode(enc, pcm3, 2880, data, 122); /* assertion failure */ + assert(data_len > 0); + + opus_encoder_destroy(enc); + return 0; +} + +static int ec_enc_shrink_assert2(void) +{ + OpusEncoder *enc; + int err; + int data_len; + unsigned char data[2000]; + + enc = opus_encoder_create(48000, 1, OPUS_APPLICATION_AUDIO, &err); + opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(6)); + opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); + opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(26)); + opus_encoder_ctl(enc, OPUS_SET_BITRATE(27000)); + { + static const short pcm[960] = { 0 }; + data_len = opus_encode(enc, pcm, 960, data, 2000); + assert(data_len > 0); + } + opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + { + static const short pcm[480] = + { + 32767, 32767, 0, 0, 32767, 32767, 0, 0, 32767, 32767, + -32768, -32768, 0, 0, -32768, -32768, 0, 0, -32768, -32768 + }; + data_len = opus_encode(enc, pcm, 480, data, 19); + assert(data_len > 0); + } + opus_encoder_destroy(enc); + return 0; +} + +static int silk_gain_assert(void) +{ + OpusEncoder *enc; + int err; + int data_len; + unsigned char data[1000]; + static const short pcm1[160] = { 0 }; + static const short pcm2[960] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32767 + }; + + enc = opus_encoder_create(8000, 1, OPUS_APPLICATION_AUDIO, &err); + opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(3)); + opus_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); + opus_encoder_ctl(enc, OPUS_SET_BITRATE(6000)); + data_len = opus_encode(enc, pcm1, 160, data, 1000); + assert(data_len > 0); + + opus_encoder_ctl(enc, OPUS_SET_VBR(0)); + opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); + opus_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_MEDIUMBAND)); + opus_encoder_ctl(enc, OPUS_SET_BITRATE(2867)); + data_len = opus_encode(enc, pcm2, 960, data, 1000); + assert(data_len > 0); + + opus_encoder_destroy(enc); + return 0; +} + +void regression_test(void) +{ + fprintf(stderr, "Running simple tests for bugs that have been fixed previously\n"); + celt_ec_internal_error(); + mscbr_encode_fail10(); + mscbr_encode_fail(); + surround_analysis_uninit(); + ec_enc_shrink_assert(); + ec_enc_shrink_assert2(); + silk_gain_assert(); +} diff --git a/external/opus-1.3.1/tests/run_vectors.sh b/external/opus-1.3.1/tests/run_vectors.sh new file mode 100755 index 00000000..dcb76cf1 --- /dev/null +++ b/external/opus-1.3.1/tests/run_vectors.sh @@ -0,0 +1,143 @@ +#!/bin/sh + +# Copyright (c) 2011-2012 Jean-Marc Valin +# +# This file is extracted from RFC6716. Please see that RFC for additional +# information. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# - Neither the name of Internet Society, IETF or IETF Trust, nor the +# names of specific contributors, may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +rm -f logs_mono.txt logs_mono2.txt +rm -f logs_stereo.txt logs_stereo2.txt + +if [ "$#" -ne "3" ]; then + echo "usage: run_vectors.sh " + exit 1 +fi + +CMD_PATH=$1 +VECTOR_PATH=$2 +RATE=$3 + +: ${OPUS_DEMO:=$CMD_PATH/opus_demo} +: ${OPUS_COMPARE:=$CMD_PATH/opus_compare} + +if [ -d "$VECTOR_PATH" ]; then + echo "Test vectors found in $VECTOR_PATH" +else + echo "No test vectors found" + #Don't make the test fail here because the test vectors + #will be distributed separately + exit 0 +fi + +if [ ! -x "$OPUS_COMPARE" ]; then + echo "ERROR: Compare program not found: $OPUS_COMPARE" + exit 1 +fi + +if [ -x "$OPUS_DEMO" ]; then + echo "Decoding with $OPUS_DEMO" +else + echo "ERROR: Decoder not found: $OPUS_DEMO" + exit 1 +fi + +echo "==============" +echo "Testing mono" +echo "==============" +echo + +for file in 01 02 03 04 05 06 07 08 09 10 11 12 +do + if [ -e "$VECTOR_PATH/testvector$file.bit" ]; then + echo "Testing testvector$file" + else + echo "Bitstream file not found: testvector$file.bit" + fi + if "$OPUS_DEMO" -d "$RATE" 1 "$VECTOR_PATH/testvector$file.bit" tmp.out >> logs_mono.txt 2>&1; then + echo "successfully decoded" + else + echo "ERROR: decoding failed" + exit 1 + fi + "$OPUS_COMPARE" -r "$RATE" "$VECTOR_PATH/testvector${file}.dec" tmp.out >> logs_mono.txt 2>&1 + float_ret=$? + "$OPUS_COMPARE" -r "$RATE" "$VECTOR_PATH/testvector${file}m.dec" tmp.out >> logs_mono2.txt 2>&1 + float_ret2=$? + if [ "$float_ret" -eq "0" ] || [ "$float_ret2" -eq "0" ]; then + echo "output matches reference" + else + echo "ERROR: output does not match reference" + exit 1 + fi + echo +done + +echo "==============" +echo Testing stereo +echo "==============" +echo + +for file in 01 02 03 04 05 06 07 08 09 10 11 12 +do + if [ -e "$VECTOR_PATH/testvector$file.bit" ]; then + echo "Testing testvector$file" + else + echo "Bitstream file not found: testvector$file" + fi + if "$OPUS_DEMO" -d "$RATE" 2 "$VECTOR_PATH/testvector$file.bit" tmp.out >> logs_stereo.txt 2>&1; then + echo "successfully decoded" + else + echo "ERROR: decoding failed" + exit 1 + fi + "$OPUS_COMPARE" -s -r "$RATE" "$VECTOR_PATH/testvector${file}.dec" tmp.out >> logs_stereo.txt 2>&1 + float_ret=$? + "$OPUS_COMPARE" -s -r "$RATE" "$VECTOR_PATH/testvector${file}m.dec" tmp.out >> logs_stereo2.txt 2>&1 + float_ret2=$? + if [ "$float_ret" -eq "0" ] || [ "$float_ret2" -eq "0" ]; then + echo "output matches reference" + else + echo "ERROR: output does not match reference" + exit 1 + fi + echo +done + + + +echo "All tests have passed successfully" +mono1=`grep quality logs_mono.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` +mono2=`grep quality logs_mono2.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` +echo $mono1 $mono2 | awk '{if ($2 > $1) $1 = $2; print "Average mono quality is", $1, "%"}' + +stereo1=`grep quality logs_stereo.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` +stereo2=`grep quality logs_stereo2.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` +echo $stereo1 $stereo2 | awk '{if ($2 > $1) $1 = $2; print "Average stereo quality is", $1, "%"}' diff --git a/external/opus-1.0.3/tests/test_opus_api.c b/external/opus-1.3.1/tests/test_opus_api.c similarity index 87% rename from external/opus-1.0.3/tests/test_opus_api.c rename to external/opus-1.3.1/tests/test_opus_api.c index c2d7e103..fb385c63 100644 --- a/external/opus-1.0.3/tests/test_opus_api.c +++ b/external/opus-1.3.1/tests/test_opus_api.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011 Xiph.Org Foundation +/* Copyright (c) 2011-2013 Xiph.Org Foundation Written by Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without @@ -78,6 +78,9 @@ void *malloc_hook(__attribute__((unused)) size_t size, } #endif +opus_int32 *null_int_ptr = (opus_int32 *)NULL; +opus_uint32 *null_uint_ptr = (opus_uint32 *)NULL; + static const opus_int32 opus_rates[5] = {48000,24000,16000,12000,8000}; opus_int32 test_dec_api(void) @@ -92,8 +95,6 @@ opus_int32 test_dec_api(void) #endif short sbuf[960*2]; int c,err; - opus_int32 *nullvalue; - nullvalue=0; cfgs=0; /*First test invalid configurations which should fail*/ @@ -147,6 +148,8 @@ opus_int32 test_dec_api(void) fprintf(stdout," opus_decoder_create() ........................ OK.\n"); fprintf(stdout," opus_decoder_init() .......................... OK.\n"); + err=opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(null_uint_ptr)); + if(err != OPUS_BAD_ARG)test_failed(); VG_UNDEF(&dec_final_range,sizeof(dec_final_range)); err=opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range)); if(err!=OPUS_OK)test_failed(); @@ -159,14 +162,24 @@ opus_int32 test_dec_api(void) fprintf(stdout," OPUS_UNIMPLEMENTED ........................... OK.\n"); cfgs++; + err=opus_decoder_ctl(dec, OPUS_GET_BANDWIDTH(null_int_ptr)); + if(err != OPUS_BAD_ARG)test_failed(); VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_BANDWIDTH(&i)); if(err != OPUS_OK || i!=0)test_failed(); fprintf(stdout," OPUS_GET_BANDWIDTH ........................... OK.\n"); cfgs++; + err=opus_decoder_ctl(dec, OPUS_GET_SAMPLE_RATE(null_int_ptr)); + if(err != OPUS_BAD_ARG)test_failed(); + VG_UNDEF(&i,sizeof(i)); + err=opus_decoder_ctl(dec, OPUS_GET_SAMPLE_RATE(&i)); + if(err != OPUS_OK || i!=48000)test_failed(); + fprintf(stdout," OPUS_GET_SAMPLE_RATE ......................... OK.\n"); + cfgs++; + /*GET_PITCH has different execution paths depending on the previously decoded frame.*/ - err=opus_decoder_ctl(dec, OPUS_GET_PITCH(nullvalue)); + err=opus_decoder_ctl(dec, OPUS_GET_PITCH(null_int_ptr)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); @@ -190,12 +203,20 @@ opus_int32 test_dec_api(void) cfgs++; fprintf(stdout," OPUS_GET_PITCH ............................... OK.\n"); + err=opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(null_int_ptr)); + if(err != OPUS_BAD_ARG)test_failed(); + VG_UNDEF(&i,sizeof(i)); + err=opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&i)); + if(err != OPUS_OK || i!=960)test_failed(); + cfgs++; + fprintf(stdout," OPUS_GET_LAST_PACKET_DURATION ................ OK.\n"); + VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_GAIN(&i)); VG_CHECK(&i,sizeof(i)); if(err != OPUS_OK || i!=0)test_failed(); cfgs++; - err=opus_decoder_ctl(dec, OPUS_GET_GAIN(nullvalue)); + err=opus_decoder_ctl(dec, OPUS_GET_GAIN(null_int_ptr)); if(err != OPUS_BAD_ARG)test_failed(); cfgs++; err=opus_decoder_ctl(dec, OPUS_SET_GAIN(-32769)); @@ -332,11 +353,6 @@ opus_int32 test_msdec_api(void) #endif short sbuf[960*2]; int a,b,c,err; -#if 0 - /*Relevant test not enabled for multistream*/ - int *nullvalue; - nullvalue=0; -#endif mapping[0]=0; mapping[1]=1; @@ -590,7 +606,7 @@ opus_int32 test_msdec_api(void) #if 0 /*Currently unimplemented for multistream*/ /*GET_PITCH has different execution paths depending on the previously decoded frame.*/ - err=opus_multistream_decoder_ctl(dec, OPUS_GET_PITCH(nullvalue)); + err=opus_multistream_decoder_ctl(dec, OPUS_GET_PITCH(null_int_ptr)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); @@ -637,6 +653,8 @@ opus_int32 test_msdec_api(void) packet[1]=packet[2]=0; if(opus_multistream_decode(dec, packet, -1, sbuf, 960, 0)!=OPUS_BAD_ARG){printf("%d\n",opus_multistream_decode(dec, packet, -1, sbuf, 960, 0));test_failed();} cfgs++; + if(opus_multistream_decode(dec, packet, 3, sbuf, -960, 0)!=OPUS_BAD_ARG)test_failed(); + cfgs++; if(opus_multistream_decode(dec, packet, 3, sbuf, 60, 0)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(opus_multistream_decode(dec, packet, 3, sbuf, 480, 0)!=OPUS_BUFFER_TOO_SMALL)test_failed(); @@ -704,6 +722,7 @@ opus_int32 test_parse(void) /*code 0*/ for(i=0;i<64;i++) { + packet[0]=i<<2; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,4,&toc,frames,size,&payload_offset); cfgs++; @@ -1012,7 +1031,7 @@ opus_int32 test_parse(void) } } fprintf(stdout," code 3 padding (%2d cases) ............... OK.\n",cfgs); - cfgs_total+=cfgs;cfgs=0; + cfgs_total+=cfgs; fprintf(stdout," opus_packet_parse ............................ OK.\n"); fprintf(stdout," All packet parsing tests passed\n"); fprintf(stdout," (%d API invocations)\n",cfgs_total); @@ -1120,8 +1139,8 @@ opus_int32 test_enc_api(void) cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_LOOKAHEAD(&i)); if(err!=OPUS_OK || i<0 || i>32766)test_failed(); - opus_encoder_destroy(enc); cfgs++; + opus_encoder_destroy(enc); VG_UNDEF(&err,sizeof(err)); enc = opus_encoder_create(48000, 2, OPUS_APPLICATION_AUDIO, &err); @@ -1145,17 +1164,34 @@ opus_int32 test_enc_api(void) err=opus_encoder_ctl(enc,OPUS_GET_LOOKAHEAD(&i)); if(err!=OPUS_OK || i<0 || i>32766)test_failed(); cfgs++; + err=opus_encoder_ctl(enc,OPUS_GET_LOOKAHEAD(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; fprintf(stdout," OPUS_GET_LOOKAHEAD ........................... OK.\n"); + err=opus_encoder_ctl(enc,OPUS_GET_SAMPLE_RATE(&i)); + if(err!=OPUS_OK || i!=48000)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_GET_SAMPLE_RATE(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; + fprintf(stdout," OPUS_GET_SAMPLE_RATE ......................... OK.\n"); + if(opus_encoder_ctl(enc,OPUS_UNIMPLEMENTED)!=OPUS_UNIMPLEMENTED)test_failed(); fprintf(stdout," OPUS_UNIMPLEMENTED ........................... OK.\n"); cfgs++; + err=opus_encoder_ctl(enc,OPUS_GET_APPLICATION(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_APPLICATION(i),OPUS_GET_APPLICATION(&i),-1,OPUS_AUTO, OPUS_APPLICATION_AUDIO,OPUS_APPLICATION_RESTRICTED_LOWDELAY, " OPUS_SET_APPLICATION ......................... OK.\n", " OPUS_GET_APPLICATION ......................... OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_BITRATE(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; if(opus_encoder_ctl(enc,OPUS_SET_BITRATE(1073741832))!=OPUS_OK)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); @@ -1167,6 +1203,9 @@ opus_int32 test_enc_api(void) " OPUS_SET_BITRATE ............................. OK.\n", " OPUS_GET_BITRATE ............................. OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_FORCE_CHANNELS(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_FORCE_CHANNELS(i),OPUS_GET_FORCE_CHANNELS(&i),-1,3, 1,OPUS_AUTO, " OPUS_SET_FORCE_CHANNELS ...................... OK.\n", @@ -1202,6 +1241,9 @@ opus_int32 test_enc_api(void) cfgs++; if(opus_encoder_ctl(enc,OPUS_SET_BANDWIDTH(OPUS_AUTO))!=OPUS_OK)test_failed(); cfgs++; + err=opus_encoder_ctl(enc,OPUS_GET_BANDWIDTH(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; fprintf(stdout," OPUS_GET_BANDWIDTH ........................... OK.\n"); i=-2; @@ -1232,55 +1274,132 @@ opus_int32 test_enc_api(void) i!=OPUS_BANDWIDTH_MEDIUMBAND&&i!=OPUS_BANDWIDTH_WIDEBAND&& i!=OPUS_BANDWIDTH_FULLBAND))test_failed(); cfgs++; + err=opus_encoder_ctl(enc,OPUS_GET_MAX_BANDWIDTH(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; fprintf(stdout," OPUS_GET_MAX_BANDWIDTH ....................... OK.\n"); + err=opus_encoder_ctl(enc,OPUS_GET_DTX(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_DTX(i),OPUS_GET_DTX(&i),-1,2, 1,0, " OPUS_SET_DTX ................................. OK.\n", " OPUS_GET_DTX ................................. OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_COMPLEXITY(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_COMPLEXITY(i),OPUS_GET_COMPLEXITY(&i),-1,11, 0,10, " OPUS_SET_COMPLEXITY .......................... OK.\n", " OPUS_GET_COMPLEXITY .......................... OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_INBAND_FEC(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_INBAND_FEC(i),OPUS_GET_INBAND_FEC(&i),-1,2, 1,0, " OPUS_SET_INBAND_FEC .......................... OK.\n", " OPUS_GET_INBAND_FEC .......................... OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_PACKET_LOSS_PERC(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_PACKET_LOSS_PERC(i),OPUS_GET_PACKET_LOSS_PERC(&i),-1,101, 100,0, " OPUS_SET_PACKET_LOSS_PERC .................... OK.\n", " OPUS_GET_PACKET_LOSS_PERC .................... OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_VBR(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_VBR(i),OPUS_GET_VBR(&i),-1,2, 1,0, " OPUS_SET_VBR ................................. OK.\n", " OPUS_GET_VBR ................................. OK.\n") - /*CHECK_SETGET(OPUS_SET_VOICE_RATIO(i),OPUS_GET_VOICE_RATIO(&i),-2,101, +/* err=opus_encoder_ctl(enc,OPUS_GET_VOICE_RATIO(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; + CHECK_SETGET(OPUS_SET_VOICE_RATIO(i),OPUS_GET_VOICE_RATIO(&i),-2,101, 0,50, " OPUS_SET_VOICE_RATIO ......................... OK.\n", - " OPUS_GET_VOICE_RATIO ......................... OK.\n") - */ + " OPUS_GET_VOICE_RATIO ......................... OK.\n")*/ + err=opus_encoder_ctl(enc,OPUS_GET_VBR_CONSTRAINT(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_VBR_CONSTRAINT(i),OPUS_GET_VBR_CONSTRAINT(&i),-1,2, 1,0, " OPUS_SET_VBR_CONSTRAINT ...................... OK.\n", " OPUS_GET_VBR_CONSTRAINT ...................... OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_SIGNAL(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_SIGNAL(i),OPUS_GET_SIGNAL(&i),-12345,0x7FFFFFFF, OPUS_SIGNAL_MUSIC,OPUS_AUTO, " OPUS_SET_SIGNAL .............................. OK.\n", " OPUS_GET_SIGNAL .............................. OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_LSB_DEPTH(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; CHECK_SETGET(OPUS_SET_LSB_DEPTH(i),OPUS_GET_LSB_DEPTH(&i),7,25,16,24, " OPUS_SET_LSB_DEPTH ........................... OK.\n", " OPUS_GET_LSB_DEPTH ........................... OK.\n") + err=opus_encoder_ctl(enc,OPUS_GET_PREDICTION_DISABLED(&i)); + if(i!=0)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_GET_PREDICTION_DISABLED(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; + CHECK_SETGET(OPUS_SET_PREDICTION_DISABLED(i),OPUS_GET_PREDICTION_DISABLED(&i),-1,2,1,0, + " OPUS_SET_PREDICTION_DISABLED ................. OK.\n", + " OPUS_GET_PREDICTION_DISABLED ................. OK.\n") + + err=opus_encoder_ctl(enc,OPUS_GET_EXPERT_FRAME_DURATION(null_int_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_2_5_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_5_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_10_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_20_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_40_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_60_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_80_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_100_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_120_MS)); + if(err!=OPUS_OK)test_failed(); + cfgs++; + CHECK_SETGET(OPUS_SET_EXPERT_FRAME_DURATION(i),OPUS_GET_EXPERT_FRAME_DURATION(&i),0,-1, + OPUS_FRAMESIZE_60_MS,OPUS_FRAMESIZE_ARG, + " OPUS_SET_EXPERT_FRAME_DURATION ............... OK.\n", + " OPUS_GET_EXPERT_FRAME_DURATION ............... OK.\n") + /*OPUS_SET_FORCE_MODE is not tested here because it's not a public API, however the encoder tests use it*/ + err=opus_encoder_ctl(enc,OPUS_GET_FINAL_RANGE(null_uint_ptr)); + if(err!=OPUS_BAD_ARG)test_failed(); + cfgs++; if(opus_encoder_ctl(enc,OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_FINAL_RANGE ......................... OK.\n"); @@ -1334,9 +1453,9 @@ int test_repacketizer_api(void) packet=malloc(max_out); if(packet==NULL)test_failed(); - po=malloc(max_out); - if(po==NULL)test_failed(); memset(packet,0,max_out); + po=malloc(max_out+256); + if(po==NULL)test_failed(); i=opus_repacketizer_get_size(); if(i<=0)test_failed(); @@ -1438,6 +1557,22 @@ int test_repacketizer_api(void) cfgs++; if(opus_repacketizer_out(rp,po,len)!=len)test_failed(); cfgs++; + if(opus_packet_unpad(po,len)!=len)test_failed(); + cfgs++; + if(opus_packet_pad(po,len,len+1)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_packet_pad(po,len+1,len+256)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_packet_unpad(po,len+256)!=len)test_failed(); + cfgs++; + if(opus_multistream_packet_unpad(po,len,1)!=len)test_failed(); + cfgs++; + if(opus_multistream_packet_pad(po,len,len+1,1)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_multistream_packet_pad(po,len+1,len+256,1)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_multistream_packet_unpad(po,len+256,1)!=len)test_failed(); + cfgs++; if(opus_repacketizer_out(rp,po,len-1)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(len>1) @@ -1537,6 +1672,22 @@ int test_repacketizer_api(void) cfgs++; if(opus_repacketizer_out(rp,po,len)!=len)test_failed(); cfgs++; + if(opus_packet_unpad(po,len)!=len)test_failed(); + cfgs++; + if(opus_packet_pad(po,len,len+1)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_packet_pad(po,len+1,len+256)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_packet_unpad(po,len+256)!=len)test_failed(); + cfgs++; + if(opus_multistream_packet_unpad(po,len,1)!=len)test_failed(); + cfgs++; + if(opus_multistream_packet_pad(po,len,len+1,1)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_multistream_packet_pad(po,len+1,len+256,1)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_multistream_packet_unpad(po,len+256,1)!=len)test_failed(); + cfgs++; if(opus_repacketizer_out(rp,po,len-1)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(len>1) @@ -1549,9 +1700,43 @@ int test_repacketizer_api(void) } } + po[0]='O'; + po[1]='p'; + if(opus_packet_pad(po,4,4)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_multistream_packet_pad(po,4,4,1)!=OPUS_OK)test_failed(); + cfgs++; + if(opus_packet_pad(po,4,5)!=OPUS_INVALID_PACKET)test_failed(); + cfgs++; + if(opus_multistream_packet_pad(po,4,5,1)!=OPUS_INVALID_PACKET)test_failed(); + cfgs++; + if(opus_packet_pad(po,0,5)!=OPUS_BAD_ARG)test_failed(); + cfgs++; + if(opus_multistream_packet_pad(po,0,5,1)!=OPUS_BAD_ARG)test_failed(); + cfgs++; + if(opus_packet_unpad(po,0)!=OPUS_BAD_ARG)test_failed(); + cfgs++; + if(opus_multistream_packet_unpad(po,0,1)!=OPUS_BAD_ARG)test_failed(); + cfgs++; + if(opus_packet_unpad(po,4)!=OPUS_INVALID_PACKET)test_failed(); + cfgs++; + if(opus_multistream_packet_unpad(po,4,1)!=OPUS_INVALID_PACKET)test_failed(); + cfgs++; + po[0]=0; + po[1]=0; + po[2]=0; + if(opus_packet_pad(po,5,4)!=OPUS_BAD_ARG)test_failed(); + cfgs++; + if(opus_multistream_packet_pad(po,5,4,1)!=OPUS_BAD_ARG)test_failed(); + cfgs++; + fprintf(stdout," opus_repacketizer_cat ........................ OK.\n"); fprintf(stdout," opus_repacketizer_out ........................ OK.\n"); fprintf(stdout," opus_repacketizer_out_range .................. OK.\n"); + fprintf(stdout," opus_packet_pad .............................. OK.\n"); + fprintf(stdout," opus_packet_unpad ............................ OK.\n"); + fprintf(stdout," opus_multistream_packet_pad .................. OK.\n"); + fprintf(stdout," opus_multistream_packet_unpad ................ OK.\n"); opus_repacketizer_destroy(rp); cfgs++; @@ -1575,7 +1760,7 @@ int test_repacketizer_api(void) #endif #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -typedef void *(*mhook)(size_t __size, __const __malloc_ptr_t); +typedef void *(*mhook)(size_t __size, __const void *); #endif int test_malloc_fail(void) diff --git a/external/opus-1.0.3/tests/test_opus_common.h b/external/opus-1.3.1/tests/test_opus_common.h similarity index 88% rename from external/opus-1.0.3/tests/test_opus_common.h rename to external/opus-1.3.1/tests/test_opus_common.h index d1e6b452..235cf1c1 100644 --- a/external/opus-1.0.3/tests/test_opus_common.h +++ b/external/opus-1.3.1/tests/test_opus_common.h @@ -25,7 +25,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -static inline void deb2_impl(unsigned char *_t,unsigned char **_p,int _k,int _x,int _y) +static OPUS_INLINE void deb2_impl(unsigned char *_t,unsigned char **_p,int _k,int _x,int _y) { int i; if(_x>2){ @@ -41,7 +41,7 @@ static inline void deb2_impl(unsigned char *_t,unsigned char **_p,int _k,int _x, } /*Generates a De Bruijn sequence (k,2) with length k^2*/ -static inline void debruijn2(int _k, unsigned char *_res) +static OPUS_INLINE void debruijn2(int _k, unsigned char *_res) { unsigned char *p; unsigned char *t; @@ -54,7 +54,7 @@ static inline void debruijn2(int _k, unsigned char *_res) /*MWC RNG of George Marsaglia*/ static opus_uint32 Rz, Rw; -static inline opus_uint32 fast_rand(void) +static OPUS_INLINE opus_uint32 fast_rand(void) { Rz=36969*(Rz&65535)+(Rz>>16); Rw=18000*(Rw&65535)+(Rw>>16); @@ -64,8 +64,10 @@ static opus_uint32 iseed; #ifdef __GNUC__ __attribute__((noreturn)) +#elif defined(_MSC_VER) +__declspec(noreturn) #endif -static inline void _test_failed(const char *file, int line) +static OPUS_INLINE void _test_failed(const char *file, int line) { fprintf(stderr,"\n ***************************************************\n"); fprintf(stderr," *** A fatal error was detected. ***\n"); @@ -76,3 +78,5 @@ static inline void _test_failed(const char *file, int line) abort(); } #define test_failed() _test_failed(__FILE__, __LINE__); + +void regression_test(void); diff --git a/external/opus-1.0.3/tests/test_opus_decode.c b/external/opus-1.3.1/tests/test_opus_decode.c similarity index 88% rename from external/opus-1.0.3/tests/test_opus_decode.c rename to external/opus-1.3.1/tests/test_opus_decode.c index e2c04c2c..5197fa1d 100644 --- a/external/opus-1.0.3/tests/test_opus_decode.c +++ b/external/opus-1.3.1/tests/test_opus_decode.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011 Xiph.Org Foundation +/* Copyright (c) 2011-2013 Xiph.Org Foundation Written by Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without @@ -104,13 +104,17 @@ int test_decoder_code0(int no_fuzz) int factor=48000/fsv[t>>1]; for(fec=0;fec<2;fec++) { - int dur; + opus_int32 dur; /*Test PLC on a fresh decoder*/ out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor, fec); if(out_samples!=120/factor)test_failed(); if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed(); if(dur!=120/factor)test_failed(); + /*Test on a size which isn't a multiple of 2.5ms*/ + out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor+2, fec); + if(out_samples!=OPUS_BAD_ARG)test_failed(); + /*Test null pointer input*/ out_samples = opus_decode(dec[t], 0, -1, outbuf, 120/factor, fec); if(out_samples!=120/factor)test_failed(); @@ -131,7 +135,14 @@ int test_decoder_code0(int no_fuzz) outbuf[0]=32749; out_samples = opus_decode(dec[t], packet, 0, outbuf, 0, fec); if(out_samples>0)test_failed(); +#if !defined(OPUS_BUILD) && (OPUS_GNUC_PREREQ(4, 6) || (defined(__clang_major__) && __clang_major__ >= 3)) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnonnull" +#endif out_samples = opus_decode(dec[t], packet, 0, 0, 0, fec); +#if !defined(OPUS_BUILD) && (OPUS_GNUC_PREREQ(4, 6) || (defined(__clang_major__) && __clang_major__ >= 3)) +#pragma GCC diagnostic pop +#endif if(out_samples>0)test_failed(); if(outbuf[0]!=32749)test_failed(); @@ -156,7 +167,7 @@ int test_decoder_code0(int no_fuzz) /*Count code 0 tests*/ for(i=0;i<64;i++) { - int dur; + opus_int32 dur; int j,expected[5*2]; packet[0]=i<<2; packet[1]=255; @@ -230,8 +241,8 @@ int test_decoder_code0(int no_fuzz) /*We only test a subset of the modes here simply because the longer durations end up taking a long time.*/ static const int cmodes[4]={16,20,24,28}; - static const opus_uint32 cres[4]={116290185,2172123586,2172123586,2172123586}; - static const opus_uint32 lres[3]={3285687739,1481572662,694350475}; + static const opus_uint32 cres[4]={116290185,2172123586u,2172123586u,2172123586u}; + static const opus_uint32 lres[3]={3285687739u,1481572662,694350475}; static const int lmodes[3]={0,4,8}; int mode=fast_rand()%4; @@ -310,7 +321,7 @@ int test_decoder_code0(int no_fuzz) if(opus_decode(decbak, 0, 0, outbuf, MAX_FRAME_SAMP, 0)<20)test_failed(); for(t=0;t<5*2;t++) { - int dur; + opus_int32 dur; out_samples = opus_decode(dec[t], packet, plen+1, outbuf, MAX_FRAME_SAMP, 0); if(out_samples!=expected[t])test_failed(); if(t==0)dec_final_range2=dec_final_range1; @@ -369,6 +380,49 @@ int test_decoder_code0(int no_fuzz) return 0; } +#ifndef DISABLE_FLOAT_API +void test_soft_clip(void) +{ + int i,j; + float x[1024]; + float s[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + fprintf(stdout," Testing opus_pcm_soft_clip... "); + for(i=0;i<1024;i++) + { + for (j=0;j<1024;j++) + { + x[j]=(j&255)*(1/32.f)-4.f; + } + opus_pcm_soft_clip(&x[i],1024-i,1,s); + for (j=i;j<1024;j++) + { + if(x[j]>1.f)test_failed(); + if(x[j]<-1.f)test_failed(); + } + } + for(i=1;i<9;i++) + { + for (j=0;j<1024;j++) + { + x[j]=(j&255)*(1/32.f)-4.f; + } + opus_pcm_soft_clip(x,1024/i,i,s); + for (j=0;j<(1024/i)*i;j++) + { + if(x[j]>1.f)test_failed(); + if(x[j]<-1.f)test_failed(); + } + } + opus_pcm_soft_clip(x,0,1,s); + opus_pcm_soft_clip(x,1,0,s); + opus_pcm_soft_clip(x,1,1,0); + opus_pcm_soft_clip(x,1,-1,s); + opus_pcm_soft_clip(x,-1,1,s); + opus_pcm_soft_clip(0,1,1,s); + printf("OK.\n"); +} +#endif + int main(int _argc, char **_argv) { const char * oversion; @@ -389,7 +443,7 @@ int main(int _argc, char **_argv) iseed=atoi(env_seed); env_used=1; } - else iseed=(opus_uint32)time(NULL)^((getpid()&65535)<<16); + else iseed=(opus_uint32)time(NULL)^(((opus_uint32)getpid()&65535)<<16); Rw=Rz=iseed; oversion=opus_get_version_string(); @@ -401,6 +455,9 @@ int main(int _argc, char **_argv) into the decoders. This is helpful because garbage data may cause the decoders to clip, which angers CLANG IOC.*/ test_decoder_code0(getenv("TEST_OPUS_NOFUZZ")!=NULL); +#ifndef DISABLE_FLOAT_API + test_soft_clip(); +#endif return 0; } diff --git a/external/opus-1.0.3/tests/test_opus_encode.c b/external/opus-1.3.1/tests/test_opus_encode.c similarity index 60% rename from external/opus-1.0.3/tests/test_opus_encode.c rename to external/opus-1.3.1/tests/test_opus_encode.c index b80def3f..00795a1e 100644 --- a/external/opus-1.0.3/tests/test_opus_encode.c +++ b/external/opus-1.3.1/tests/test_opus_encode.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011 Xiph.Org Foundation +/* Copyright (c) 2011-2013 Xiph.Org Foundation Written by Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without @@ -51,8 +51,8 @@ #define SAMPLES (48000*30) #define SSAMPLES (SAMPLES/3) #define MAX_FRAME_SAMP (5760) - #define PI (3.141592653589793238462643f) +#define RAND_SAMPLE(a) (a[fast_rand() % sizeof(a)/sizeof(a[0])]) void generate_music(short *buf, opus_int32 len) { @@ -93,7 +93,7 @@ static void int_to_char(opus_uint32 i, unsigned char ch[4]) ch[3] = i&0xFF; } -static inline void save_packet(unsigned char* p, int len, opus_uint32 rng) +static OPUS_INLINE void save_packet(unsigned char* p, int len, opus_uint32 rng) { FILE *fout; unsigned char int_field[4]; @@ -112,14 +112,171 @@ static inline void save_packet(unsigned char* p, int len, opus_uint32 rng) } #endif +int get_frame_size_enum(int frame_size, int sampling_rate) +{ + int frame_size_enum; + + if(frame_size==sampling_rate/400) + frame_size_enum = OPUS_FRAMESIZE_2_5_MS; + else if(frame_size==sampling_rate/200) + frame_size_enum = OPUS_FRAMESIZE_5_MS; + else if(frame_size==sampling_rate/100) + frame_size_enum = OPUS_FRAMESIZE_10_MS; + else if(frame_size==sampling_rate/50) + frame_size_enum = OPUS_FRAMESIZE_20_MS; + else if(frame_size==sampling_rate/25) + frame_size_enum = OPUS_FRAMESIZE_40_MS; + else if(frame_size==3*sampling_rate/50) + frame_size_enum = OPUS_FRAMESIZE_60_MS; + else if(frame_size==4*sampling_rate/50) + frame_size_enum = OPUS_FRAMESIZE_80_MS; + else if(frame_size==5*sampling_rate/50) + frame_size_enum = OPUS_FRAMESIZE_100_MS; + else if(frame_size==6*sampling_rate/50) + frame_size_enum = OPUS_FRAMESIZE_120_MS; + else + test_failed(); + + return frame_size_enum; +} + +int test_encode(OpusEncoder *enc, int channels, int frame_size, OpusDecoder *dec) +{ + int samp_count = 0; + opus_int16 *inbuf; + unsigned char packet[MAX_PACKET+257]; + int len; + opus_int16 *outbuf; + int out_samples; + int ret = 0; + + /* Generate input data */ + inbuf = (opus_int16*)malloc(sizeof(*inbuf)*SSAMPLES); + generate_music(inbuf, SSAMPLES/2); + + /* Allocate memory for output data */ + outbuf = (opus_int16*)malloc(sizeof(*outbuf)*MAX_FRAME_SAMP*3); + + /* Encode data, then decode for sanity check */ + do { + len = opus_encode(enc, &inbuf[samp_count*channels], frame_size, packet, MAX_PACKET); + if(len<0 || len>MAX_PACKET) { + fprintf(stderr,"opus_encode() returned %d\n",len); + ret = -1; + break; + } + + out_samples = opus_decode(dec, packet, len, outbuf, MAX_FRAME_SAMP, 0); + if(out_samples!=frame_size) { + fprintf(stderr,"opus_decode() returned %d\n",out_samples); + ret = -1; + break; + } + + samp_count += frame_size; + } while (samp_count < ((SSAMPLES/2)-MAX_FRAME_SAMP)); + + /* Clean up */ + free(inbuf); + free(outbuf); + return ret; +} + +void fuzz_encoder_settings(const int num_encoders, const int num_setting_changes) +{ + OpusEncoder *enc; + OpusDecoder *dec; + int i,j,err; + + /* Parameters to fuzz. Some values are duplicated to increase their probability of being tested. */ + int sampling_rates[5] = {8000, 12000, 16000, 24000, 48000}; + int channels[2] = {1, 2}; + int applications[3] = {OPUS_APPLICATION_AUDIO, OPUS_APPLICATION_VOIP, OPUS_APPLICATION_RESTRICTED_LOWDELAY}; + int bitrates[11] = {6000, 12000, 16000, 24000, 32000, 48000, 64000, 96000, 510000, OPUS_AUTO, OPUS_BITRATE_MAX}; + int force_channels[4] = {OPUS_AUTO, OPUS_AUTO, 1, 2}; + int use_vbr[3] = {0, 1, 1}; + int vbr_constraints[3] = {0, 1, 1}; + int complexities[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + int max_bandwidths[6] = {OPUS_BANDWIDTH_NARROWBAND, OPUS_BANDWIDTH_MEDIUMBAND, + OPUS_BANDWIDTH_WIDEBAND, OPUS_BANDWIDTH_SUPERWIDEBAND, + OPUS_BANDWIDTH_FULLBAND, OPUS_BANDWIDTH_FULLBAND}; + int signals[4] = {OPUS_AUTO, OPUS_AUTO, OPUS_SIGNAL_VOICE, OPUS_SIGNAL_MUSIC}; + int inband_fecs[3] = {0, 0, 1}; + int packet_loss_perc[4] = {0, 1, 2, 5}; + int lsb_depths[2] = {8, 24}; + int prediction_disabled[3] = {0, 0, 1}; + int use_dtx[2] = {0, 1}; + int frame_sizes_ms_x2[9] = {5, 10, 20, 40, 80, 120, 160, 200, 240}; /* x2 to avoid 2.5 ms */ + + for (i=0; iMAX_PACKET)test_failed(); if(opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed(); + if((fast_rand()&3)==0) + { + if(opus_packet_pad(packet,len,len+1)!=OPUS_OK)test_failed(); + len++; + } + if((fast_rand()&7)==0) + { + if(opus_packet_pad(packet,len,len+256)!=OPUS_OK)test_failed(); + len+=256; + } + if((fast_rand()&3)==0) + { + len=opus_packet_unpad(packet,len); + if(len<1)test_failed(); + } out_samples = opus_decode(dec, packet, len, &outbuf[i<<1], MAX_FRAME_SAMP, 0); if(out_samples!=frame_size)test_failed(); if(opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed(); @@ -305,12 +494,43 @@ int run_test1(int no_fuzz) count=i=0; do { int len,out_samples,frame_size,loss; + opus_int32 pred; + if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_PREDICTION_DISABLED(&pred))!=OPUS_OK)test_failed(); + if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PREDICTION_DISABLED((int)(fast_rand()&15)<(pred?11:4)))!=OPUS_OK)test_failed(); frame_size=frame[j]; if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed(); + if((fast_rand()&255)==0) + { + if(opus_multistream_encoder_ctl(MSenc, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); + if(opus_multistream_decoder_ctl(MSdec, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); + if((fast_rand()&3)!=0) + { + if(opus_multistream_decoder_ctl(MSdec_err, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); + } + } + if((fast_rand()&255)==0) + { + if(opus_multistream_decoder_ctl(MSdec_err, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); + } len = opus_multistream_encode(MSenc, &inbuf[i<<1], frame_size, packet, MAX_PACKET); if(len<0 || len>MAX_PACKET)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed(); + if((fast_rand()&3)==0) + { + if(opus_multistream_packet_pad(packet,len,len+1,2)!=OPUS_OK)test_failed(); + len++; + } + if((fast_rand()&7)==0) + { + if(opus_multistream_packet_pad(packet,len,len+256,2)!=OPUS_OK)test_failed(); + len+=256; + } + if((fast_rand()&3)==0) + { + len=opus_multistream_packet_unpad(packet,len,2); + if(len<1)test_failed(); + } out_samples = opus_multistream_decode(MSdec, packet, len, out2buf, MAX_FRAME_SAMP, 0); if(out_samples!=frame_size*6)test_failed(); if(opus_multistream_decoder_ctl(MSdec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed(); @@ -364,7 +584,7 @@ int run_test1(int no_fuzz) the decoders in order to compare them. */ if(opus_packet_parse(packet,len,&toc,frames,size,&payload_offset)<=0)test_failed(); if((fast_rand()&1023)==0)len=0; - for(j=(frames[0]-packet);j0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0); if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed(); if((len>0&&out_samples!=frame_size))test_failed(); /*FIXME use lastframe*/ @@ -393,9 +613,13 @@ int run_test1(int no_fuzz) }while(i] [-fuzz ]\n",_argv[0]); +} + int main(int _argc, char **_argv) { + int args=1; + char * strtol_str=NULL; const char * oversion; const char * env_seed; int env_used; - - if(_argc>2) - { - fprintf(stderr,"Usage: %s []\n",_argv[0]); - return 1; - } + int num_encoders_to_fuzz=5; + int num_setting_changes=40; env_used=0; env_seed=getenv("SEED"); - if(_argc>1)iseed=atoi(_argv[1]); - else if(env_seed) - { + if(_argc>1) + iseed=strtol(_argv[1], &strtol_str, 10); /* the first input argument might be the seed */ + if(strtol_str!=NULL && strtol_str[0]=='\0') /* iseed is a valid number */ + args++; + else if(env_seed) { iseed=atoi(env_seed); env_used=1; } - else iseed=(opus_uint32)time(NULL)^((getpid()&65535)<<16); + else iseed=(opus_uint32)time(NULL)^(((opus_uint32)getpid()&65535)<<16); Rw=Rz=iseed; + while(args<_argc) + { + if(strcmp(_argv[args], "-fuzz")==0 && _argc==(args+3)) { + num_encoders_to_fuzz=strtol(_argv[args+1], &strtol_str, 10); + if(strtol_str[0]!='\0' || num_encoders_to_fuzz<=0) { + print_usage(_argv); + return EXIT_FAILURE; + } + num_setting_changes=strtol(_argv[args+2], &strtol_str, 10); + if(strtol_str[0]!='\0' || num_setting_changes<=0) { + print_usage(_argv); + return EXIT_FAILURE; + } + args+=3; + } + else { + print_usage(_argv); + return EXIT_FAILURE; + } + } + oversion=opus_get_version_string(); if(!oversion)test_failed(); fprintf(stderr,"Testing %s encoder. Random seed: %u (%.4X)\n", oversion, iseed, fast_rand() % 65535); if(env_used)fprintf(stderr," Random seed set from the environment (SEED=%s).\n", env_seed); + regression_test(); + /*Setting TEST_OPUS_NOFUZZ tells the tool not to send garbage data into the decoders. This is helpful because garbage data may cause the decoders to clip, which angers CLANG IOC.*/ run_test1(getenv("TEST_OPUS_NOFUZZ")!=NULL); + /* Fuzz encoder settings online */ + if(getenv("TEST_OPUS_NOFUZZ")==NULL) { + fprintf(stderr,"Running fuzz_encoder_settings with %d encoder(s) and %d setting change(s) each.\n", + num_encoders_to_fuzz, num_setting_changes); + fuzz_encoder_settings(num_encoders_to_fuzz, num_setting_changes); + } + fprintf(stderr,"Tests completed successfully.\n"); return 0; diff --git a/external/opus-1.3.1/tests/test_opus_padding.c b/external/opus-1.3.1/tests/test_opus_padding.c new file mode 100644 index 00000000..c22e8f0d --- /dev/null +++ b/external/opus-1.3.1/tests/test_opus_padding.c @@ -0,0 +1,93 @@ +/* Copyright (c) 2012 Xiph.Org Foundation + Written by Jüri Aedla and Ralph Giles */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* Check for overflow in reading the padding length. + * http://lists.xiph.org/pipermail/opus/2012-November/001834.html + */ + +#include +#include +#include +#include "opus.h" +#include "test_opus_common.h" + +#define PACKETSIZE 16909318 +#define CHANNELS 2 +#define FRAMESIZE 5760 + +int test_overflow(void) +{ + OpusDecoder *decoder; + int result; + int error; + + unsigned char *in = malloc(PACKETSIZE); + opus_int16 *out = malloc(FRAMESIZE*CHANNELS*sizeof(*out)); + + fprintf(stderr, " Checking for padding overflow... "); + if (!in || !out) { + fprintf(stderr, "FAIL (out of memory)\n"); + return -1; + } + in[0] = 0xff; + in[1] = 0x41; + memset(in + 2, 0xff, PACKETSIZE - 3); + in[PACKETSIZE-1] = 0x0b; + + decoder = opus_decoder_create(48000, CHANNELS, &error); + result = opus_decode(decoder, in, PACKETSIZE, out, FRAMESIZE, 0); + opus_decoder_destroy(decoder); + + free(in); + free(out); + + if (result != OPUS_INVALID_PACKET) { + fprintf(stderr, "FAIL!\n"); + test_failed(); + } + + fprintf(stderr, "OK.\n"); + + return 1; +} + +int main(void) +{ + const char *oversion; + int tests = 0;; + + iseed = 0; + oversion = opus_get_version_string(); + if (!oversion) test_failed(); + fprintf(stderr, "Testing %s padding.\n", oversion); + + tests += test_overflow(); + + fprintf(stderr, "All padding tests passed.\n"); + + return 0; +} diff --git a/external/opus-1.3.1/tests/test_opus_projection.c b/external/opus-1.3.1/tests/test_opus_projection.c new file mode 100644 index 00000000..5f0d672c --- /dev/null +++ b/external/opus-1.3.1/tests/test_opus_projection.c @@ -0,0 +1,394 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include "float_cast.h" +#include "opus.h" +#include "test_opus_common.h" +#include "opus_projection.h" +#include "mathops.h" +#include "../src/mapping_matrix.h" +#include "mathops.h" + +#define BUFFER_SIZE 960 +#define MAX_DATA_BYTES 32768 +#define MAX_FRAME_SAMPLES 5760 +#define ERROR_TOLERANCE 1 + +#define SIMPLE_MATRIX_SIZE 12 +#define SIMPLE_MATRIX_FRAME_SIZE 10 +#define SIMPLE_MATRIX_INPUT_SIZE 30 +#define SIMPLE_MATRIX_OUTPUT_SIZE 40 + +int assert_is_equal( + const opus_val16 *a, const opus_int16 *b, int size, opus_int16 tolerance) +{ + int i; + for (i = 0; i < size; i++) + { +#ifdef FIXED_POINT + opus_int16 val = a[i]; +#else + opus_int16 val = FLOAT2INT16(a[i]); +#endif + if (abs(val - b[i]) > tolerance) + return 1; + } + return 0; +} + +int assert_is_equal_short( + const opus_int16 *a, const opus_int16 *b, int size, opus_int16 tolerance) +{ + int i; + for (i = 0; i < size; i++) + if (abs(a[i] - b[i]) > tolerance) + return 1; + return 0; +} + +void test_simple_matrix(void) +{ + const MappingMatrix simple_matrix_params = {4, 3, 0}; + const opus_int16 simple_matrix_data[SIMPLE_MATRIX_SIZE] = {0, 32767, 0, 0, 32767, 0, 0, 0, 0, 0, 0, 32767}; + const opus_int16 input_int16[SIMPLE_MATRIX_INPUT_SIZE] = { + 32767, 0, -32768, 29491, -3277, -29491, 26214, -6554, -26214, 22938, -9830, + -22938, 19661, -13107, -19661, 16384, -16384, -16384, 13107, -19661, -13107, + 9830, -22938, -9830, 6554, -26214, -6554, 3277, -29491, -3277}; + const opus_int16 expected_output_int16[SIMPLE_MATRIX_OUTPUT_SIZE] = { + 0, 32767, 0, -32768, -3277, 29491, 0, -29491, -6554, 26214, 0, -26214, + -9830, 22938, 0, -22938, -13107, 19661, 0, -19661, -16384, 16384, 0, -16384, + -19661, 13107, 0, -13107, -22938, 9830, 0, -9830, -26214, 6554, 0, -6554, + -29491, 3277, 0, -3277}; + + int i, ret; + opus_int32 simple_matrix_size; + opus_val16 *input_val16; + opus_val16 *output_val16; + opus_int16 *output_int16; + MappingMatrix *simple_matrix; + + /* Allocate input/output buffers. */ + input_val16 = (opus_val16 *)opus_alloc(sizeof(opus_val16) * SIMPLE_MATRIX_INPUT_SIZE); + output_int16 = (opus_int16 *)opus_alloc(sizeof(opus_int16) * SIMPLE_MATRIX_OUTPUT_SIZE); + output_val16 = (opus_val16 *)opus_alloc(sizeof(opus_val16) * SIMPLE_MATRIX_OUTPUT_SIZE); + + /* Initialize matrix */ + simple_matrix_size = mapping_matrix_get_size(simple_matrix_params.rows, + simple_matrix_params.cols); + if (!simple_matrix_size) + test_failed(); + + simple_matrix = (MappingMatrix *)opus_alloc(simple_matrix_size); + mapping_matrix_init(simple_matrix, simple_matrix_params.rows, + simple_matrix_params.cols, simple_matrix_params.gain, simple_matrix_data, + sizeof(simple_matrix_data)); + + /* Copy inputs. */ + for (i = 0; i < SIMPLE_MATRIX_INPUT_SIZE; i++) + { +#ifdef FIXED_POINT + input_val16[i] = input_int16[i]; +#else + input_val16[i] = (1/32768.f)*input_int16[i]; +#endif + } + + /* _in_short */ + for (i = 0; i < SIMPLE_MATRIX_OUTPUT_SIZE; i++) + output_val16[i] = 0; + for (i = 0; i < simple_matrix->rows; i++) + { + mapping_matrix_multiply_channel_in_short(simple_matrix, + input_int16, simple_matrix->cols, &output_val16[i], i, + simple_matrix->rows, SIMPLE_MATRIX_FRAME_SIZE); + } + ret = assert_is_equal(output_val16, expected_output_int16, SIMPLE_MATRIX_OUTPUT_SIZE, ERROR_TOLERANCE); + if (ret) + test_failed(); + + /* _out_short */ + for (i = 0; i < SIMPLE_MATRIX_OUTPUT_SIZE; i++) + output_int16[i] = 0; + for (i = 0; i < simple_matrix->cols; i++) + { + mapping_matrix_multiply_channel_out_short(simple_matrix, + &input_val16[i], i, simple_matrix->cols, output_int16, + simple_matrix->rows, SIMPLE_MATRIX_FRAME_SIZE); + } + ret = assert_is_equal_short(output_int16, expected_output_int16, SIMPLE_MATRIX_OUTPUT_SIZE, ERROR_TOLERANCE); + if (ret) + test_failed(); + +#if !defined(DISABLE_FLOAT_API) && !defined(FIXED_POINT) + /* _in_float */ + for (i = 0; i < SIMPLE_MATRIX_OUTPUT_SIZE; i++) + output_val16[i] = 0; + for (i = 0; i < simple_matrix->rows; i++) + { + mapping_matrix_multiply_channel_in_float(simple_matrix, + input_val16, simple_matrix->cols, &output_val16[i], i, + simple_matrix->rows, SIMPLE_MATRIX_FRAME_SIZE); + } + ret = assert_is_equal(output_val16, expected_output_int16, SIMPLE_MATRIX_OUTPUT_SIZE, ERROR_TOLERANCE); + if (ret) + test_failed(); + + /* _out_float */ + for (i = 0; i < SIMPLE_MATRIX_OUTPUT_SIZE; i++) + output_val16[i] = 0; + for (i = 0; i < simple_matrix->cols; i++) + { + mapping_matrix_multiply_channel_out_float(simple_matrix, + &input_val16[i], i, simple_matrix->cols, output_val16, + simple_matrix->rows, SIMPLE_MATRIX_FRAME_SIZE); + } + ret = assert_is_equal(output_val16, expected_output_int16, SIMPLE_MATRIX_OUTPUT_SIZE, ERROR_TOLERANCE); + if (ret) + test_failed(); +#endif + + opus_free(input_val16); + opus_free(output_int16); + opus_free(output_val16); + opus_free(simple_matrix); +} + +void test_creation_arguments(const int channels, const int mapping_family) +{ + int streams; + int coupled_streams; + int enc_error; + int dec_error; + int ret; + OpusProjectionEncoder *st_enc = NULL; + OpusProjectionDecoder *st_dec = NULL; + + const opus_int32 Fs = 48000; + const int application = OPUS_APPLICATION_AUDIO; + + int order_plus_one = (int)floor(sqrt((float)channels)); + int nondiegetic_channels = channels - order_plus_one * order_plus_one; + + int is_channels_valid = 0; + int is_projection_valid = 0; + + st_enc = opus_projection_ambisonics_encoder_create(Fs, channels, + mapping_family, &streams, &coupled_streams, application, &enc_error); + if (st_enc != NULL) + { + opus_int32 matrix_size; + unsigned char *matrix; + + ret = opus_projection_encoder_ctl(st_enc, + OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, &matrix_size); + if (ret != OPUS_OK || !matrix_size) + test_failed(); + + matrix = (unsigned char *)opus_alloc(matrix_size); + ret = opus_projection_encoder_ctl(st_enc, + OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, matrix, matrix_size); + + opus_projection_encoder_destroy(st_enc); + + st_dec = opus_projection_decoder_create(Fs, channels, streams, + coupled_streams, matrix, matrix_size, &dec_error); + if (st_dec != NULL) + { + opus_projection_decoder_destroy(st_dec); + } + opus_free(matrix); + } + + is_channels_valid = (order_plus_one >= 2 && order_plus_one <= 4) && + (nondiegetic_channels == 0 || nondiegetic_channels == 2); + is_projection_valid = (enc_error == OPUS_OK && dec_error == OPUS_OK); + if (is_channels_valid ^ is_projection_valid) + { + fprintf(stderr, "Channels: %d, Family: %d\n", channels, mapping_family); + fprintf(stderr, "Order+1: %d, Non-diegetic Channels: %d\n", + order_plus_one, nondiegetic_channels); + fprintf(stderr, "Streams: %d, Coupled Streams: %d\n", + streams, coupled_streams); + test_failed(); + } +} + +void generate_music(short *buf, opus_int32 len, opus_int32 channels) +{ + opus_int32 i,j,k; + opus_int32 *a,*b,*c,*d; + a = (opus_int32 *)malloc(sizeof(opus_int32) * channels); + b = (opus_int32 *)malloc(sizeof(opus_int32) * channels); + c = (opus_int32 *)malloc(sizeof(opus_int32) * channels); + d = (opus_int32 *)malloc(sizeof(opus_int32) * channels); + memset(a, 0, sizeof(opus_int32) * channels); + memset(b, 0, sizeof(opus_int32) * channels); + memset(c, 0, sizeof(opus_int32) * channels); + memset(d, 0, sizeof(opus_int32) * channels); + j=0; + + for(i=0;i>12)^((j>>10|j>>12)&26&j>>7)))&128)+128)<<15; + r=fast_rand();v+=r&65535;v-=r>>16; + b[k]=v-a[k]+((b[k]*61+32)>>6);a[k]=v; + c[k]=(30*(c[k]+b[k]+d[k])+32)>>6;d[k]=b[k]; + v=(c[k]+128)>>8; + buf[i*channels+k]=v>32767?32767:(v<-32768?-32768:v); + if(i%6==0)j++; + } + } + + free(a); + free(b); + free(c); + free(d); +} + +void test_encode_decode(opus_int32 bitrate, opus_int32 channels, + const int mapping_family) +{ + const opus_int32 Fs = 48000; + const int application = OPUS_APPLICATION_AUDIO; + + OpusProjectionEncoder *st_enc; + OpusProjectionDecoder *st_dec; + int streams; + int coupled; + int error; + short *buffer_in; + short *buffer_out; + unsigned char data[MAX_DATA_BYTES] = { 0 }; + int len; + int out_samples; + opus_int32 matrix_size = 0; + unsigned char *matrix = NULL; + + buffer_in = (short *)malloc(sizeof(short) * BUFFER_SIZE * channels); + buffer_out = (short *)malloc(sizeof(short) * BUFFER_SIZE * channels); + + st_enc = opus_projection_ambisonics_encoder_create(Fs, channels, + mapping_family, &streams, &coupled, application, &error); + if (error != OPUS_OK) { + fprintf(stderr, + "Couldn\'t create encoder with %d channels and mapping family %d.\n", + channels, mapping_family); + free(buffer_in); + free(buffer_out); + test_failed(); + } + + error = opus_projection_encoder_ctl(st_enc, + OPUS_SET_BITRATE(bitrate * 1000 * (streams + coupled))); + if (error != OPUS_OK) + { + goto bad_cleanup; + } + + error = opus_projection_encoder_ctl(st_enc, + OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, &matrix_size); + if (error != OPUS_OK || !matrix_size) + { + goto bad_cleanup; + } + + matrix = (unsigned char *)opus_alloc(matrix_size); + error = opus_projection_encoder_ctl(st_enc, + OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, matrix, matrix_size); + + st_dec = opus_projection_decoder_create(Fs, channels, streams, coupled, + matrix, matrix_size, &error); + opus_free(matrix); + + if (error != OPUS_OK) { + fprintf(stderr, + "Couldn\'t create decoder with %d channels, %d streams " + "and %d coupled streams.\n", channels, streams, coupled); + goto bad_cleanup; + } + + generate_music(buffer_in, BUFFER_SIZE, channels); + + len = opus_projection_encode( + st_enc, buffer_in, BUFFER_SIZE, data, MAX_DATA_BYTES); + if(len<0 || len>MAX_DATA_BYTES) { + fprintf(stderr,"opus_encode() returned %d\n", len); + goto bad_cleanup; + } + + out_samples = opus_projection_decode( + st_dec, data, len, buffer_out, MAX_FRAME_SAMPLES, 0); + if(out_samples!=BUFFER_SIZE) { + fprintf(stderr,"opus_decode() returned %d\n", out_samples); + goto bad_cleanup; + } + + opus_projection_decoder_destroy(st_dec); + opus_projection_encoder_destroy(st_enc); + free(buffer_in); + free(buffer_out); + return; +bad_cleanup: + free(buffer_in); + free(buffer_out); + test_failed(); +} + +int main(int _argc, char **_argv) +{ + unsigned int i; + + (void)_argc; + (void)_argv; + + /* Test simple matrix multiplication routines. */ + test_simple_matrix(); + + /* Test full range of channels in creation arguments. */ + for (i = 0; i < 255; i++) + test_creation_arguments(i, 3); + + /* Test encode/decode pipeline. */ + test_encode_decode(64 * 18, 18, 3); + + fprintf(stderr, "All projection tests passed.\n"); + return 0; +} + diff --git a/external/opus-1.3.1/win32/VS2015/common.props b/external/opus-1.3.1/win32/VS2015/common.props new file mode 100644 index 00000000..03cd45b0 --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/common.props @@ -0,0 +1,82 @@ + + + + + + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + Unicode + + + true + true + false + + + false + false + true + + + + Level3 + false + false + ..\..;..\..\include;..\..\silk;..\..\celt;..\..\win32;%(AdditionalIncludeDirectories) + HAVE_CONFIG_H;WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + false + false + + + Console + + + true + Console + + + + + Guard + ProgramDatabase + NoExtensions + false + true + false + Disabled + false + false + Disabled + MultiThreadedDebug + MultiThreadedDebugDLL + true + false + + + true + + + + + false + None + true + true + false + Speed + Fast + Precise + true + true + true + MaxSpeed + MultiThreaded + MultiThreadedDLL + 16Bytes + + + false + + + + \ No newline at end of file diff --git a/external/opus-1.3.1/win32/VS2015/opus.sln b/external/opus-1.3.1/win32/VS2015/opus.sln new file mode 100644 index 00000000..abd7a4dd --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/opus.sln @@ -0,0 +1,168 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus", "opus.vcxproj", "{219EC965-228A-1824-174D-96449D05F88A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus_demo", "opus_demo.vcxproj", "{016C739D-6389-43BF-8D88-24B2BF6F620F}" + ProjectSection(ProjectDependencies) = postProject + {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_api", "test_opus_api.vcxproj", "{1D257A17-D254-42E5-82D6-1C87A6EC775A}" + ProjectSection(ProjectDependencies) = postProject + {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_decode", "test_opus_decode.vcxproj", "{8578322A-1883-486B-B6FA-E0094B65C9F2}" + ProjectSection(ProjectDependencies) = postProject + {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_encode", "test_opus_encode.vcxproj", "{84DAA768-1A38-4312-BB61-4C78BB59E5B8}" + ProjectSection(ProjectDependencies) = postProject + {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + DebugDLL_fixed|Win32 = DebugDLL_fixed|Win32 + DebugDLL_fixed|x64 = DebugDLL_fixed|x64 + DebugDLL|Win32 = DebugDLL|Win32 + DebugDLL|x64 = DebugDLL|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseDLL_fixed|Win32 = ReleaseDLL_fixed|Win32 + ReleaseDLL_fixed|x64 = ReleaseDLL_fixed|x64 + ReleaseDLL|Win32 = ReleaseDLL|Win32 + ReleaseDLL|x64 = ReleaseDLL|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {219EC965-228A-1824-174D-96449D05F88A}.Debug|Win32.ActiveCfg = Debug|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.Debug|Win32.Build.0 = Debug|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.Debug|x64.ActiveCfg = Debug|x64 + {219EC965-228A-1824-174D-96449D05F88A}.Debug|x64.Build.0 = Debug|x64 + {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 + {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 + {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 + {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL|x64.Build.0 = DebugDLL|x64 + {219EC965-228A-1824-174D-96449D05F88A}.Release|Win32.ActiveCfg = Release|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.Release|Win32.Build.0 = Release|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.Release|x64.ActiveCfg = Release|x64 + {219EC965-228A-1824-174D-96449D05F88A}.Release|x64.Build.0 = Release|x64 + {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 + {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 + {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 + {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 + {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|Win32.ActiveCfg = Debug|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|Win32.Build.0 = Debug|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|x64.ActiveCfg = Debug|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|x64.Build.0 = Debug|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL|x64.Build.0 = DebugDLL|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|Win32.ActiveCfg = Release|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|Win32.Build.0 = Release|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|x64.ActiveCfg = Release|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|x64.Build.0 = Release|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 + {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|Win32.ActiveCfg = Debug|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|Win32.Build.0 = Debug|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|x64.ActiveCfg = Debug|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|x64.Build.0 = Debug|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL|x64.Build.0 = DebugDLL|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|Win32.ActiveCfg = Release|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|Win32.Build.0 = Release|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|x64.ActiveCfg = Release|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|x64.Build.0 = Release|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 + {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|Win32.Build.0 = Debug|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|x64.ActiveCfg = Debug|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|x64.Build.0 = Debug|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL|x64.Build.0 = DebugDLL|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|Win32.ActiveCfg = Release|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|Win32.Build.0 = Release|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|x64.ActiveCfg = Release|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|x64.Build.0 = Release|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 + {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|Win32.ActiveCfg = Debug|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|Win32.Build.0 = Debug|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|x64.ActiveCfg = Debug|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|x64.Build.0 = Debug|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL|x64.Build.0 = DebugDLL|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|Win32.ActiveCfg = Release|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|Win32.Build.0 = Release|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|x64.ActiveCfg = Release|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|x64.Build.0 = Release|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 + {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/external/opus-1.3.1/win32/VS2015/opus.vcxproj b/external/opus-1.3.1/win32/VS2015/opus.vcxproj new file mode 100644 index 00000000..e7a17da5 --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/opus.vcxproj @@ -0,0 +1,399 @@ + + + + + DebugDLL_fixed + Win32 + + + DebugDLL_fixed + x64 + + + DebugDLL + Win32 + + + DebugDLL + x64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseDLL_fixed + Win32 + + + ReleaseDLL_fixed + x64 + + + ReleaseDLL + Win32 + + + ReleaseDLL + x64 + + + Release + Win32 + + + Release + x64 + + + + Win32Proj + opus + {219EC965-228A-1824-174D-96449D05F88A} + + + + StaticLibrary + v140 + + + DynamicLibrary + v140 + + + DynamicLibrary + v140 + + + StaticLibrary + v140 + + + DynamicLibrary + v140 + + + DynamicLibrary + v140 + + + StaticLibrary + v140 + + + DynamicLibrary + v140 + + + DynamicLibrary + v140 + + + StaticLibrary + v140 + + + DynamicLibrary + v140 + + + DynamicLibrary + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\..\silk\fixed;..\..\silk\float;%(AdditionalIncludeDirectories) + DLL_EXPORT;%(PreprocessorDefinitions) + FIXED_POINT;%(PreprocessorDefinitions) + /arch:IA32 %(AdditionalOptions) + + + /ignore:4221 %(AdditionalOptions) + + + "$(ProjectDir)..\..\win32\genversion.bat" "$(ProjectDir)..\..\win32\version.h" PACKAGE_VERSION + Generating version.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4244;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + false + + + false + + + true + + + + + + + true + + + true + + + false + + + + + + + + diff --git a/external/opus-1.3.1/win32/VS2015/opus.vcxproj.filters b/external/opus-1.3.1/win32/VS2015/opus.vcxproj.filters new file mode 100644 index 00000000..d59c7563 --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/opus.vcxproj.filters @@ -0,0 +1,585 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + diff --git a/external/opus-1.3.1/win32/VS2015/opus_demo.vcxproj b/external/opus-1.3.1/win32/VS2015/opus_demo.vcxproj new file mode 100644 index 00000000..9860bf93 --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/opus_demo.vcxproj @@ -0,0 +1,171 @@ + + + + + DebugDLL_fixed + Win32 + + + DebugDLL_fixed + x64 + + + DebugDLL + Win32 + + + DebugDLL + x64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseDLL_fixed + Win32 + + + ReleaseDLL_fixed + x64 + + + ReleaseDLL + Win32 + + + ReleaseDLL + x64 + + + Release + Win32 + + + Release + x64 + + + + + {219ec965-228a-1824-174d-96449d05f88a} + + + + + + + {016C739D-6389-43BF-8D88-24B2BF6F620F} + Win32Proj + opus_demo + + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/external/opus-1.0.3/tests/test_opus_api.vcxproj.filters b/external/opus-1.3.1/win32/VS2015/opus_demo.vcxproj.filters similarity index 91% rename from external/opus-1.0.3/tests/test_opus_api.vcxproj.filters rename to external/opus-1.3.1/win32/VS2015/opus_demo.vcxproj.filters index 66498da7..dbcc8ae9 100644 --- a/external/opus-1.0.3/tests/test_opus_api.vcxproj.filters +++ b/external/opus-1.3.1/win32/VS2015/opus_demo.vcxproj.filters @@ -1,22 +1,22 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + \ No newline at end of file diff --git a/external/opus-1.3.1/win32/VS2015/test_opus_api.vcxproj b/external/opus-1.3.1/win32/VS2015/test_opus_api.vcxproj new file mode 100644 index 00000000..c6abf88e --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/test_opus_api.vcxproj @@ -0,0 +1,171 @@ + + + + + DebugDLL_fixed + Win32 + + + DebugDLL_fixed + x64 + + + DebugDLL + Win32 + + + DebugDLL + x64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseDLL_fixed + Win32 + + + ReleaseDLL_fixed + x64 + + + ReleaseDLL + Win32 + + + ReleaseDLL + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {219ec965-228a-1824-174d-96449d05f88a} + + + + {1D257A17-D254-42E5-82D6-1C87A6EC775A} + Win32Proj + test_opus_api + + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/external/opus-1.0.3/tests/test_opus_encode.vcxproj.filters b/external/opus-1.3.1/win32/VS2015/test_opus_api.vcxproj.filters similarity index 73% rename from external/opus-1.0.3/tests/test_opus_encode.vcxproj.filters rename to external/opus-1.3.1/win32/VS2015/test_opus_api.vcxproj.filters index 9ec23556..070c8ab0 100644 --- a/external/opus-1.0.3/tests/test_opus_encode.vcxproj.filters +++ b/external/opus-1.3.1/win32/VS2015/test_opus_api.vcxproj.filters @@ -1,14 +1,14 @@ - - - - - {546c8d9a-103e-4f78-972b-b44e8d3c8aba} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - Source Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + \ No newline at end of file diff --git a/external/opus-1.3.1/win32/VS2015/test_opus_decode.vcxproj b/external/opus-1.3.1/win32/VS2015/test_opus_decode.vcxproj new file mode 100644 index 00000000..9db09b8d --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/test_opus_decode.vcxproj @@ -0,0 +1,171 @@ + + + + + DebugDLL_fixed + Win32 + + + DebugDLL_fixed + x64 + + + DebugDLL + Win32 + + + DebugDLL + x64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseDLL_fixed + Win32 + + + ReleaseDLL_fixed + x64 + + + ReleaseDLL + Win32 + + + ReleaseDLL + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {219ec965-228a-1824-174d-96449d05f88a} + + + + {8578322A-1883-486B-B6FA-E0094B65C9F2} + Win32Proj + test_opus_api + + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/external/opus-1.0.3/tests/test_opus_decode.vcxproj.filters b/external/opus-1.3.1/win32/VS2015/test_opus_decode.vcxproj.filters similarity index 84% rename from external/opus-1.0.3/tests/test_opus_decode.vcxproj.filters rename to external/opus-1.3.1/win32/VS2015/test_opus_decode.vcxproj.filters index 595c6d44..588637e8 100644 --- a/external/opus-1.0.3/tests/test_opus_decode.vcxproj.filters +++ b/external/opus-1.3.1/win32/VS2015/test_opus_decode.vcxproj.filters @@ -1,14 +1,14 @@ - - - - - {4a0dd677-931f-4728-afe5-b761149fc7eb} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - Source Files - - + + + + + {4a0dd677-931f-4728-afe5-b761149fc7eb} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + \ No newline at end of file diff --git a/external/opus-1.3.1/win32/VS2015/test_opus_encode.vcxproj b/external/opus-1.3.1/win32/VS2015/test_opus_encode.vcxproj new file mode 100644 index 00000000..b10eaf21 --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/test_opus_encode.vcxproj @@ -0,0 +1,172 @@ + + + + + DebugDLL_fixed + Win32 + + + DebugDLL_fixed + x64 + + + DebugDLL + Win32 + + + DebugDLL + x64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseDLL_fixed + Win32 + + + ReleaseDLL_fixed + x64 + + + ReleaseDLL + Win32 + + + ReleaseDLL + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + {219ec965-228a-1824-174d-96449d05f88a} + + + + {84DAA768-1A38-4312-BB61-4C78BB59E5B8} + Win32Proj + test_opus_api + + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + Application + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/external/opus-1.3.1/win32/VS2015/test_opus_encode.vcxproj.filters b/external/opus-1.3.1/win32/VS2015/test_opus_encode.vcxproj.filters new file mode 100644 index 00000000..f0477638 --- /dev/null +++ b/external/opus-1.3.1/win32/VS2015/test_opus_encode.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {546c8d9a-103e-4f78-972b-b44e8d3c8aba} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/external/opus-1.3.1/win32/config.h b/external/opus-1.3.1/win32/config.h new file mode 100644 index 00000000..3e54bcbb --- /dev/null +++ b/external/opus-1.3.1/win32/config.h @@ -0,0 +1,64 @@ +/*********************************************************************** +Copyright (c) 2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifndef CONFIG_H +#define CONFIG_H + +#define USE_ALLOCA 1 + +/* Comment out the next line for floating-point code */ +/*#define FIXED_POINT 1 */ + +#define OPUS_BUILD 1 + +#if defined(_M_IX86) || defined(_M_X64) +/* Can always compile SSE intrinsics (no special compiler flags necessary) */ +#define OPUS_X86_MAY_HAVE_SSE +#define OPUS_X86_MAY_HAVE_SSE2 +#define OPUS_X86_MAY_HAVE_SSE4_1 + +/* Presume SSE functions, if compiled to use SSE/SSE2/AVX (note that AMD64 implies SSE2, and AVX + implies SSE4.1) */ +#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(__AVX__) +#define OPUS_X86_PRESUME_SSE 1 +#endif +#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(__AVX__) +#define OPUS_X86_PRESUME_SSE2 1 +#endif +#if defined(__AVX__) +#define OPUS_X86_PRESUME_SSE4_1 1 +#endif + +#if !defined(OPUS_X86_PRESUME_SSE4_1) || !defined(OPUS_X86_PRESUME_SSE2) || !defined(OPUS_X86_PRESUME_SSE) +#define OPUS_HAVE_RTCD 1 +#endif + +#endif + +#include "version.h" + +#endif /* CONFIG_H */ diff --git a/external/opus-1.3.1/win32/genversion.bat b/external/opus-1.3.1/win32/genversion.bat new file mode 100644 index 00000000..aea55739 --- /dev/null +++ b/external/opus-1.3.1/win32/genversion.bat @@ -0,0 +1,37 @@ +@echo off + +setlocal enableextensions enabledelayedexpansion + +for /f %%v in ('cd "%~dp0.." ^&^& git status ^>NUL 2^>NUL ^&^& git describe --tags --match "v*" --dirty 2^>NUL') do set version=%%v + +if not "%version%"=="" set version=!version:~1! && goto :gotversion + +if exist "%~dp0..\package_version" goto :getversion + +echo Git cannot be found, nor can package_version. Generating unknown version. + +set version=unknown + +goto :gotversion + +:getversion + +for /f "delims== tokens=2" %%v in (%~dps0..\package_version) do set version=%%v +set version=!version:"=! + +:gotversion + +set version=!version: =! +set version_out=#define %~2 "%version%" + +echo %version_out%> "%~1_temp" + +echo n | comp "%~1_temp" "%~1" > NUL 2> NUL + +if not errorlevel 1 goto exit + +copy /y "%~1_temp" "%~1" + +:exit + +del "%~1_temp" diff --git a/external/opusfile-0.10/000-opusfile.git-67273ef.patch b/external/opusfile-0.10/000-opusfile.git-67273ef.patch deleted file mode 100644 index 037b6e99..00000000 --- a/external/opusfile-0.10/000-opusfile.git-67273ef.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 67273ef32d5d5a0f8a0fc038948b8348c4387b5c Mon Sep 17 00:00:00 2001 -From: James Zern -Date: Thu, 7 Dec 2017 15:25:28 -0800 -Subject: [PATCH] op_fetch_and_process_page: Fix int64 overflow - -Check for overflow with a negative diff. - -Signed-off-by: Timothy B. Terriberry ---- - src/opusfile.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/opusfile.c b/src/opusfile.c -index 140503e..8b000a2 100644 ---- a/src/opusfile.c -+++ b/src/opusfile.c -@@ -2078,7 +2078,11 @@ static int op_fetch_and_process_page(OggOpusFile *_of, - &&OP_LIKELY(diff0){ - /*If we trimmed the entire packet, stop (the spec says encoders --- -2.1.4 - diff --git a/external/opusfile-0.10/001-opusfile.git-567165a.patch b/external/opusfile-0.10/001-opusfile.git-567165a.patch deleted file mode 100644 index 35456c3c..00000000 --- a/external/opusfile-0.10/001-opusfile.git-567165a.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 567165a7feb9b4e540dc9d257fd276849d660060 Mon Sep 17 00:00:00 2001 -From: James Zern -Date: Thu, 7 Dec 2017 15:24:48 -0800 -Subject: [PATCH] op_pcm_seek: Fix int64 overflow - -Calculate discard_count directly with op_granpos_diff. this works -because _pcm_offset == (target_gp - pcm_start) and diff == (gp - -pcm_start). - -Signed-off-by: Timothy B. Terriberry ---- - src/opusfile.c | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - -diff --git a/src/opusfile.c b/src/opusfile.c -index 72f1272..140503e 100644 ---- a/src/opusfile.c -+++ b/src/opusfile.c -@@ -2597,15 +2597,14 @@ int op_pcm_seek(OggOpusFile *_of,ogg_int64_t _pcm_offset){ - ogg_int64_t gp; - gp=_of->prev_packet_gp; - if(OP_LIKELY(gp!=-1)){ -- int nbuffered; -+ ogg_int64_t discard_count; -+ int nbuffered; - nbuffered=OP_MAX(_of->od_buffer_size-_of->od_buffer_pos,0); - OP_ALWAYS_TRUE(!op_granpos_add(&gp,gp,-nbuffered)); - /*We do _not_ add cur_discard_count to gp. - Otherwise the total amount to discard could grow without bound, and it - would be better just to do a full seek.*/ -- if(OP_LIKELY(!op_granpos_diff(&diff,gp,pcm_start))){ -- ogg_int64_t discard_count; -- discard_count=_pcm_offset-diff; -+ if(OP_LIKELY(!op_granpos_diff(&discard_count,target_gp,gp))){ - /*We use a threshold of 90 ms instead of 80, since 80 ms is the - _minimum_ we would have discarded after a full seek. - Assuming 20 ms frames (the default), we'd discard 90 ms on average.*/ --- -2.1.4 - diff --git a/external/opusfile-0.10/003-opusfile.git-e8e3046.patch b/external/opusfile-0.10/003-opusfile.git-e8e3046.patch deleted file mode 100644 index 8822a1c8..00000000 --- a/external/opusfile-0.10/003-opusfile.git-e8e3046.patch +++ /dev/null @@ -1,21 +0,0 @@ -From: Mark Harris -Date: Mon, 11 Jun 2018 06:47:59 +0000 (-0700) -Subject: opus_tags_copy: return OP_EFAULT on failure -X-Git-Url: http://git.xiph.org/?p=opusfile.git;a=commitdiff_plain;h=e8e3046572dd0369b8346a4af8e34d283b385c59 - -opus_tags_copy: return OP_EFAULT on failure ---- - -diff --git a/src/info.c b/src/info.c -index fba4c16..7abb29d 100644 ---- a/src/info.c -+++ b/src/info.c -@@ -282,7 +282,7 @@ int opus_tags_copy(OpusTags *_dst,const OpusTags *_src){ - ret=opus_tags_copy_impl(&dst,_src); - if(OP_UNLIKELY(ret<0))opus_tags_clear(&dst); - else *_dst=*&dst; -- return 0; -+ return ret; - } - - int opus_tags_add(OpusTags *_tags,const char *_tag,const char *_value){ diff --git a/external/opusfile-0.10/package_version b/external/opusfile-0.10/package_version deleted file mode 100644 index 21311081..00000000 --- a/external/opusfile-0.10/package_version +++ /dev/null @@ -1 +0,0 @@ -PACKAGE_VERSION="0.10" diff --git a/external/opusfile-0.10/src/Makefile.darwin b/external/opusfile-0.10/src/Makefile.darwin deleted file mode 100644 index 16ca5876..00000000 --- a/external/opusfile-0.10/src/Makefile.darwin +++ /dev/null @@ -1,37 +0,0 @@ -CROSS= -CC = $(CROSS)gcc - -CFLAGS = -O2 -fno-common -std=c89 -pedantic -CFLAGS += -fvisibility=hidden -CFLAGS += -mmacosx-version-min=10.6 -CFLAGS += -Wall -W -Wno-parentheses -Wno-long-long -INCLUDES = -I../include -I../include/opus -CPPFLAGS+= -Drestrict=__restrict -CPPFLAGS+= -DOP_HAVE_LRINTF=1 -DHAVE_STDINT_H=1 -#CPPFLAGS += -DOP_DISABLE_FLOAT_API=1 -#CPPFLAGS += -DOP_FIXED_POINT=1 -#CPPFLAGS += -DOP_ENABLE_ASSERTIONS=1 - -LDFLAGS = -mmacosx-version-min=10.6 -Wl,-single_module -LDFLAGS+= -Wl,-install_name,@rpath/OpusFile.framework/Versions/A/OpusFile -LDFLAGS+= -Wl,-compatibility_version,5.0 -Wl,-current_version,5.3 -LDLIBS = -F../Frameworks -Wl,-framework,Opus -Wl,-framework,Ogg -#LDLIBS += -Wl,-lbundle1.o - -%.o:%.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -o $@ $< - -TARGET = libopusfile.dylib - -OBJS := internal.o info.o stream.o opusfile.o - -# Rules -all: $(TARGET) - -$(TARGET): $(OBJS) - $(CC) -dynamiclib -o $(TARGET) $(OBJS) $(LDFLAGS) $(LDLIBS) - -clean: - rm -f $(TARGET) $(OBJS) - -.PHONY: all clean diff --git a/external/opusfile-0.10/050-opusfile-misc-port0.patch b/external/opusfile-0.11/0000-misc-configury.patch similarity index 76% rename from external/opusfile-0.10/050-opusfile-misc-port0.patch rename to external/opusfile-0.11/0000-misc-configury.patch index 8f9d1348..65c49883 100644 --- a/external/opusfile-0.10/050-opusfile-misc-port0.patch +++ b/external/opusfile-0.11/0000-misc-configury.patch @@ -1,22 +1,17 @@ -make opusfile configury to behave with autoconf-2.63 and libtool-1.5.x - diff --git a/configure.ac b/configure.ac index d68666c..7da0066 100644 --- a/configure.ac +++ b/configure.ac -@@ -21,7 +21,10 @@ AC_SYS_LARGEFILE +@@ -21,7 +21,7 @@ AC_SYS_LARGEFILE AM_INIT_AUTOMAKE([1.11 foreign no-define dist-zip subdir-objects]) AM_MAINTAINER_MODE([enable]) -LT_INIT -+ -+AC_LIBTOOL_WIN32_DLL -+AC_PROG_LIBTOOL -+#LT_INIT([win32-dll]) ++LT_INIT([win32-dll]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) -@@ -76,13 +79,13 @@ AM_COND_IF(OP_WIN32, +@@ -76,13 +76,13 @@ AM_COND_IF(OP_WIN32, AS_IF([test "$enable_http" != "no"], AC_CHECK_HEADER([winsock2.h],, AC_MSG_WARN([HTTP support requires a Winsock socket library.]) diff --git a/external/opusfile-0.10/051-opusfile-misc-port1.patch b/external/opusfile-0.11/0001-misc-mingw64.patch similarity index 69% rename from external/opusfile-0.10/051-opusfile-misc-port1.patch rename to external/opusfile-0.11/0001-misc-mingw64.patch index 81c35f82..e1da645f 100644 --- a/external/opusfile-0.10/051-opusfile-misc-port1.patch +++ b/external/opusfile-0.11/0001-misc-mingw64.patch @@ -1,10 +1,8 @@ -use xmm intrinsics for lrintf with x86_64-w64-mingw32 +use xmm intrinsics for lrintf with mingw-w64 -c.f.: http://git.xiph.org/?p=opus.git;a=commit;h=cd159fd1ec8ae64e6cd1b69854034560b5f1c419 - -diff -u opusfile-0.10/src/opusfile.c opusfile-0.10-edit/src/opusfile.c ---- opusfile-0.10/src/opusfile.c -+++ opusfile-0.10-edit/src/opusfile.c +diff -u opusfile/src/opusfile.c~ opusfile/src/opusfile.c +--- opusfile/src/opusfile.c~ ++++ opusfile/src/opusfile.c @@ -25,7 +25,9 @@ #include #include diff --git a/external/opusfile-0.10/AUTHORS b/external/opusfile-0.11/AUTHORS similarity index 100% rename from external/opusfile-0.10/AUTHORS rename to external/opusfile-0.11/AUTHORS diff --git a/external/opusfile-0.10/COPYING b/external/opusfile-0.11/COPYING similarity index 100% rename from external/opusfile-0.10/COPYING rename to external/opusfile-0.11/COPYING diff --git a/external/opusfile-0.10/Makefile.am b/external/opusfile-0.11/Makefile.am similarity index 100% rename from external/opusfile-0.10/Makefile.am rename to external/opusfile-0.11/Makefile.am diff --git a/external/opusfile-0.10/Makefile.in b/external/opusfile-0.11/Makefile.in similarity index 99% rename from external/opusfile-0.10/Makefile.in rename to external/opusfile-0.11/Makefile.in index b89bd922..ab86e72e 100644 --- a/external/opusfile-0.10/Makefile.in +++ b/external/opusfile-0.11/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -103,7 +103,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/attributes.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ @@ -286,6 +287,7 @@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -1015,9 +1017,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -@HAVE_DOXYGEN_FALSE@clean-local: -@HAVE_DOXYGEN_FALSE@install-data-local: @HAVE_DOXYGEN_FALSE@uninstall-local: +@HAVE_DOXYGEN_FALSE@install-data-local: +@HAVE_DOXYGEN_FALSE@clean-local: clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ diff --git a/external/opusfile-0.10/README.md b/external/opusfile-0.11/README.md similarity index 100% rename from external/opusfile-0.10/README.md rename to external/opusfile-0.11/README.md diff --git a/external/opusfile-0.10/aclocal.m4 b/external/opusfile-0.11/aclocal.m4 similarity index 75% rename from external/opusfile-0.10/aclocal.m4 rename to external/opusfile-0.11/aclocal.m4 index b40c055f..989b6d4d 100644 --- a/external/opusfile-0.10/aclocal.m4 +++ b/external/opusfile-0.11/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,351 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# serial 11 (pkg-config-0.29.1) - -dnl Copyright © 2004 Scott James Remnant . -dnl Copyright © 2012-2015 Dan Nicholson -dnl -dnl This program is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl This program is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with this program; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -dnl 02111-1307, USA. -dnl -dnl As a special exception to the GNU General Public License, if you -dnl distribute this file as part of a program that contains a -dnl configuration script generated by Autoconf, you may include it under -dnl the same distribution terms that you use for the rest of that -dnl program. - -dnl PKG_PREREQ(MIN-VERSION) -dnl ----------------------- -dnl Since: 0.29 -dnl -dnl Verify that the version of the pkg-config macros are at least -dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's -dnl installed version of pkg-config, this checks the developer's version -dnl of pkg.m4 when generating configure. -dnl -dnl To ensure that this macro is defined, also add: -dnl m4_ifndef([PKG_PREREQ], -dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) -dnl -dnl See the "Since" comment for each macro you use to see what version -dnl of the macros you require. -m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29.1]) -m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, - [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) -])dnl PKG_PREREQ - -dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) -dnl ---------------------------------- -dnl Since: 0.16 -dnl -dnl Search for the pkg-config tool and set the PKG_CONFIG variable to -dnl first found in the path. Checks that the version of pkg-config found -dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is -dnl used since that's the first version where most current features of -dnl pkg-config existed. -AC_DEFUN([PKG_PROG_PKG_CONFIG], -[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) -m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) -AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) -AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) - -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=m4_default([$1], [0.9.0]) - AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - PKG_CONFIG="" - fi -fi[]dnl -])dnl PKG_PROG_PKG_CONFIG - -dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -dnl ------------------------------------------------------------------- -dnl Since: 0.18 -dnl -dnl Check to see whether a particular set of modules exists. Similar to -dnl PKG_CHECK_MODULES(), but does not set variables or print errors. -dnl -dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -dnl only at the first occurence in configure.ac, so if the first place -dnl it's called might be skipped (such as if it is within an "if", you -dnl have to call PKG_CHECK_EXISTS manually -AC_DEFUN([PKG_CHECK_EXISTS], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -if test -n "$PKG_CONFIG" && \ - AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_default([$2], [:]) -m4_ifvaln([$3], [else - $3])dnl -fi]) - -dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -dnl --------------------------------------------- -dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting -dnl pkg_failed based on the result. -m4_define([_PKG_CONFIG], -[if test -n "$$1"; then - pkg_cv_[]$1="$$1" - elif test -n "$PKG_CONFIG"; then - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` - test "x$?" != "x0" && pkg_failed=yes ], - [pkg_failed=yes]) - else - pkg_failed=untried -fi[]dnl -])dnl _PKG_CONFIG - -dnl _PKG_SHORT_ERRORS_SUPPORTED -dnl --------------------------- -dnl Internal check to see if pkg-config supports short errors. -AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi[]dnl -])dnl _PKG_SHORT_ERRORS_SUPPORTED - - -dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -dnl [ACTION-IF-NOT-FOUND]) -dnl -------------------------------------------------------------- -dnl Since: 0.4.0 -dnl -dnl Note that if there is a possibility the first call to -dnl PKG_CHECK_MODULES might not happen, you should be sure to include an -dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -AC_DEFUN([PKG_CHECK_MODULES], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl - -pkg_failed=no -AC_MSG_CHECKING([for $1]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -and $1[]_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details.]) - -if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - m4_default([$4], [AC_MSG_ERROR( -[Package requirements ($2) were not met: - -$$1_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -_PKG_TEXT])[]dnl - ]) -elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) - m4_default([$4], [AC_MSG_FAILURE( -[The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -_PKG_TEXT - -To get pkg-config, see .])[]dnl - ]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - $3 -fi[]dnl -])dnl PKG_CHECK_MODULES - - -dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -dnl [ACTION-IF-NOT-FOUND]) -dnl --------------------------------------------------------------------- -dnl Since: 0.29 -dnl -dnl Checks for existence of MODULES and gathers its build flags with -dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags -dnl and VARIABLE-PREFIX_LIBS from --libs. -dnl -dnl Note that if there is a possibility the first call to -dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to -dnl include an explicit call to PKG_PROG_PKG_CONFIG in your -dnl configure.ac. -AC_DEFUN([PKG_CHECK_MODULES_STATIC], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -_save_PKG_CONFIG=$PKG_CONFIG -PKG_CONFIG="$PKG_CONFIG --static" -PKG_CHECK_MODULES($@) -PKG_CONFIG=$_save_PKG_CONFIG[]dnl -])dnl PKG_CHECK_MODULES_STATIC - - -dnl PKG_INSTALLDIR([DIRECTORY]) -dnl ------------------------- -dnl Since: 0.27 -dnl -dnl Substitutes the variable pkgconfigdir as the location where a module -dnl should install pkg-config .pc files. By default the directory is -dnl $libdir/pkgconfig, but the default can be changed by passing -dnl DIRECTORY. The user can override through the --with-pkgconfigdir -dnl parameter. -AC_DEFUN([PKG_INSTALLDIR], -[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) -m4_pushdef([pkg_description], - [pkg-config installation directory @<:@]pkg_default[@:>@]) -AC_ARG_WITH([pkgconfigdir], - [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, - [with_pkgconfigdir=]pkg_default) -AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) -m4_popdef([pkg_default]) -m4_popdef([pkg_description]) -])dnl PKG_INSTALLDIR - - -dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) -dnl -------------------------------- -dnl Since: 0.27 -dnl -dnl Substitutes the variable noarch_pkgconfigdir as the location where a -dnl module should install arch-independent pkg-config .pc files. By -dnl default the directory is $datadir/pkgconfig, but the default can be -dnl changed by passing DIRECTORY. The user can override through the -dnl --with-noarch-pkgconfigdir parameter. -AC_DEFUN([PKG_NOARCH_INSTALLDIR], -[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) -m4_pushdef([pkg_description], - [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) -AC_ARG_WITH([noarch-pkgconfigdir], - [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, - [with_noarch_pkgconfigdir=]pkg_default) -AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) -m4_popdef([pkg_default]) -m4_popdef([pkg_description]) -])dnl PKG_NOARCH_INSTALLDIR - - -dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, -dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -dnl ------------------------------------------- -dnl Since: 0.28 -dnl -dnl Retrieves the value of the pkg-config variable for the given module. -AC_DEFUN([PKG_CHECK_VAR], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl - -_PKG_CONFIG([$1], [variable="][$3]["], [$2]) -AS_VAR_COPY([$1], [pkg_cv_][$1]) - -AS_VAR_IF([$1], [""], [$5], [$4])dnl -])dnl PKG_CHECK_VAR - -dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, -dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], -dnl [DESCRIPTION], [DEFAULT]) -dnl ------------------------------------------ -dnl -dnl Prepare a "--with-" configure option using the lowercase -dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and -dnl PKG_CHECK_MODULES in a single macro. -AC_DEFUN([PKG_WITH_MODULES], -[ -m4_pushdef([with_arg], m4_tolower([$1])) - -m4_pushdef([description], - [m4_default([$5], [build with ]with_arg[ support])]) - -m4_pushdef([def_arg], [m4_default([$6], [auto])]) -m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) -m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) - -m4_case(def_arg, - [yes],[m4_pushdef([with_without], [--without-]with_arg)], - [m4_pushdef([with_without],[--with-]with_arg)]) - -AC_ARG_WITH(with_arg, - AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, - [AS_TR_SH([with_]with_arg)=def_arg]) - -AS_CASE([$AS_TR_SH([with_]with_arg)], - [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], - [auto],[PKG_CHECK_MODULES([$1],[$2], - [m4_n([def_action_if_found]) $3], - [m4_n([def_action_if_not_found]) $4])]) - -m4_popdef([with_arg]) -m4_popdef([description]) -m4_popdef([def_arg]) - -])dnl PKG_WITH_MODULES - -dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, -dnl [DESCRIPTION], [DEFAULT]) -dnl ----------------------------------------------- -dnl -dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES -dnl check._[VARIABLE-PREFIX] is exported as make variable. -AC_DEFUN([PKG_HAVE_WITH_MODULES], -[ -PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) - -AM_CONDITIONAL([HAVE_][$1], - [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) -])dnl PKG_HAVE_WITH_MODULES - -dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, -dnl [DESCRIPTION], [DEFAULT]) -dnl ------------------------------------------------------ -dnl -dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after -dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make -dnl and preprocessor variable. -AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], -[ -PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) - -AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], - [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) -])dnl PKG_HAVE_DEFINE_WITH_MODULES - -# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# Copyright (C) 2002-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -379,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.15], [], +m4_if([$1], [1.15.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -395,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.15])dnl +[AM_AUTOMAKE_VERSION([1.15.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -454,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd` # AM_COND_IF -*- Autoconf -*- -# Copyright (C) 2008-2014 Free Software Foundation, Inc. +# Copyright (C) 2008-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -491,7 +147,7 @@ fi[]dnl # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -522,7 +178,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -713,7 +369,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -789,7 +445,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -986,7 +642,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1007,7 +663,7 @@ if test x"${install_sh+set}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 2003-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1029,7 +685,7 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1064,7 +720,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1114,7 +770,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1153,7 +809,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1182,7 +838,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1229,7 +885,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1248,7 +904,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1329,7 +985,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# Copyright (C) 2009-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1389,7 +1045,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1417,7 +1073,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# Copyright (C) 2006-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1436,7 +1092,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1573,3 +1229,4 @@ m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) +m4_include([m4/pkg.m4]) diff --git a/external/opus-1.0.3/compile b/external/opusfile-0.11/compile similarity index 95% rename from external/opus-1.0.3/compile rename to external/opusfile-0.11/compile index 862a14e8..2ab71e4e 100755 --- a/external/opus-1.0.3/compile +++ b/external/opusfile-0.11/compile @@ -1,10 +1,9 @@ #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. -scriptversion=2012-03-05.13; # UTC +scriptversion=2016-01-11.22; # UTC -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free -# Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -113,6 +112,11 @@ func_cl_dashl () lib=$dir/$lib.lib break fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi done IFS=$save_IFS @@ -251,7 +255,8 @@ EOF echo "compile $scriptversion" exit $? ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac @@ -338,6 +343,6 @@ exit $ret # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/external/opus-1.0.3/config.guess b/external/opusfile-0.11/config.guess similarity index 80% rename from external/opus-1.0.3/config.guess rename to external/opusfile-0.11/config.guess index d622a44e..a7448442 100755 --- a/external/opus-1.0.3/config.guess +++ b/external/opusfile-0.11/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2017-08-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -22,19 +20,17 @@ timestamp='2012-02-10' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + me=`echo "$0" | sed -e 's,.*/,,'` @@ -54,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in @@ -153,19 +168,29 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. + # to ELF recently (or will in the future) and ABI. case "${UNAME_MACHINE_ARCH}" in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ @@ -182,6 +207,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in os=netbsd ;; esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need @@ -192,18 +224,26 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" + echo "${machine}-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -216,6 +256,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; + *:Redox:*:*) + echo ${UNAME_MACHINE}-unknown-redox + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -232,42 +278,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -302,7 +348,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -340,16 +386,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build - SUN_ARCH="i386" + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` @@ -374,7 +420,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} @@ -560,8 +606,9 @@ EOF else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi @@ -598,13 +645,13 @@ EOF sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi @@ -643,11 +690,11 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build @@ -660,12 +707,12 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} @@ -770,14 +817,14 @@ EOF echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -793,18 +840,22 @@ EOF UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -852,21 +903,21 @@ EOF exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -879,59 +930,60 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build @@ -950,54 +1002,69 @@ EOF #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1073,7 +1140,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1201,6 +1268,9 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; @@ -1219,6 +1289,9 @@ EOF SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1227,24 +1300,43 @@ EOF exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi @@ -1253,15 +1345,18 @@ EOF *:QNX:*:4*) echo i386-pc-qnx exit ;; - NEO-?:NONSTOP_KERNEL:*:*) + NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; - NSE-?:NONSTOP_KERNEL:*:*) + NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; - NSR-?:NONSTOP_KERNEL:*:*) + NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk${UNAME_RELEASE} + exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; @@ -1275,7 +1370,7 @@ EOF # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" @@ -1317,7 +1412,7 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos @@ -1328,174 +1423,25 @@ EOF x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi +esac cat >&2 < in order to provide the needed -information to handle your system. +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system. config.guess timestamp = $timestamp diff --git a/external/opusfile-0.10/config.h.in b/external/opusfile-0.11/config.h.in similarity index 96% rename from external/opusfile-0.10/config.h.in rename to external/opusfile-0.11/config.h.in index d5fb26de..b21ff14f 100644 --- a/external/opusfile-0.10/config.h.in +++ b/external/opusfile-0.11/config.h.in @@ -99,10 +99,8 @@ #endif -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif +/* Enable large inode numbers on Mac OS X 10.5. */ +#undef _DARWIN_USE_64_BIT_INODE /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS diff --git a/external/opus-1.0.3/config.sub b/external/opusfile-0.11/config.sub similarity index 89% rename from external/opus-1.0.3/config.sub rename to external/opusfile-0.11/config.sub index c894da45..932128b3 100755 --- a/external/opus-1.0.3/config.sub +++ b/external/opusfile-0.11/config.sub @@ -1,24 +1,18 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2017-04-02' -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . @@ -26,11 +20,12 @@ timestamp='2012-02-10' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -38,7 +33,7 @@ timestamp='2012-02-10' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -58,8 +53,7 @@ timestamp='2012-02-10' me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. @@ -73,9 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -123,9 +115,9 @@ esac maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` @@ -156,7 +148,7 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) + -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; @@ -225,6 +217,12 @@ case $os in -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; -lynx*) os=-lynxos ;; @@ -253,21 +251,25 @@ case $basic_machine in | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ | bfin \ - | c4x | clipper \ + | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ - | i370 | i860 | i960 | ia64 \ + | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ + | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -281,26 +283,30 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ - | nios | nios2 \ + | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or32 \ + | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ | pyramid \ + | riscv32 | riscv64 \ | rl78 | rx \ | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ @@ -308,6 +314,8 @@ case $basic_machine in | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | wasm32 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) @@ -322,7 +330,10 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; @@ -364,26 +375,29 @@ case $basic_machine in | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ + | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ + | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ + | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -397,28 +411,34 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ | pyramid-* \ + | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ @@ -426,6 +446,8 @@ case $basic_machine in | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ + | visium-* \ + | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -502,6 +524,9 @@ case $basic_machine in basic_machine=i386-pc os=-aros ;; + asmjs) + basic_machine=asmjs-unknown + ;; aux) basic_machine=m68k-apple os=-aux @@ -622,6 +647,14 @@ case $basic_machine in basic_machine=m68k-bull os=-sysv3 ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; ebmon29k) basic_machine=a29k-amd os=-ebmon @@ -763,6 +796,9 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; m68knommu) basic_machine=m68k-unknown os=-linux @@ -782,11 +818,15 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; - microblaze) + microblaze*) basic_machine=microblaze-xilinx ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; mingw32) - basic_machine=i386-pc + basic_machine=i686-pc os=-mingw32 ;; mingw32ce) @@ -814,6 +854,10 @@ case $basic_machine in basic_machine=powerpc-unknown os=-morphos ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; msdos) basic_machine=i386-pc os=-msdos @@ -822,7 +866,7 @@ case $basic_machine in basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) - basic_machine=i386-pc + basic_machine=i686-pc os=-msys ;; mvs) @@ -906,6 +950,9 @@ case $basic_machine in nsr-tandem) basic_machine=nsr-tandem ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf @@ -990,7 +1037,7 @@ case $basic_machine in ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - ppcle | powerpclittle | ppc-le | powerpc-little) + ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) @@ -998,9 +1045,9 @@ case $basic_machine in ;; ppc64) basic_machine=powerpc64-unknown ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) + ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) @@ -1013,7 +1060,11 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; - rdos) + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) basic_machine=i386-pc os=-rdos ;; @@ -1197,6 +1248,9 @@ case $basic_machine in basic_machine=a29k-wrs os=-vxworks ;; + wasm32) + basic_machine=wasm32-unknown + ;; w65*) basic_machine=w65-wdc os=-none @@ -1340,29 +1394,30 @@ case $os in -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ + | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1486,9 +1541,6 @@ case $os in -aros*) os=-aros ;; - -kaos*) - os=-kaos - ;; -zvmoe) os=-zvmoe ;; @@ -1497,6 +1549,8 @@ case $os in ;; -nacl*) ;; + -ios) + ;; -none) ;; *) @@ -1537,6 +1591,12 @@ case $basic_machine in c4x-* | tic4x-*) os=-coff ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; tic54x-*) os=-coff ;; @@ -1586,6 +1646,9 @@ case $basic_machine in sparc-* | *-sun) os=-sunos4.1.1 ;; + pru-*) + os=-elf + ;; *-be) os=-beos ;; diff --git a/external/opusfile-0.10/configure b/external/opusfile-0.11/configure similarity index 99% rename from external/opusfile-0.10/configure rename to external/opusfile-0.11/configure index bbd84e04..f4b37329 100755 --- a/external/opusfile-0.10/configure +++ b/external/opusfile-0.11/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for opusfile 0.10. +# Generated by GNU Autoconf 2.69 for opusfile 0.11. # # Report bugs to . # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='opusfile' PACKAGE_TARNAME='opusfile' -PACKAGE_VERSION='0.10' -PACKAGE_STRING='opusfile 0.10' +PACKAGE_VERSION='0.11' +PACKAGE_STRING='opusfile 0.11' PACKAGE_BUGREPORT='opus@xiph.org' PACKAGE_URL='' @@ -675,10 +675,6 @@ DUMPBIN LD FGREP SED -LIBTOOL -OBJDUMP -DLLTOOL -AS host_os host_vendor host_cpu @@ -687,6 +683,10 @@ build_os build_vendor build_cpu build +LIBTOOL +OBJDUMP +DLLTOOL +AS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE @@ -1354,7 +1354,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures opusfile 0.10 to adapt to many kinds of systems. +\`configure' configures opusfile 0.11 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1424,7 +1424,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of opusfile 0.10:";; + short | recursive ) echo "Configuration of opusfile 0.11:";; esac cat <<\_ACEOF @@ -1555,7 +1555,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -opusfile configure 0.10 +opusfile configure 0.11 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1737,8 +1737,8 @@ fi # ac_fn_c_try_run LINENO # ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack @@ -1899,7 +1899,7 @@ choke me #endif int -main () +main (void) { return $2 (); ; @@ -1924,7 +1924,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by opusfile $as_me 0.10, which was +It was created by opusfile $as_me 0.11, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2031,6 +2031,8 @@ done # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo @@ -2639,7 +2641,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -2779,7 +2781,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; @@ -2793,7 +2795,9 @@ ac_clean_files="$ac_clean_files conftest.out" # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then +if test "$cross_compiling" = maybe && test "x$build" != "x$host"; then + cross_compiling=yes +elif test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; @@ -2843,7 +2847,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -2894,7 +2898,7 @@ else /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -2935,7 +2939,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -2950,7 +2954,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -2966,7 +2970,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -3052,7 +3056,7 @@ int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, i int argc; char **argv; int -main () +main (void) { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; @@ -3110,7 +3114,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -3437,7 +3441,7 @@ else #include int -main () +main (void) { ; @@ -3507,7 +3511,7 @@ else #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int -main () +main (void) { int i; for (i = 0; i < 256; i++) @@ -3586,7 +3590,7 @@ else # define __EXTENSIONS__ 1 $ac_includes_default int -main () +main (void) { ; @@ -3644,7 +3648,7 @@ else && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -3690,7 +3694,7 @@ else && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -3714,7 +3718,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -3759,7 +3763,7 @@ else && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -3783,7 +3787,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -3812,6 +3816,8 @@ rm -rf conftest* fi +$as_echo "#define _DARWIN_USE_64_BIT_INODE 1" >>confdefs.h + fi @@ -4361,7 +4367,7 @@ fi # Define the identity of the package. PACKAGE='opusfile' - VERSION='0.10' + VERSION='0.11' # Some tools Automake needs. @@ -4596,6 +4602,30 @@ fi MAINT=$MAINTAINER_MODE_TRUE +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || @@ -4668,320 +4698,225 @@ IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -enable_win32_dll=yes +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AS="${ac_tool_prefix}as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' -fi -fi -AS=$ac_cv_prog_AS -if test -n "$AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 -$as_echo "$AS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' -fi -if test -z "$ac_cv_prog_AS"; then - ac_ct_AS=$AS - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AS"; then - ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AS="as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' -fi -fi -ac_ct_AS=$ac_cv_prog_ac_ct_AS -if test -n "$ac_ct_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 -$as_echo "$ac_ct_AS" >&6; } +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' fi - if test "x$ac_ct_AS" = x; then - AS="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; esac - AS=$ac_ct_AS - fi -else - AS="$ac_cv_prog_AS" -fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break done -IFS=$as_save_IFS + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + ac_cv_path_SED=$SED fi - fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac - OBJDUMP=$ac_ct_OBJDUMP + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else - OBJDUMP="$ac_cv_prog_OBJDUMP" + ac_cv_path_FGREP=$FGREP fi - ;; -esac - -test -z "$AS" && AS=as - - - - - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" -macro_version='2.4.6' -macro_revision='2.4.6' +test -z "$GREP" && GREP=grep @@ -4994,249 +4929,16 @@ macro_revision='2.4.6' -ltmain=$ac_aux_dir/ltmain.sh -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case $ECHO in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi @@ -6457,7 +6159,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -7404,7 +7106,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu /* end confdefs.h. */ int -main () +main (void) { ; @@ -7414,75 +7116,379 @@ _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else - lt_cv_cc_needs_belf=no + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test yes != "$lt_cv_cc_needs_belf"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS=$SAVE_CFLAGS - fi - ;; -*-*solaris*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*|x86_64-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD=${LD-ld}_sol2 - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 fi - rm -rf conftest* - ;; -esac +done + done +IFS=$as_save_IFS -need_locks=$enable_libtool_lock +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : +if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7491,7 +7497,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7501,10 +7507,10 @@ IFS=$as_save_IFS fi fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -7512,17 +7518,17 @@ fi fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7531,7 +7537,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7541,17 +7547,17 @@ IFS=$as_save_IFS fi fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" + if test "x$ac_ct_LIPO" = x; then + LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) @@ -7559,50 +7565,114 @@ yes:) $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + LIPO=$ac_ct_LIPO fi else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" + LIPO="$ac_cv_prog_LIPO" fi -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 fi - rm -f conftest* +done + done +IFS=$as_save_IFS + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test yes != "$lt_cv_path_mainfest_tool"; then - MANIFEST_TOOL=: +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi - - case $host_os in - rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : +if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7611,7 +7681,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7621,10 +7691,10 @@ IFS=$as_save_IFS fi fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -7632,17 +7702,17 @@ fi fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7651,7 +7721,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7659,134 +7729,263 @@ done done IFS=$as_save_IFS -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi done - done -IFS=$as_save_IFS -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi +# Set options +enable_win32_dll=yes - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : +if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7795,7 +7994,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7805,10 +8004,10 @@ IFS=$as_save_IFS fi fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -7816,17 +8015,17 @@ fi fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : +if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7835,7 +8034,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" + ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7845,17 +8044,17 @@ IFS=$as_save_IFS fi fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - if test "x$ac_ct_LIPO" = x; then - LIPO=":" + if test "x$ac_ct_AS" = x; then + AS="false" else case $cross_compiling:$ac_tool_warned in yes:) @@ -7863,22 +8062,22 @@ yes:) $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - LIPO=$ac_ct_LIPO + AS=$ac_ct_AS fi else - LIPO="$ac_cv_prog_LIPO" + AS="$ac_cv_prog_AS" fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : +if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7887,7 +8086,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7897,10 +8096,10 @@ IFS=$as_save_IFS fi fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -7908,17 +8107,17 @@ fi fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7927,7 +8126,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" + ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7937,17 +8136,17 @@ IFS=$as_save_IFS fi fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) @@ -7955,22 +8154,22 @@ yes:) $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - OTOOL=$ac_ct_OTOOL + DLLTOOL=$ac_ct_DLLTOOL fi else - OTOOL="$ac_cv_prog_OTOOL" + DLLTOOL="$ac_cv_prog_DLLTOOL" fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : +if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7979,7 +8178,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7989,10 +8188,10 @@ IFS=$as_save_IFS fi fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -8000,17 +8199,17 @@ fi fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -8019,7 +8218,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" + ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -8029,17 +8228,17 @@ IFS=$as_save_IFS fi fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) @@ -8047,23 +8246,28 @@ yes:) $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - OTOOL64=$ac_ct_OTOOL64 + OBJDUMP=$ac_ct_OBJDUMP fi else - OTOOL64="$ac_cv_prog_OTOOL64" + OBJDUMP="$ac_cv_prog_OBJDUMP" fi + ;; +esac +test -z "$AS" && AS=as +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$OBJDUMP" && OBJDUMP=objdump @@ -8071,208 +8275,6 @@ fi - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "$LT_MULTI_MODULE"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test 0 = "$_lt_result"; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - 10.[012][,.]*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test yes = "$lt_cv_apple_cc_single_mod"; then - _lt_dar_single_mod='$single_module' - fi - if test yes = "$lt_cv_ld_exported_symbols_list"; then - _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' - fi - if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -# func_munge_path_list VARIABLE PATH -# ----------------------------------- -# VARIABLE is name of variable containing _space_ separated list of -# directories to be munged by the contents of PATH, which is string -# having a format: -# "DIR[:DIR]:" -# string "DIR[ DIR]" will be prepended to VARIABLE -# ":DIR[:DIR]" -# string "DIR[ DIR]" will be appended to VARIABLE -# "DIRP[:DIRP]::[DIRA:]DIRA" -# string "DIRP[ DIRP]" will be prepended to VARIABLE and string -# "DIRA[ DIRA]" will be appended to VARIABLE -# "DIR[:DIR]" -# VARIABLE will be replaced by "DIR[ DIR]" -func_munge_path_list () -{ - case x$2 in - x) - ;; - *:) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" - ;; - x:*) - eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" - ;; - *::*) - eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" - eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" - ;; - *) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" - ;; - esac -} - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - - -# Set options - - - enable_dlopen=no @@ -10001,7 +10003,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -10054,7 +10056,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -11512,7 +11514,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -11969,7 +11971,7 @@ extern "C" #endif char dlopen (); int -main () +main (void) { return dlopen (); ; @@ -12030,7 +12032,7 @@ extern "C" #endif char shl_load (); int -main () +main (void) { return shl_load (); ; @@ -12073,7 +12075,7 @@ extern "C" #endif char dlopen (); int -main () +main (void) { return dlopen (); ; @@ -12112,7 +12114,7 @@ extern "C" #endif char dlopen (); int -main () +main (void) { return dlopen (); ; @@ -12151,7 +12153,7 @@ extern "C" #endif char dld_link (); int -main () +main (void) { return dld_link (); ; @@ -12579,7 +12581,6 @@ CC=$lt_save_CC # Only expand once: -#LT_INIT([win32-dll]) # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : @@ -12623,7 +12624,7 @@ AM_BACKSLASH='\' OP_LT_CURRENT=4 -OP_LT_REVISION=3 +OP_LT_REVISION=4 OP_LT_AGE=4 @@ -12821,7 +12822,7 @@ extern "C" #endif char ftime (); int -main () +main (void) { return ftime (); ; @@ -12993,8 +12994,8 @@ $as_echo "#define OP_ENABLE_HTTP 1" >>confdefs.h pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for URL_DEPS" >&5 -$as_echo_n "checking for URL_DEPS... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openssl" >&5 +$as_echo_n "checking for openssl... " >&6; } if test -n "$URL_DEPS_CFLAGS"; then pkg_cv_URL_DEPS_CFLAGS="$URL_DEPS_CFLAGS" @@ -13034,7 +13035,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -13061,7 +13062,7 @@ Alternatively, you may set the environment variables URL_DEPS_CFLAGS and URL_DEPS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} @@ -13096,8 +13097,8 @@ fi pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DEPS" >&5 -$as_echo_n "checking for DEPS... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ogg >= 1.3 opus >= 1.0.1" >&5 +$as_echo_n "checking for ogg >= 1.3 opus >= 1.0.1... " >&6; } if test -n "$DEPS_CFLAGS"; then pkg_cv_DEPS_CFLAGS="$DEPS_CFLAGS" @@ -13137,7 +13138,7 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -13164,7 +13165,7 @@ Alternatively, you may set the environment variables DEPS_CFLAGS and DEPS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} @@ -13233,7 +13234,7 @@ extern "C" #endif char lrintf (); int -main () +main (void) { return lrintf (); ; @@ -14116,7 +14117,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by opusfile $as_me 0.10, which was +This file was extended by opusfile $as_me 0.11, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -14182,7 +14183,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -opusfile config.status 0.10 +opusfile config.status 0.11 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -14311,11 +14312,11 @@ AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' @@ -15345,6 +15346,10 @@ available_tags='' # ### BEGIN LIBTOOL CONFIG +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + # Assembler program. AS=$lt_AS @@ -15354,10 +15359,6 @@ DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - # Whether or not to build shared libraries. build_libtool_libs=$enable_shared diff --git a/external/opusfile-0.10/configure.ac b/external/opusfile-0.11/configure.ac similarity index 98% rename from external/opusfile-0.10/configure.ac rename to external/opusfile-0.11/configure.ac index b8b52c8a..ba97f00c 100644 --- a/external/opusfile-0.10/configure.ac +++ b/external/opusfile-0.11/configure.ac @@ -21,10 +21,7 @@ AC_SYS_LARGEFILE AM_INIT_AUTOMAKE([1.11 foreign no-define dist-zip subdir-objects]) AM_MAINTAINER_MODE([enable]) - -AC_LIBTOOL_WIN32_DLL -AC_PROG_LIBTOOL -#LT_INIT([win32-dll]) +LT_INIT([win32-dll]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) @@ -37,7 +34,7 @@ dnl - interfaces added -> increment AGE dnl - interfaces removed -> AGE = 0 OP_LT_CURRENT=4 -OP_LT_REVISION=3 +OP_LT_REVISION=4 OP_LT_AGE=4 AC_SUBST(OP_LT_CURRENT) diff --git a/external/opus-1.0.3/depcomp b/external/opusfile-0.11/depcomp similarity index 59% rename from external/opus-1.0.3/depcomp rename to external/opusfile-0.11/depcomp index 25a39e6c..b39f98f9 100755 --- a/external/opus-1.0.3/depcomp +++ b/external/opusfile-0.11/depcomp @@ -1,10 +1,9 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2012-03-27.16; # UTC +scriptversion=2016-01-11.22; # UTC -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,9 +27,9 @@ scriptversion=2012-03-27.16; # UTC case $1 in '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] @@ -57,11 +56,65 @@ EOF ;; esac +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + # A tabulation character. tab=' ' # A newline character. nl=' ' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 @@ -75,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" +# Avoid interferences from the environment. +gccflag= dashmflag= + # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case @@ -86,32 +142,32 @@ if test "$depmode" = hp; then fi if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvisualcpp + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then - # This is just like msvc7 but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvc7 + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 fi if test "$depmode" = xlc; then - # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. - gccflag=-qmakedep=gcc,-MF - depmode=gcc + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc fi case "$depmode" in @@ -134,8 +190,7 @@ gcc3) done "$@" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -143,13 +198,17 @@ gcc3) ;; gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then @@ -157,15 +216,14 @@ gcc) fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. + # The second -e expression handles DOS-style file names with drive + # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. @@ -174,15 +232,15 @@ gcc) ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. - tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -200,8 +258,7 @@ sgi) "$@" -MDupdate "$tmpdepfile" fi stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -209,7 +266,6 @@ sgi) if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" - # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in @@ -217,19 +273,15 @@ sgi) # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr "$nl" ' ' >> "$depfile" + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" - # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" + make_dummy_depfile fi rm -f "$tmpdepfile" ;; @@ -247,9 +299,8 @@ aix) # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + set_dir_from "$object" + set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u @@ -262,9 +313,7 @@ aix) "$@" -M fi stat=$? - - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi @@ -273,65 +322,113 @@ aix) do test -f "$tmpdepfile" && break done - if test -f "$tmpdepfile"; then - # Each line is of the form 'foo.o: dependent.h'. - # Do two passes, one to just change these to - # '$object: dependent.h' and one to simply 'dependent.h:'. - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; -icc) - # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. - # However on - # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using '\': + # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... - # tcc 0.9.26 (FIXME still under development at the moment of writing) - # will emit a similar output, but also prepend the continuation lines - # with horizontal tabulation characters. - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" - # Each line is of the form 'foo.o: dependent.h', - # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to - # '$object: dependent.h' and one to simply 'dependent.h:'. - sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ - < "$tmpdepfile" > "$depfile" - sed ' - s/[ '"$tab"'][ '"$tab"']*/ /g - s/^ *// - s/ *\\*$// - s/^[^:]*: *// - /^$/d - /:$/d - s/$/ :/ - ' < "$tmpdepfile" >> "$depfile" + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -342,9 +439,8 @@ hp2) # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + set_dir_from "$object" + set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d @@ -355,8 +451,7 @@ hp2) "$@" +Maked fi stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi @@ -366,76 +461,61 @@ hp2) test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" else - echo "#dummy" > "$depfile" + make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in 'foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mechanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; msvc7) if test "$libtool" = yes; then @@ -446,8 +526,7 @@ msvc7) "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" - if test "$stat" = 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -473,6 +552,7 @@ $ { G p }' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; @@ -524,13 +604,14 @@ dashmstdout) # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | - sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" - tr ' ' "$nl" < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -583,10 +664,12 @@ makedepend) # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; @@ -622,10 +705,10 @@ cpp) esac done - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" @@ -657,15 +740,15 @@ msvisualcpp) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; + set fnord "$@" + shift + shift + ;; *) - set fnord "$@" "$arg" - shift - shift - ;; + set fnord "$@" "$arg" + shift + shift + ;; esac done "$@" -E 2>/dev/null | @@ -703,6 +786,6 @@ exit 0 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/external/opusfile-0.10/doc/Doxyfile.in b/external/opusfile-0.11/doc/Doxyfile.in similarity index 100% rename from external/opusfile-0.10/doc/Doxyfile.in rename to external/opusfile-0.11/doc/Doxyfile.in diff --git a/external/opusfile-0.10/doc/opus_logo.svg b/external/opusfile-0.11/doc/opus_logo.svg similarity index 100% rename from external/opusfile-0.10/doc/opus_logo.svg rename to external/opusfile-0.11/doc/opus_logo.svg diff --git a/external/opusfile-0.10/examples/opusfile_example.c b/external/opusfile-0.11/examples/opusfile_example.c similarity index 100% rename from external/opusfile-0.10/examples/opusfile_example.c rename to external/opusfile-0.11/examples/opusfile_example.c diff --git a/external/opusfile-0.10/examples/seeking_example.c b/external/opusfile-0.11/examples/seeking_example.c similarity index 100% rename from external/opusfile-0.10/examples/seeking_example.c rename to external/opusfile-0.11/examples/seeking_example.c diff --git a/external/opusfile-0.10/examples/win32utf8.c b/external/opusfile-0.11/examples/win32utf8.c similarity index 100% rename from external/opusfile-0.10/examples/win32utf8.c rename to external/opusfile-0.11/examples/win32utf8.c diff --git a/external/opusfile-0.10/examples/win32utf8.h b/external/opusfile-0.11/examples/win32utf8.h similarity index 100% rename from external/opusfile-0.10/examples/win32utf8.h rename to external/opusfile-0.11/examples/win32utf8.h diff --git a/external/opusfile-0.10/include/opusfile.h b/external/opusfile-0.11/include/opusfile.h similarity index 100% rename from external/opusfile-0.10/include/opusfile.h rename to external/opusfile-0.11/include/opusfile.h diff --git a/external/opus-1.0.3/install-sh b/external/opusfile-0.11/install-sh similarity index 58% rename from external/opus-1.0.3/install-sh rename to external/opusfile-0.11/install-sh index a9244eb0..0360b79e 100755 --- a/external/opus-1.0.3/install-sh +++ b/external/opusfile-0.11/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2011-01-19.21; # UTC +scriptversion=2016-01-11.22; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -35,25 +35,21 @@ scriptversion=2011-01-19.21; # UTC # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it +# 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. +tab=' ' nl=' ' -IFS=" "" $nl" +IFS=" $tab$nl" -# set DOITPROG to echo to test this script +# Set DOITPROG to "echo" to test this script. -# Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi +doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. @@ -68,17 +64,6 @@ mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - posix_mkdir= # Desired mode of installed file. @@ -97,7 +82,7 @@ dir_arg= dst_arg= copy_on_change=false -no_target_directory= +is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE @@ -137,46 +122,57 @@ while test $# -ne 0; do -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift;; + shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift;; + shift;; -s) stripcmd=$stripprog;; - -t) dst_arg=$2 - # Protect names problematic for `test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; - -T) no_target_directory=true;; + -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; - --) shift - break;; + --) shift + break;; - -*) echo "$0: invalid option: $1" >&2 - exit 1;; + -*) echo "$0: invalid option: $1" >&2 + exit 1;; *) break;; esac shift done +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. @@ -190,7 +186,7 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then fi shift # arg dst_arg=$arg - # Protect names problematic for `test' and other utilities. + # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac @@ -202,11 +198,20 @@ if test $# -eq 0; then echo "$0: no input file specified." >&2 exit 1 fi - # It's OK to call `install-sh -d' without argument. + # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 @@ -223,16 +228,16 @@ if test -z "$dir_arg"; then *[0-7]) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw='% 200' + u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw=,u+rw + u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac @@ -240,7 +245,7 @@ fi for src do - # Protect names problematic for `test' and other utilities. + # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac @@ -269,41 +274,15 @@ do # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - + dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi @@ -314,74 +293,74 @@ do if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; esac if $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else @@ -391,53 +370,51 @@ do # directory the slow way, step by step, checking for races as we go. case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; esac - eval "$initialize_posix_glob" - oIFS=$IFS IFS=/ - $posix_glob set -f + set -f set fnord $dstdir shift - $posix_glob set +f + set +f IFS=$oIFS prefixes= for d do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ done if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi fi fi @@ -472,15 +449,12 @@ do # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - + set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then @@ -493,24 +467,24 @@ do # to itself, or perhaps because mv is so ancient that it does not # support -f. { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 @@ -522,6 +496,6 @@ done # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/external/opusfile-0.10/ltmain.sh b/external/opusfile-0.11/ltmain.sh similarity index 100% rename from external/opusfile-0.10/ltmain.sh rename to external/opusfile-0.11/ltmain.sh diff --git a/external/opusfile-0.10/m4/attributes.m4 b/external/opusfile-0.11/m4/attributes.m4 similarity index 100% rename from external/opusfile-0.10/m4/attributes.m4 rename to external/opusfile-0.11/m4/attributes.m4 diff --git a/external/opusfile-0.10/m4/libtool.m4 b/external/opusfile-0.11/m4/libtool.m4 similarity index 100% rename from external/opusfile-0.10/m4/libtool.m4 rename to external/opusfile-0.11/m4/libtool.m4 diff --git a/external/opus-1.0.3/m4/ltoptions.m4 b/external/opusfile-0.11/m4/ltoptions.m4 similarity index 73% rename from external/opus-1.0.3/m4/ltoptions.m4 rename to external/opusfile-0.11/m4/ltoptions.m4 index 5d9acd8e..94b08297 100644 --- a/external/opus-1.0.3/m4/ltoptions.m4 +++ b/external/opusfile-0.11/m4/ltoptions.m4 @@ -1,14 +1,14 @@ # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. -# serial 7 ltoptions.m4 +# serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) @@ -29,7 +29,7 @@ m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl + [m4_warning([Unknown $1 option '$2'])])[]dnl ]) @@ -75,13 +75,15 @@ m4_if([$1],[LT_INIT],[ dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS @@ -112,7 +114,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) +put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -148,7 +150,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL], _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) +put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -157,9 +159,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], @@ -172,14 +174,14 @@ AC_ARG_ENABLE([shared], *) enable_shared=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) @@ -211,9 +213,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], @@ -226,14 +228,14 @@ AC_ARG_ENABLE([static], *) enable_static=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) @@ -265,9 +267,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], @@ -280,14 +282,14 @@ AC_ARG_ENABLE([fast-install], *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) @@ -304,14 +306,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) +the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) +the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -319,11 +321,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + # _LT_WITH_PIC([MODE]) # -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], @@ -334,19 +389,17 @@ m4_define([_LT_WITH_PIC], *) pic_mode=default # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC @@ -359,7 +412,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) +put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: diff --git a/external/opus-1.0.3/m4/ltsugar.m4 b/external/opusfile-0.11/m4/ltsugar.m4 similarity index 95% rename from external/opus-1.0.3/m4/ltsugar.m4 rename to external/opusfile-0.11/m4/ltsugar.m4 index 9000a057..48bc9344 100644 --- a/external/opus-1.0.3/m4/ltsugar.m4 +++ b/external/opusfile-0.11/m4/ltsugar.m4 @@ -1,6 +1,7 @@ # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives @@ -33,7 +34,7 @@ m4_define([_lt_join], # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. +# Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], @@ -44,7 +45,7 @@ m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different diff --git a/external/opus-1.0.3/m4/ltversion.m4 b/external/opusfile-0.11/m4/ltversion.m4 similarity index 68% rename from external/opus-1.0.3/m4/ltversion.m4 rename to external/opusfile-0.11/m4/ltversion.m4 index 07a8602d..fa04b52a 100644 --- a/external/opus-1.0.3/m4/ltversion.m4 +++ b/external/opusfile-0.11/m4/ltversion.m4 @@ -1,6 +1,6 @@ # ltversion.m4 -- version numbers -*- Autoconf -*- # -# Copyright (C) 2004 Free Software Foundation, Inc. +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives @@ -9,15 +9,15 @@ # @configure_input@ -# serial 3337 ltversion.m4 +# serial 4179 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4.2]) -m4_define([LT_PACKAGE_REVISION], [1.3337]) +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.2' -macro_revision='1.3337' +[macro_version='2.4.6' +macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) diff --git a/external/opus-1.0.3/m4/lt~obsolete.m4 b/external/opusfile-0.11/m4/lt~obsolete.m4 similarity index 98% rename from external/opus-1.0.3/m4/lt~obsolete.m4 rename to external/opusfile-0.11/m4/lt~obsolete.m4 index c573da90..c6b26f88 100644 --- a/external/opus-1.0.3/m4/lt~obsolete.m4 +++ b/external/opusfile-0.11/m4/lt~obsolete.m4 @@ -1,6 +1,7 @@ # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives @@ -11,7 +12,7 @@ # These exist entirely to fool aclocal when bootstrapping libtool. # -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # @@ -25,7 +26,7 @@ # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until diff --git a/external/opusfile-0.11/m4/pkg.m4 b/external/opusfile-0.11/m4/pkg.m4 new file mode 100644 index 00000000..13a88901 --- /dev/null +++ b/external/opusfile-0.11/m4/pkg.m4 @@ -0,0 +1,275 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 12 (pkg-config-0.29.2) + +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.2]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $2]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR diff --git a/external/opusfile-0.11/missing b/external/opusfile-0.11/missing new file mode 100755 index 00000000..c6e37958 --- /dev/null +++ b/external/opusfile-0.11/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/external/opusfile-0.10/opusfile-uninstalled.pc.in b/external/opusfile-0.11/opusfile-uninstalled.pc.in similarity index 100% rename from external/opusfile-0.10/opusfile-uninstalled.pc.in rename to external/opusfile-0.11/opusfile-uninstalled.pc.in diff --git a/external/opusfile-0.10/opusfile.pc.in b/external/opusfile-0.11/opusfile.pc.in similarity index 100% rename from external/opusfile-0.10/opusfile.pc.in rename to external/opusfile-0.11/opusfile.pc.in diff --git a/external/opusfile-0.10/opusurl-uninstalled.pc.in b/external/opusfile-0.11/opusurl-uninstalled.pc.in similarity index 100% rename from external/opusfile-0.10/opusurl-uninstalled.pc.in rename to external/opusfile-0.11/opusurl-uninstalled.pc.in diff --git a/external/opusfile-0.10/opusurl.pc.in b/external/opusfile-0.11/opusurl.pc.in similarity index 100% rename from external/opusfile-0.10/opusurl.pc.in rename to external/opusfile-0.11/opusurl.pc.in diff --git a/external/opusfile-0.11/package_version b/external/opusfile-0.11/package_version new file mode 100644 index 00000000..a2545235 --- /dev/null +++ b/external/opusfile-0.11/package_version @@ -0,0 +1 @@ +PACKAGE_VERSION="0.11" diff --git a/external/opusfile-0.10/src/http.c b/external/opusfile-0.11/src/http.c similarity index 99% rename from external/opusfile-0.10/src/http.c rename to external/opusfile-0.11/src/http.c index acd0e8cd..8ba9b288 100644 --- a/external/opusfile-0.10/src/http.c +++ b/external/opusfile-0.11/src/http.c @@ -1517,8 +1517,8 @@ static long op_bio_retry_ctrl(BIO *_b,int _cmd,long _num,void *_ptr){ case BIO_CTRL_RESET: case BIO_C_RESET_READ_REQUEST:{ BIO_clear_retry_flags(_b); - /*Fall through.*/ } + /*Fall through.*/ case BIO_CTRL_EOF: case BIO_CTRL_SET: case BIO_CTRL_SET_CLOSE: diff --git a/external/opusfile-0.10/src/info.c b/external/opusfile-0.11/src/info.c similarity index 99% rename from external/opusfile-0.10/src/info.c rename to external/opusfile-0.11/src/info.c index 2425a56f..3a1a5bf7 100644 --- a/external/opusfile-0.10/src/info.c +++ b/external/opusfile-0.11/src/info.c @@ -116,7 +116,6 @@ static int op_tags_ensure_capacity(OpusTags *_tags,size_t _ncomments){ Trimming requires cleaning up the allocated strings in the old space, and is best handled separately if it's ever needed.*/ OP_ASSERT(_ncomments>=(size_t)cur_ncomments); - comment_lengths=_tags->comment_lengths; comment_lengths=(int *)_ogg_realloc(_tags->comment_lengths,size); if(OP_UNLIKELY(comment_lengths==NULL))return OP_EFAULT; if(_tags->comment_lengths==NULL){ @@ -454,8 +453,7 @@ int opus_tags_get_track_gain(const OpusTags *_tags,int *_gain_q8){ } static int op_is_jpeg(const unsigned char *_buf,size_t _buf_sz){ - return _buf_sz>=11&&memcmp(_buf,"\xFF\xD8\xFF\xE0",4)==0 - &&(_buf[4]<<8|_buf[5])>=16&&memcmp(_buf+6,"JFIF",5)==0; + return _buf_sz>=3&&memcmp(_buf,"\xFF\xD8\xFF",3)==0; } /*Tries to extract the width, height, bits per pixel, and palette size of a diff --git a/external/opusfile-0.10/src/internal.c b/external/opusfile-0.11/src/internal.c similarity index 100% rename from external/opusfile-0.10/src/internal.c rename to external/opusfile-0.11/src/internal.c diff --git a/external/opusfile-0.10/src/internal.h b/external/opusfile-0.11/src/internal.h similarity index 100% rename from external/opusfile-0.10/src/internal.h rename to external/opusfile-0.11/src/internal.h diff --git a/external/opusfile-0.10/src/opusfile.c b/external/opusfile-0.11/src/opusfile.c similarity index 100% rename from external/opusfile-0.10/src/opusfile.c rename to external/opusfile-0.11/src/opusfile.c diff --git a/external/opusfile-0.10/src/stream.c b/external/opusfile-0.11/src/stream.c similarity index 100% rename from external/opusfile-0.10/src/stream.c rename to external/opusfile-0.11/src/stream.c diff --git a/external/opusfile-0.10/src/wincerts.c b/external/opusfile-0.11/src/wincerts.c similarity index 100% rename from external/opusfile-0.10/src/wincerts.c rename to external/opusfile-0.11/src/wincerts.c diff --git a/external/opusfile-0.10/src/winerrno.h b/external/opusfile-0.11/src/winerrno.h similarity index 100% rename from external/opusfile-0.10/src/winerrno.h rename to external/opusfile-0.11/src/winerrno.h diff --git a/external/opusfile-0.10/win32/VS2015/opusfile.sln b/external/opusfile-0.11/win32/VS2015/opusfile.sln similarity index 100% rename from external/opusfile-0.10/win32/VS2015/opusfile.sln rename to external/opusfile-0.11/win32/VS2015/opusfile.sln diff --git a/external/opusfile-0.10/win32/VS2015/opusfile.vcxproj b/external/opusfile-0.11/win32/VS2015/opusfile.vcxproj similarity index 100% rename from external/opusfile-0.10/win32/VS2015/opusfile.vcxproj rename to external/opusfile-0.11/win32/VS2015/opusfile.vcxproj diff --git a/external/opusfile-0.10/win32/VS2015/opusfile.vcxproj.filters b/external/opusfile-0.11/win32/VS2015/opusfile.vcxproj.filters similarity index 100% rename from external/opusfile-0.10/win32/VS2015/opusfile.vcxproj.filters rename to external/opusfile-0.11/win32/VS2015/opusfile.vcxproj.filters diff --git a/external/opusfile-0.10/win32/VS2015/opusfile_example.vcxproj b/external/opusfile-0.11/win32/VS2015/opusfile_example.vcxproj similarity index 100% rename from external/opusfile-0.10/win32/VS2015/opusfile_example.vcxproj rename to external/opusfile-0.11/win32/VS2015/opusfile_example.vcxproj diff --git a/external/opusfile-0.10/win32/VS2015/opusfile_example.vcxproj.filters b/external/opusfile-0.11/win32/VS2015/opusfile_example.vcxproj.filters similarity index 100% rename from external/opusfile-0.10/win32/VS2015/opusfile_example.vcxproj.filters rename to external/opusfile-0.11/win32/VS2015/opusfile_example.vcxproj.filters diff --git a/external/opusfile-0.10/win32/VS2015/seeking_example.vcxproj b/external/opusfile-0.11/win32/VS2015/seeking_example.vcxproj similarity index 100% rename from external/opusfile-0.10/win32/VS2015/seeking_example.vcxproj rename to external/opusfile-0.11/win32/VS2015/seeking_example.vcxproj diff --git a/external/opusfile-0.10/win32/VS2015/seeking_example.vcxproj.filters b/external/opusfile-0.11/win32/VS2015/seeking_example.vcxproj.filters similarity index 100% rename from external/opusfile-0.10/win32/VS2015/seeking_example.vcxproj.filters rename to external/opusfile-0.11/win32/VS2015/seeking_example.vcxproj.filters